Discuss / Python / 没必要再嵌套一个函数,直接传参也可以

没必要再嵌套一个函数,直接传参也可以

Topic source

JeromeDeng

#1 Created at ... [Delete] [Delete and Lock User]
def pow_three():
    fs = []
    for i in range(1, 4):
        def f(i=i):
            return i*i
        fs.append(f)
    return fs

f1, f2, f3 = pow_three()
print("f1 = ", f1(), " f2 = ", f2(), " f3 = ", f3())

可否解释一下

def f(i=i):

为什么这句代码可以实现这个功能?

AlWays_MU

#3 Created at ... [Delete] [Delete and Lock User]

此i非彼i啊 你把

def f(i = i):
  return i * i

换成

def f(a = i):
  return a * a

一样

TeCHiScy

#4 Created at ... [Delete] [Delete and Lock User]

其实感觉这个只是一个小Trick 其实博主只是想说闭包在返回时没有执行,所以不能引用会变的循环变量等 你这边其实是定义了一个含有默认参数的函数,而默认参数的计算是在函数定义时候就已经计算完毕的 也就是说虽然你这里没有定义另外一个新的函数,但是原理是和博主最后那个例子一样的。因为已经计算完毕了默认参数的值,所以返回的实际上就是含有特定默认参数的f,那么自然能达到效果,但是这种方法其实不利于理解闭包。

少虾

#5 Created at ... [Delete] [Delete and Lock User]

=====>fs.append(f(i)) # f(i)立刻被执行,因此i的当前值被传入f()

这里f(i)本身就是执行f函数,如果你仍然返回f函数的引用f,即:fs.append(f),照样不会执行,程序没执行跟闭包没关系。

作用域不同


  • 1

Reply