试着把第三个改成了用lambda的, 感觉可读性太差
Topic source还有这样
f = lambda n: lambda:n * n
count = lambda : [f(i) for i in range(1,4)]
f1, f2, f3 = count()
print(f1())
print(f2())
print(f3())
count = lambda: [lambda i=i: i*i for i in range(1,4)]
f1, f2, f3 = count()
print(f1())
print(f2())
print(f3())
虽然可以这么写,但可读性太低
强烈谴责这里写成 i = i 啊!!!!!!!!这让新手非常非常迷惑好嘛!!!!
@灰_手 写的以下函数
lambda i=i: i*i for i in range (1,4)]
第一个i换成x你就明白了,实际上是以下函数:
def (x = i): # 这里的参数是个默认参数,i 是默认值
return x * x
这里将i作为默认值的意义在于,每一个for 循环,你都会调用并生成一个不同默认值的函数,这个默认值的生成是在调用这个函数之前的。这就是所谓的将 range中的每一个值绑定了在函数中。
而当你只写:
lambda : i = i
放在例子中实际上是以下函数:
def count():
fs = []
for i in range(1,4):
def f(x):
return x * x
fs.append(f)
return fs
当你调用count这个函数的时候,f通过x来导入i的值,这发生在调用f这个函数之后。执行的时候,i已经循环到了3,count这个函数就一次性的将i=3 赋予了所有f。
我在5月13号已经在另一层楼有过相关的解释,你自己不去看怪我咯。
def count():
return [lambda: i*i for i in range(1, 4)]
f1, f2, f3 = count()
print(f1()) # 9
print(f2()) # 9
print(f3()) # 9
def count2():
# 用i=i来绑定循环变量的传值
return [lambda i=i: i*i for i in range(1, 4)]
g1, g2, g3 = count2()
print(g1()) # 1
print(g2()) # 4
print(g3()) # 9
- 1
滚蛋吧黑眼圈