函数作为返回值
-----即函数可作为结果值返回
一般的求和函数:
def calc_sum(*args):
ax = 0
for n in args:
ax = ax + n
return ax
print calc_sum(1,5,6)
>>>12
若不需要立刻返回求和结果,而是返回求和的函数,则可:
def lazy_sum(*args):
def sum():
ax = 0
for n in args:
ax = ax + n
return ax
return sum
f1 = lazy_sum(1,5,6)
f2 = lazy_sum(1,5,6)
print f1,f1()#f1-->返回求和函数 f1()-->返回求和结果
print lazy_sum(1,5,6),lazy_sum(1,5,6)()#相当于f1, f1()
print f1 == f2#每次调用lazy_sum()都会返回一个新的函数,即使传入相同的参数,值也不相等,且f1()和f2()的调用结果互不影响
>>> <function sum at 0x7f3e0c7f55f0> 12
>>><function sum at 0x7f3e0c7f56e0> 12
>>>False
闭包:我们在函数lazy_sum()中定义了sum()函数,并且里面的sum()函数可以引用外面的lazy_zum()函数的参数和局部变量,当lazy_sum()返回函数sum()时,相关参数和变量都保存在返回的函数中,这种程序结构称为闭包
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,因为返回的函数没有立即执行,而是直到调用了f()才执行
>>>9 9 9
因此,返回闭包时要牢记:返回函数不要引用任何循环变量,或者后续会发生变化的变量,若一定要用循环变量,则可以再创建一个函数,用该函数的参数绑定循环变量当前的值,无论该循环变量后续如何更改,已绑定到函数参数的值不变
def count():
fs = []
for i in range(1,4):
def f(j):
def g():
return j * j
return g
fs.append(f(i))
return fs
f1, f2, f3 = count()
print f1(),f2(),f3()#此时输出结果为1 4 9
>>>1 4 9