python三函数式编程

2017-04-20  本文已影响39人  summer_lz
  1. 函数概念

函数本身也可以赋值给变量,即:变量可以指向函数。函数名同时是变量

  1. 高阶函数

一个函数就可以接收另一个函数作为参数,该函数称为“高阶函数”

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
  1. map_reduce_filter_sorted
>>> 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]
>>> 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
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))
#去除空的字符串
def not_empty(s):
    return s and s.strip()
filter(not_empty, ['A', '', 'B', None, 'C', '  '])
# 结果: ['A', 'B', 'C']
#逆序输出
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]
  1. 函数作为返回值

不返回函数的结果,而是返回具体的函数,有关参数和变量都保存在返回的函数中,这种称为“闭包(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()))
上一篇下一篇

猜你喜欢

热点阅读