高阶函数不但能够接收函数作为参数,也能够将函数作为结果值返回。
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缩短代码量。