1)函数作为返回值,调用函数f时,才真正计算求和的结果:f()
2)请再注意一点,当我们调用lazy_sum()时,每次调用都会返回一个新的函数,即使传入相同的参数:
>>> f1 = lazy_sum(1, 3, 5, 7, 9)
>>> f2 = lazy_sum(1, 3, 5, 7, 9)
>>> f1==f2
False
f1()和f2()的调用结果互不影响。
3)返回闭包时牢记的一点就是:返回函数不要引用任何循环变量,或者后续会发生变化的变量。——解决方法是再创建一个函数,用该函数的参数绑定循环变量当前的值,无论该循环变量后续如何更改,已绑定到函数参数的值不变
举例
前
def count():
fs = []
for i in range(1, 4):
def f():
return i*i
fs.append(f) #注意到这里f是作为一个函数加入的
return fs
f1, f2, f3 = count()
>>> f1()
9
>>> f2()
9
>>> f3()
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
fs.append(f(i))传入的f(i)会首先被进行函数计算,然后f(i)的返回值,也就是函数g作为fs.append()的参数传入,所以最终传入的参数是函数g,仍是一个函数。最终fs.append()接收到的参数是f(i)的返回值
>>> f1, f2, f3 = count()
>>> f1()
1
>>> f2()
4
>>> f3()
9
网友评论