Python函数式编程
2016-08-23 11:47
141 查看
函数式编程就是一种抽象程度很高的编程范式,纯粹的函数式编程语言编写的函数没有变量,因此,任意一个函数,只要输入是确定的,输出就是确定的,这种纯函数我们称之为没有副作用。而允许使用变量的程序设计语言,由于函数内部的变量状态不确定,同样的输入,可能得到不同的输出,因此,这种函数是有副作用的。
函数式编程的一个特点就是,允许把函数本身作为参数传入另一个函数,还允许返回一个函数!
Python对函数式编程提供部分支持。由于Python允许使用变量,因此,Python不是纯函数式编程语言。
[b]高阶函数:一个函数就可以接收另一个函数作为参数[/b]
变量可以指向函数,函数本身可以赋值给变量,函数名也是变量
如:
传入函数
下面是一些很有用的高阶函数使用方法:
1、Map/Reduce
之前听说过Map/reduce是在做大数据分析的时候,用到的Hadoop的map/reduce。主要的思想还是不变的:map就是对每个数据分开处理,而reduce则是将分开的数据合在一起
如:把用户输入的不规范的英文名字,变为首字母大写,其他小写的规范名字。输入:
In [10]: map(str.capitalize,['adam','lisa','bart'])
Out[10]: ['Adam', 'Lisa', 'Bart']
2)reduce把一个函数作用在一个序列[x1, x2, x3...]上,这个函数必须接收两个参数,reduce把结果继续和序列的下一个元素做累积计算
一般而言,map和reduce通常会一起使用
2、filter
请尝试用
3、 sorted
sorted()可以接受传入list,也可以接收一个比较函数来实现自定义的排序。
如:
返回函数:函数作为返回值
闭包:在函数的内部定义函数,在里面的函数可以调用外面的函数的局部变量,然后返回该内部函数。是为了读取函数内部的变量,这个在js中也有提到,一般而言,函数用完后就会释放掉,但是闭包函数会保存局部变量供内部函数使用不被释放掉
返回闭包时牢记的一点就是:返回函数不要引用任何循环变量,或者后续会发生变化的变量。
如:
要想使用迭代,将循环变量保存下来
匿名函数
关键字
匿名函数有个限制,就是只能有一个表达式,不用写
装饰器
偏函数
函数式编程的一个特点就是,允许把函数本身作为参数传入另一个函数,还允许返回一个函数!
Python对函数式编程提供部分支持。由于Python允许使用变量,因此,Python不是纯函数式编程语言。
[b]高阶函数:一个函数就可以接收另一个函数作为参数[/b]
变量可以指向函数,函数本身可以赋值给变量,函数名也是变量
如:
In [20]: abs Out[20]: <function abs> In [21]: abs(-20) Out[21]: 20 In [22]: x = abs In [23]: x(-2) Out[23]: 2
传入函数
In [24]: def sum(x,y): ....: return x+y In [26]: def de(x,y): ....: return x-y ....: In [27]: def cal(x,y,sum,de): ....: return sum(x,y)*de(x,y) ....: In [28]: cal(2,5,sum,de) Out[28]: -21
下面是一些很有用的高阶函数使用方法:
1、Map/Reduce
之前听说过Map/reduce是在做大数据分析的时候,用到的Hadoop的map/reduce。主要的思想还是不变的:map就是对每个数据分开处理,而reduce则是将分开的数据合在一起
1)map()函数接收两个参数,一个是函数,一个是序列,
map将传入的函数依次作用到序列的每个元素,并把结果作为新的list返回。
如:把用户输入的不规范的英文名字,变为首字母大写,其他小写的规范名字。输入:
['adam', 'LISA', 'barT'],输出:
['Adam', 'Lisa', 'Bart']。
In [10]: map(str.capitalize,['adam','lisa','bart'])
Out[10]: ['Adam', 'Lisa', 'Bart']
2)reduce把一个函数作用在一个序列[x1, x2, x3...]上,这个函数必须接收两个参数,reduce把结果继续和序列的下一个元素做累积计算
In [6]: def func(x,y): ...: return x+ y ...: In [2]: a = [1,2,3,4,5,6,7] In [7]: reduce(func,a) Out[7]: 28
一般而言,map和reduce通常会一起使用
2、filter
filter()函数用于过滤序列,
filter()接收一个函数和一个序列。
filter()把传入的函数依次作用于每个元素,然后根据返回值是
True还是
False决定保留还是丢弃该元素。
请尝试用
filter()获取1~100的素数。In [20]: def su(a):
....: i = 2 ....: while(i<a): ....: if a % i == 0: ....: return False ...: i = i + 1 ....: return True ....: In [21]: filter(su,range(1,101))
3、 sorted
sorted()可以接受传入list,也可以接收一个比较函数来实现自定义的排序。
如:
def reversed_cmp(x, y): if x > y: return -1 if x < y: return 1 return 0 >>> sorted([36, 5, 12, 9, 21], reversed_cmp) [36, 21, 12, 9, 5]
返回函数:函数作为返回值
闭包:在函数的内部定义函数,在里面的函数可以调用外面的函数的局部变量,然后返回该内部函数。是为了读取函数内部的变量,这个在js中也有提到,一般而言,函数用完后就会释放掉,但是闭包函数会保存局部变量供内部函数使用不被释放掉
返回闭包时牢记的一点就是:返回函数不要引用任何循环变量,或者后续会发生变化的变量。
如:
def count(): fs = [] for i in range(1, 4): def f(): return i*i fs.append(f) return fs f1, f2, f3 = count()
要想使用迭代,将循环变量保存下来
>>> def count(): ... fs = [] ... for i in range(1, 4): ... def f(j): ... def g(): ... return j*j ... return g ... fs.append(f(i)) ... return fs ... >>> f1, f2, f3 = count() >>> f1() 1 >>> f2() 4 >>> f3() 9
匿名函数
关键字
lambda表示匿名函数,冒号前面的
x表示函数参数。
匿名函数有个限制,就是只能有一个表达式,不用写
return,返回值就是该表达式的结果。
装饰器
偏函数
相关文章推荐
- Python函数式编程指南(三):迭代器(转载)
- Python函数式编程指南(四):生成器
- Python函数式编程指南(四):生成器
- Python函数式编程指南(二):函数
- Python函数式编程指南(一):概述
- Python函数式编程——学习笔记
- Python函数式编程指南(二):函数
- python函数式编程学习之map,reduce,filter,sorted
- Python函数式编程解决单词中字符频统计问题
- (三)python函数式编程
- python函数式编程之yield表达式形式
- Python函数式编程指南(一):概述(转载)
- Python函数式编程指南(三):迭代器(写得挺清楚,看着没那么累)
- Python函数式编程指南(四):生成器
- Python函数式编程指南(三):迭代器
- Python函数式编程指南(二):函数
- Python函数式编程——匿名函数lambda
- Python函数式编程指南(三):迭代器
- Python函数式编程
- [py]python函数式编程