zoukankan      html  css  js  c++  java
  • python函数式编程

    1.高阶函数

    将函数作为参数传入

    1)map/reduce

    map:传入两个参数,一个是函数,一个是迭代器,主要作用是将运算规则抽象化表达,如:

    >>> def f(x):
        return x * x
    
    >>> r = map(f,[1,2,3,4,5,6,7])
    >>> list(r)
    [1, 4, 9, 16, 25, 36, 49]

    reduce:传入两个参数,做累计效果

    将[1,3,5,6]变成1356

    >>> from functools import reduce
    >>> def fn(x,y):
        return x*10 + y
    
    >>> reduce(fn,[1,3,5,6])
    1356

    也可将str转换成int

    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))

    2)fliter:用于过滤序列

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

    3)sorted:排序操作,实现字符串、列表等的排序

    默认是从小到大排序

    >>> sorted([36,2,-34,5,9])
    [-34, 2, 5, 9, 36]

    也可以接受一个key,做自定义排序,此处按照绝对值大小进行排序

    >>> sorted([39,-37,-1,-39],key=abs)
    [-1, -37, 39, -39]

    2.返回函数

    返回的函数在其定义内部引入了局部变量,当一个函数返回了一个函数后,其内部的局部变量还被新函数引用

    如下所示:原因就在于返回的函数引用了变量i,但它并非立刻执行。等到3个函数都返回时,它们所引用的变量i已经变成了3,因此最终结果为9

    def count():
        fs = []
        for i in range(1, 4):
            def f():
                 return i*i
            fs.append(f)
        return fs
    
    f1, f2, f3 = count()
    >>> f1()
    9
    >>> f2()
    9
    >>> f3()
    9
    def count():
        def f(j):
            def g():
                return j*j
            return g
        fs = []
        for i in range(1, 4):
            fs.append(f(i)) # f(i)立刻被执行,因此i的当前值被传入f()
        return fs
    def count():
        def f(j):
            def g():
                return j*j
            return g
        fs = []
        for i in range(1, 4):
            fs.append(f(i)) # f(i)立刻被执行,因此i的当前值被传入f()
        return fs

    3.匿名函数

    def is_odd(n):
        return n % 2 == 1
    
    L = list(filter(is_odd, range(1, 20)))
    L = list(filter(lambda x: x % 2 == 1, range(1, 20)))

    4.装饰器函数

    完整的装饰器函数写法:

    import functools
    
    def log(func):
        @functools.wraps(func)
        def wrapper(*args, **kw):
            print('call %s():' % func.__name__)
            return func(*args, **kw)
        return wrapper
    
    import functools
    
    def log(func):
        @functools.wraps(func)
        def wrapper(*args, **kw):
            print('call %s():' % func.__name__)
            return func(*args, **kw)
        return wrapper

    5.偏函数

    简单总结functools.partial的作用就是,把一个函数的某些参数给固定住(也就是设置默认值),返回一个新的函数,调用这个新函数会更简单。

  • 相关阅读:
    unix文件权限
    jira部署,主机迁移,数据库迁移,jira
    c函数习记
    常用软介质下载
    Matlab interpgui
    LightOJ 1422
    【CODEFORCES】 A. Keyboard
    leetcode 230: Kth Smallest Element in a BST
    Vertica7 Native Connection Load Balance
    vlc模块间共享变量
  • 原文地址:https://www.cnblogs.com/quanmeng/p/11854783.html
Copyright © 2011-2022 走看看