函数作为返回值
def my_sum(*args):
def my_add():
s = 0
for n in args:
s = s + n
return s
return my_add
f = my_sum(*range(100)) #错误写法 f = my_sum(range(100))
print f()
f1 = lazy_sum(1, 3, 5, 7, 9)
f2 = lazy_sum(1, 3, 5, 7, 9)
print f1==f2
输出:
4950
False
- 调用mysum函数时,返回的是求和函数,但是已经包含了传给mysum函数的参数,故最后调用的时候不用再传参;
- my_sum函数参数是一个可变参数,而调用时的实参时range(10),是一个list,要将list变成可变参数,需在前面加上*;
- 两次调用该函数,即使传入的参数一模一样,返回的是一个新的函数,也不同;
闭包
示例1:
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()
- 返回函数在其定义内部引用了局部变量args,所以,当一个函数返回一个函数后,其内部的局部变量还被新函数引用;
- 返回的函数并没有立刻执行,而是等调用了之后才执行;
- fs是一个储存函数名的list,此时实际打印结果为:
9 9 9,原因在于返回的函数引用了变量i,但它并非立刻执行,等到3个函数都返回的时候,i已经变成了3
示例2
def count1():
fs = []
for i in range(1,4):
def f(j):
def g():
return j*j
return g
fs.append(f(i))
return fs
f11, f22, f33 = count1()
print f11(),f22(),f33()
- 这里再创建一个函数,将该函数的参数绑定循环变量当前的值,无论该循环变量如何更改,已经绑定的函数参数值不变