美文网首页
python三函数式编程

python三函数式编程

作者: summer_lz | 来源:发表于2017-04-20 15:15 被阅读39次
    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
    • 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]
    
    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()))
    

    相关文章

      网友评论

          本文标题:python三函数式编程

          本文链接:https://www.haomeiwen.com/subject/krakzttx.html