这是慕课网的学习记录和感想。
# 希望一次返回3个函数,分别计算1x1,2x2,3x3:
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())
返回的不是1,4,9而是9,9,9.
原因,fs.append(f),这里f并没有马上计算,而是做了延迟计算。fs本身是一个函数数组,在数组里保存的是函数而不是结果。等到print()的时候,i已经是3了。
修改思路:
1. 利用默认参数提前将i保存在函数内部。
2. 不延迟计算,也就是不采用函数式编程,让fs做一个简单的整数数组。不过这已经违背了原意要求返回函数,所以不推荐
# 希望一次返回3个函数,分别计算1x1,2x2,3x3:
def count():
fs = []
for i in range(1, 4):
def f(m=i): #在这里m成功将i的值保存起来
return m*m
fs.append(f)
return fs
f1, f2, f3 = count()
print(f1(), f2(), f3()) #在这里计算f1()的时候就是当时保存的1
方法二:(不符合原意,不推荐)
# 希望一次返回3个函数,分别计算1x1,2x2,3x3:
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) #三个整数而不是函数
P.S.貌似Java不允许这么鬼斧神工的操作。