Discuss / Python / 试着把第三个改成了用lambda的, 感觉可读性太差

试着把第三个改成了用lambda的, 感觉可读性太差

Topic source
def count():
    fs = []
    f = lambda n : lambda:n * n
    for i in range(1, 4):
        fs.append(f(i))
    return fs

f1, f2, f3 = count()
print(f1())
print(f2())
print(f3())

还有这样

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())

灰_手

#3 Created at ... [Delete] [Delete and Lock User]
count = lambda: [lambda i=i: i*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)]

lambda冒号前面的不是传入的参数吗, 这里传入i = i是什么意思

强烈谴责这里写成 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。

灰_手

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

看我下面的例子,已经有两种例子的对比

灰_手

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

我在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

我是解释给层主听的,为什么要去特地翻你的回复。。

而且你的答案只说用i=i绑定,层主疑惑的是为什么这么做就可以绑定循环变量,我是解释这个问题的。

count = lambda: [lambda a=b: a*a for b in range(1,4)]

这么写应该会比较容易看懂


  • 1

Reply