高阶函数不但能够接收函数作为参数,也能够将函数作为结果值返回。
def lazy_sum(*args):
def calc_sum():
ax = 0
for n in args:
ax = ax + n
return ax
return calc_sum
f = lazy_sum(1,2,3) #调用lazy_sum时返回的是calc_sum函数名,不会直接返回结果。
a = f()
print(a)
调用lazy_sum函数,每次调用都会返回一个新的函数,调用的结果互不影响。
f = lazy_sum(1,2,3,4)
j = lazy_sum(1,2,3,4)
if f == j:
print(True)
else:
print(False) #返回False
返回的函数引用的变量i并不会立即执行,等到三个函数都返回时,i已经变成了3。
返回闭包时牢记一点:返回函数不要引用任何循环变量,或者后续会发生变化的变量。
def count():
fs = []
for i in range(1, 4):
def f():
return i*i
fs.append(f)
return fs
f1, f2, f3 = count()
print(f1(),f2(),f3()) #返回的结果是 9,9,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
f1, f2, f3 = count()
print(f1(),f2(),f3()) #返回的结果是1,4,9
上述函数可用匿名函数lambda缩短代码量。