今天在学习python的时候学到了返回函数,这里先说一下返回函数,一个求和函数,如果不需要马上调用,我们可以使用返回函数
def lazy_sum(*args):
def sum():
ax = 0
for n in args:
ax = ax + n
return ax
return sum
这样当我们调用 lazy_sum()
时,返回的并不是结果,还是一个求和函数,
>>> f = lazy_sum(1, 3, 5, 7, 9)
>>> f
<function lazy_sum.<locals>.sum at 0x101c6ed90>
当我们调用 f()
时,才真正计算求和结果,
看到这里是不是很熟悉,在这个例子中,我们在函数 lazy_sum
中又定义了函数 sum
,并且,内部函数 sum
可以引用外部函数lazy_sum
的参数和局部变量,当 lazy_sum
返回函数 sum
时,相关参数和变量都保存在返回的函数中,并且例子中的 f
并没有马上执行, 没错 ,这就是我们熟悉的闭包了
记住,返回闭包时牢记一点:返回函数不要引用任何循环变量,或者后续会发生变化的变量。
如果一定要引用循环变量怎么办?方法是再创建一个函数,用该函数的参数绑定循环变量当前的值(即创建一个新的作用域),无论该循环变量后续如何更改,已绑定到函数参数的值不变
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
闭包是语言的一种特性,再次提醒, 返回闭包时牢记一点:返回函数不要引用任何循环变量,或者后续会发生变化的变量。
网友评论