您的位置:首页 > 编程语言 > Python开发

Python函数式编程

2016-08-23 11:47 141 查看
函数式编程就是一种抽象程度很高的编程范式,纯粹的函数式编程语言编写的函数没有变量,因此,任意一个函数,只要输入是确定的,输出就是确定的,这种纯函数我们称之为没有副作用。而允许使用变量的程序设计语言,由于函数内部的变量状态不确定,同样的输入,可能得到不同的输出,因此,这种函数是有副作用的。

函数式编程的一个特点就是,允许把函数本身作为参数传入另一个函数,还允许返回一个函数!

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
,返回值就是该表达式的结果。

装饰器

偏函数
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: