高阶函数

高阶函数

高阶函数满足上面至少一个特点。

  • 能接收若干个函数作为参数
  • 能返回一个函数
    import math
    def add(x, y, f):
        return f(x) + f(y)

    # 平方和
    print add(25, 9, math.sqrt)

map()函数

它接收一个函数 f 和一个list,并通过把函数 f 依次作用在 list 的每个元素上,得到一个新的 list 并返回。

def format_name(s):
    a=s.lower()
    return a[0].upper()+a[1:]
# 得到['Adam', 'Lisa', 'Bart']
print map(format_name, ['adam', 'LISA', 'barT'])

reduce()函数

它接收一个函数 f、一个list及一个可选的默认初始结果值,传入的函数f必须接收两个参数,reduce()对list的每个元素反复调用函数f,并返回最终结果值。

def prod(x, y):
    return x*y

#结果为2*4*5*7*12=3360
print reduce(prod, [2, 4, 5, 7, 12])

filter()函数

filter()函数接收一个函数 f 和一个list,这个函数f的作用是对每个元素进行判断,返回 True或 False,filter()根据判断结果自动过滤掉不符合条件的元素,返回由符合条件(函数返回true)元素组成的新list。

def is_not_empty(s):
    return s and len(s.strip()) > 0
    
# 输出['test', 'str', 'END']
filter(is_not_empty, ['test', None, '', 'str', '  ', 'END'])

返回函数

函数可以返回一个函数,被返回的函数要在里面定义,当作一个对象返回。

def calc_prod(lst):
    def fun():
        def prod(x,y):
            return x*y
        return reduce(prod,lst,1)
    return fun

#输出24 (4!=24)
f = calc_prod([1, 2, 3, 4])
print f()

闭包

在计算机科学中,闭包(Closure)是词法闭包(Lexical Closure)的简称,是引用了自由变量的函数。这个被引用的自由变量将和这个函数一同存在,即使已经离开了创造它的环境也不例外。
函数定义和函数表达式位于另一个函数的函数体内。

函数A返回内部定义的函数B,则B为闭包,调用A时传递的参数为自由变量。

闭包特点是返回的函数还引用了外层函数的局部变量,所以,要正确使用闭包,就要确保引用的局部变量在函数返回后不能变

def count():
    fs = []
    for i in range(1, 4):
        def product(a=i):
            return a*a
        fs.append(product)
    return fs

f1, f2, f3 = count()
#返回 1 4 9
print f1(), f2(), f3()

decorator

装饰器可简化代码,常用于:

  • 打印日志,@log
  • 检测性能,@performance
  • 数据库事务,@transaction
  • URL路由,@post('/login')

Python的decorator本质上是一个高阶函数,接收一个函数作为参数,并返回一个新函数。

import time

def performance(f):
    def fn(*args, **kw):
        t1 = time.time()
        r = f(*args, **kw)
        t2 = time.time()
        print 'call %s() in %fs' % (f.__name__, (t2 - t1))
        return r
    return fn

@performance
def factorial(n):
    return reduce(lambda x,y: x*y, range(1, n+1))

#结果:
#call factorial() in 0.009082s 
#3628800
print factorial(10)

functools.partial

functools.partial用于创建偏函数,即可把一个参数多的函数变为一个参数少的新函数,少的参数需要在创建时指定默认值,这样,新函数调用的难度就降低了。

int2 = functools.partial(int, base=2)

# int(value,base=2),按照二进制将value转为十进制数值

#结果:64
int2('1000000')
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章