#返回函数
def lazy_sum(*args):
def sum():
sum = 0
for i in args:
sum += i
return sum
return sum
#当我们调用lazy_sum()时,返回的并不是求和结果,而是求和函数:
t = lazy_sum(1, 4, 5, 6)
#调用函数f时,才真正计算求和的结果:
print(t())
#注意:
f1 = lazy_sum(1, 4, 5, 6)
f2 = lazy_sum(1, 4, 5, 6)
print(f1 == f2) #注意这个输出结果为False,所以说这是两个函数,调用结果互不影响
def count():
L = []
for i in range(1, 4):
def f():
return i*i
L.append(f)
return L
f1, f2, f3 = count()
print(f1()) #9
print(f2()) #9
print(f3()) #9
#注意三个函数的输出结果都为9,而不是1, 4, 9
#我们分析一下原因,三个函数都引用了变量i,但是函数并没有立即执行,当我们调用的时候函数才开始执行,
#但是这个时候里面用到的变量已经改变了,所以输出结果是根据最后的变量i来计算的
#!!!因此我们一定要注意,当一个函数的返回值是另一个函数的时候,传入的参数不能使循环变量或者后续执行过程中会变化的量
#如果一定要使用循环变量可以重新定义一个函数,用该函数的参数绑定此时循环变量的数值,这样无论循环变量如何改变,
#已经绑定到函数参数的值并不会改变
def count():
def f(j):
def f2():
return j * j
return f2
L = []
for i in range(1, 4):
L.append(f(i))
return L
t = count()
t1, t2, t3 = count()
print(t1()) #1
print(t2()) #4
print(t3()) #9
#匿名函数
t = list(map(lambda x:x*x, [1, 2, 3, 4, 5, 6, 7, 8, 9]))
print(t)
def build(x, y):
return lambda x, y: x*10+y
t = build(5, 6)
print(t)
print(t(6, 7)) #这一行输出结果为67