reduce(f,[x1,x2,x3,x4])=f(f(f(f(x1),x2),x3),x4)
def lazy_sum(*args):
def sum():
ax = 0
for n in args:
ax = ax + n
return ax
return sum
def count():
fs = []
for i in range(1, 4):
def f():
return i*i
fs.append(f)
return fs
f1, f2, f3 = count()
闭包返回的并不是计算结果,而是计算公式,这段代码里面,在函数内的fs里面存放的是ii,这时候返回的是[ii,ii,ii],当分别调用f1,f2,f3时,才会进行计算,而在count函数运算完成之后,i变为3,所以在运算f1,f2,f3时,变成[33,33,3*3],所以结果就都是9
lambda x:x*x
实际为:
def f(x):
return x*x
关键字lambda表示匿名函数,冒号前的x表示函数参数,且只能有一个表达式。
接收一个函数作为参数,并返回一个函数,返回的这个函数要有我们希望加入的功能且还有被装饰的函数的功能(直接执行被装饰的函数,或者将被装饰的函数作为返回值返回)
把@log放到now()函数的定义处,相当于执行了语句:
now = log(now)
由于log()函数是一个decorator,返回一个函数,原来的函数还在,只是现在的now变量指向了新的函数
函数也是对象,它有__name__等属性,但经decorator装饰之后的函数,它们的__name__已经从原的’now’变成了’wrapper’,所以,需要把原始函数的__name__等属性复制到wrapper()函数中,否则,有些依赖函数签名的代码执行就会出错,不需要编写wrapper.name = func.__name__这样的代码,Python内置的functools.wraps就是干这个事的。
functools.partial的作用就是,把一个函数的某些参数给固定住(也就是设置默认值),返回一个新的函数,调用这个新函数会更简单。
import functools
sorted2 = functools.partial(sorted,key=abs)
sorted2([1,-3,5,2,-4])
[1, 2, -3, -4, 5]
创建偏函数时,实际上可以接收函数对象、args和**kw这3个参数,当传入:
max2 = functools.partial(max, 10)
实际上会把10作为args的一部分自动加到左边,也就是:
max2(5, 6, 7)
相当于:
args = (10, 5, 6, 7)
max(*args)