gpt4 book ai didi

python - 怎么解释这个 “lambda in filter changes the result when calculating primes"

转载 作者:行者123 更新时间:2023-12-01 07:18:06 25 4
gpt4 key购买 nike

当我更改为在filter()中使用lambda时,代码的结果发生了变化。为什么?

计算素数的代码。您可以复制代码直接运行。

def get_odd_iter():
oddNum = 1
while True:
oddNum = oddNum + 2
yield oddNum

def not_divisible(n):
return lambda x: x%n>0


def prime_iter():
yield 2
odd_iter = get_odd_iter()

while True:
odd = next(odd_iter)
yield odd
# odd_iter = filter(not_divisible(odd), odd_iter) # <--(1)
odd_iter = filter((lambda x: x%odd>0) , odd_iter) # <--(2)


p = prime_iter()

print(next(p))
print(next(p))
print(next(p))
print(next(p))
print(next(p))
print(next(p))

当我使用(1)时,一切顺利。当我改为(2)时,结果中将出现9,这实际上不是素数。

最佳答案

你正在嵌套filter s,并带有 lambda ,所有这些都是 odd 上的闭包在调用范围内,它们都是懒惰的;在收到请求之前,它们都不会产生值。因此,当您重新分配odd时在下一次运行 while循环中,它们全部使用 odd值,不是 odd 的各个值从何时开始 lambda/filter包装已创建。

使用该函数,它们各自关闭于 odd在函数作用域内,它永远不会改变。使用 lambda 达到类似的效果s,捕获 odd 的现值作为默认参数:

    odd_iter = filter((lambda x, odd=odd: x%odd>0), odd_iter)
^^^^^^^ captured

这意味着 lambda 的副本不再引用闭包范围来查找 odd 的更新值,它只读取一次 odd 的当前值然后使用它自己的本地、不变的缓存值。

关于python - 怎么解释这个 “lambda in filter changes the result when calculating primes",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57846639/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com