python三函数式编程
2017-04-20 本文已影响39人
summer_lz
-
函数概念
函数本身也可以赋值给变量,即:变量可以指向函数。函数名同时是变量
-
高阶函数
一个函数就可以接收另一个函数作为参数,该函数称为“高阶函数”
def add(x, y, f):
return f(x) + f(y)
x ==> -5
y ==> 6
f ==> abs
f(x) + f(y) ==> abs(-5) + abs(6) ==> 11
-
map_reduce_filter_sorted
- map:map(f,[x1,x2,x3])=[f(x1),f(x2),f(x3)]
>>> def f(x):
... return x * x
...
>>> map(f, [1, 2, 3, 4, 5, 6, 7, 8, 9])
[1, 4, 9, 16, 25, 36, 49, 64, 81]
- reduce(f, [x1, x2, x3, x4]) = f(f(f(x1, x2), x3), x4)
>>> def fn(x, y):
... return x * 10 + y
...
>>> def char2num(s):
... return {'0': 0, '1': 1, '2': 2, '3': 3, '4': 4, '5': 5, '6': 6, '7': 7, '8': 8, '9': 9}[s]
...
>>> reduce(fn, map(char2num, '13579'))
13579
- 整理成一个str2int的函数就是:
def str2int(s):
def fn(x, y):
return x * 10 + y
def char2num(s):
return {'0': 0, '1': 1, '2': 2, '3': 3, '4': 4, '5': 5, '6': 6, '7': 7, '8': 8, '9': 9}[s]
return reduce(fn, map(char2num, s))
- filter:和map()类似,filter()也接收一个函数和一个序列。和map()不同的时,filter()把传入的函数依次作用于每个元素,然后根据返回值是True还是False决定保留还是丢弃该元素。
#去除空的字符串
def not_empty(s):
return s and s.strip()
filter(not_empty, ['A', '', 'B', None, 'C', ' '])
# 结果: ['A', 'B', 'C']
- sorted:
#逆序输出
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]
-
函数作为返回值
不返回函数的结果,而是返回具体的函数,有关参数和变量都保存在返回的函数中,这种称为“闭包(Closure)”。返回的函数并没有立刻执行,而是直到调用了f()才执行,每次调用返回的函数都属于不同的对象。
def count():
fs = []
for i in range(1, 4):
def f():
return i*i
fs.append(f)
return fs
f1, f2, f3 = count()
print("f1:%s,f2:%s,f3:%s" % (f1(), f2(), f3()))
#结果 f1:9,f2:9,f3:9
返回函数不要引用任何循环变量,或者后续会发生变化的变量。
优化:再创建一个函数,用该函数的参数绑定循环变量当前的值,无论该循环变量后续如何更改,已绑定到函数参数的值不变。可以这样理解为上一个返回的函数参数仍为引用,并未直接返回值
def counts():
fs=[]
for i in range(1,4):
def f(j):
def g():
return j*j
return g
fs.append(f(i))
return fs
f4, f5, f6 = counts()
print("f1:%s,f2:%s,f3:%s" % (f4(), f5(), f6()))