热门搜索 :
考研考公
您的当前位置:首页正文

函数式编程(高阶函数 闭包 yield 装饰器 递归)

来源:东饰资讯网

函数式编程

是一种编程范式
将电脑运算视为数学上的函数计算,并且避免可变数据
函数式编程最重要的基础是lambda演算,而且lambda演算的函数可以接受函数当作输入和输出

python支持有限的函数式编程功能

  • filter(func, seq)
    调用一个布尔函数 func 来迭代遍历每个 seq 中的元素; 返回一个func 返回值为 true 的元素的序列。
  • __map(func, seq1[,seq2...]) __
    将函数 func ‘映射’到给定序列的每个元素,并用一个列表来提供返回值;如果 func 为 None, func 表现为一个身份函数,返回一个含有每个序列中元素集合的 n 个元组的列表。

  • reduce(func, seq[, init]) (折叠函数)
    将二元函数(两个输入值,一个输出值的函数)作用于 seq 序列的元素。它通过取出序列的头两个元素,将他们传入二元函数来获得一个单一的值。把这个值和序列的下一个元素传入二元函数来获得又一个值,然后继续直到整个序列的内容都遍历完毕以及最后的值会被计算出来为止,返回最后的值;如果初始值 init 给定,第一个比较会是 init 和第一个序列元素而不是序列的头两个元素

    注意传递的是函数名,不能加(),不是调用函数

    filter()示例

    def f1(x):
    if x>20:
    return True
    else:
    return False
    l1 = [1, 3, 40, 24, 15]
    filter(f1, l1)

    [40, 24]
    # map()示例
    map((lambda x: x * 2), l1)
    >>> [2, 6, 80, 48, 30]
    map(lambda x: x2, range(6))
    >>> [0, 2, 4, 6, 8, 10]
    [x
    2 for x in range(6)] # 使用列表推导对map()进行替换
    >>> [0, 2, 4, 6, 8, 10]
    #reduce()示例
    def f5(x, y):
    return x + y
    reduce(f5, l1)
    >>>83

闭包 Closure

def f1(x):
    # 在函数内部再定义一个函数,这个函数就被认为是闭包
    def f2(y):
        return y ** x
    # 返回闭包的结果
    return f2
f1(4)
>>> <function __main__.f2>
f3 = f1(3)
type(f3)
>>> function
f3(2)
>>> 8
f3(3)
>>> 27

生成器、yield

yield语句挂起该函数并向调用者发送回一个值,但是,保留足够的状态以使得函数能够从它离开的地方继续。当继续时,函数在上一个yield返回后立即继续执行。
函数中使用yield语句会返回一个生成器对象。

def genNum(n):
    i = 1
    while i <= n:
        yield i ** 2
        i += 1
g1 = genNum(20)
for i in g1:
    print i,
>>> 1 4 9 16 25 36 49 64 81 100 121 144 169 196 225 256 289 324 361 400
g2 = genNum(3)
g2.next()
>>> 1
g2.next()
>>> 4
g2.next()
>>> 9

装饰器

def deco(func):
    # 闭包的应用
    def wrapper():
        print 'Say something:'
        func()
        print 'No zuo no die'
    return wrapper

@deco
def show():
    print 'I am Yuan'

show()
>>>Say something:
I am Yuan
No zuo no die

#有参数的装饰器
def deco(func):
    def wrapper(x):
        print 'Say something:'
        func(x)
        print 'No zuo no die'
    return wrapper

@deco
def show(x):
    print x

show('Help')
>>> Say something:
Help
No zuo no die

递归

如果一个函数包括对自身的调用,该函数就是递归的。
递归需要边界条件用以退出递归。

#阶乘
def fac(n):
    if n <= 1:
        return 1
    else:
        return n * fac(n - 1)

fac(5)
>>> 120
Top