美文网首页
Python函数式编程

Python函数式编程

作者: 云木杉 | 来源:发表于2018-12-27 17:29 被阅读0次

    高阶函数

    一个函数接收另一个函数做参数,这种函数称为高阶函数
    函数式编程就是指这种高度抽象的编程范式。

    def add(x,y,f):
        return f(x) + f(y)
    print(add(-10,-20,abs))
    

    map

    map()函数接收两个参数,一个是函数,一个是Iterable,map将传入的函数依次作用到序列的每一个元素,并把结果作为新的Iterator返回。

    def f(x):
        return x * x
    r = map(f,[1,2,3,4,5,6,7,8,9])
    print(list(r))
    

    reduce

    reduce把一个函数作用在一个序列[x1, x2, x3, ...]上,这个函数必须接收两个参数,reduce把结果继续和序列的下一个元素做累积计算

    # reduce(f, [x1, x2, x3, x4]) = f(f(f(x1, x2), x3), x4)
    from functools import reduce
    def add(x,y):
        return x * y
        
    i = reduce(add,[1,2,3,4,5])
    print(i)
    
    from functools import reduce
    def fn(x,y):
        return x * 10 + y
    
    def char2num(s):
        digits = {'0':0,'1':1,'2':2,'3':3,'4': 4, '5': 5, '6': 6, '7': 7, '8': 8, '9': 9}
        return digits[s]
    
    m = map(char2num,'13579')
    r = reduce(fn,m)
    print(r)
    

    看不懂

    from functools import reduce
    
    DIGITS = {'0': 0, '1': 1, '2': 2, '3': 3, '4': 4, '5': 5, '6': 6, '7': 7, '8': 8, '9': 9}
    
    def str2int(s):
        def fn(x, y):
            return x * 10 + y
        def char2num(s):
            return DIGITS[s]
        return reduce(fn, map(char2num, s))
    

    filter Python内建用于过滤序列

    filter()也接收一个函数和一个序列。与map不同的是 filter()把传入的函数依次作用于每个函数。

    filter()返回的是一个Iterator,也就是一个惰性序列,所以要强迫filter()完成

    def is_odd(n):
        return n % 2 == 1
    
    list(filter(is_odd, [1, 2, 4, 5, 6, 9, 10, 15]))
    # 结果: [1, 5, 9, 15]
    

    排序算法

    >>> sorted([36, 5, -12, 9, -21])
    [-21, -12, 5, 9, 36]
    
    >>> sorted([36, 5, -12, 9, -21], key=abs)
    [5, 9, -12, -21, 36]
    
    >>> sorted(['bob', 'about', 'Zoo', 'Credit'], key=str.lower, reverse=True)
    ['Zoo', 'Credit', 'bob', 'about']
    
    def is_odd(n):
        return n % 2 == 1
    
    l = list(filter(is_odd,[1,2,3,4,5,6,7,8,9]))
    print(l)
    

    返回函数

    def lazy_sum(*args):
        def sum():
            ax = 0
            for n in args:
                ax = n + ax
            return ax
        return sum
    f = lazy_sum(1,2,3);
    l = lazy_sum(1,2,3);
    print()
    #<function lazy_sum.<locals>.sum at 0x0000000002167510>
    print(f())
    # 6
    print(f == l)
    # False 每次都返回新的参数,调用结果互不影响
    

    匿名函数

    关键字lambda表示匿名函数,冒号前面的x表示函数参数。

    >>> f = lambda x: x * x
    >>> f
    <function <lambda> at 0x101c6ef28>
    >>> f(5)
    25
    
    def build(x,y):
        return lambda: x*x + y*y
    #b = build(5,5)
    #print(b)
    

    装饰器

    函数对象 abs._name,可以拿到函数的名字

    比如,在函数调用前后自动打印日志,但又不希望修改now()函数的定义,这种在代码运行期间动态增加功能的方式,称之为“装饰器”(Decorator)。
    本质上,decorator就是一个返回函数的高阶函数。

    def log(func):  #看不懂
        def wrapper(*args, **kw):
            print('call %s():' % func.__name__)
            return func(*args, **kw)
        return wrapper
    

    偏函数

    • functools.partial就是帮助我们创建一个偏函数的
    • functools.partial作用就是,把一个函数的某些参数给固定住(也就是设置默认值)
    #可以通过base进行进制转换
    >>> int('12345', base=8)
    5349
    >>> int('12345', 16)
    74565
    
    import functools
    int2 = functools.partial(int,base=2)
    #print(int2('1000000'))
    
    
    int2 = functools.partial(int, base=2)
    int2('10010')
    kw = { 'base': 2 }
    int('10010', **kw)
    
    
    max2 = functools.partial(max, 10)
    max2(5, 6, 7)
    args = (10, 5, 6, 7)
    max(*args)
    
    

    相关文章

      网友评论

          本文标题:Python函数式编程

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