- 函数作为返回值--把函数作为结果值返回
在函数lazy_sum
中又定义了函数sum
,并且,内部函数sum
可以引用外部函数lazy_sum
的参数和局部变量,当lazy_sum
返回函数sum
时,相关参数和变量都保存在返回的函数中,这种称为“闭包(Closure)”的程序结构拥有极大的威力
- 闭包
--注意到返回的函数在其定义内部引用了局部变量args
,所以,当一个函数返回了一个函数后,其内部的局部变量还被新函数引用,所以,闭包用起来简单,实现起来可不容易。
--另一个需要注意的问题是,如果一个函数的返回值仍然是一个函数或者函数的某种形式(比如说列表中的元素都是函数的形式等),那么只有当这个被返回的函数被调用时才会返回值。[https://blog.csdn.net/jiaowosiye/article/details/79272721];
def count():
fs=[]
for i in range(1,4):
def f():
return i*i
fs.append(f)
return fs
def count():
fs=[]
for i in range(1,4):
def f():
return i*i
fs.append(f())
return fs
原本使用的是fs.append(f) 原来列表中存的是函数,
现在列表中存放的是具体的值,因为f()就会调用上买你的函数,直接就会计算出来 return fs
另一种方法:
def count():
fs=[]
def f(i): #定义一个函数,返回值仍然是一个函数
def g():
return i*i
return g
for i in range(1,4):
fs.append(f(i))
#这里调用函数之后会保存这个参数的值,而不是再下一次循环中把上一次的参数值给冲掉
return fs
练习
利用闭包返回一个计数器函数,每次调用它返回递增整数:
def createCounter( ):
def f( ):
x = 0
while True:
x = x +1
yield x
#建立一个生成器
sum = f( )
#利用生成器来设计增数器
def counter( ):
return next( sum )
return counter