python闭包问题

这是慕课网的学习记录和感想。

# 希望一次返回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)       #三个整数而不是函数

题目来源 :https://www.imooc.com/code/6059

P.S.貌似Java不允许这么鬼斧神工的操作。

猜你喜欢

转载自blog.csdn.net/sinat_26114733/article/details/79372838