gpt4 book ai didi

python 过滤器不起作用

转载 作者:太空狗 更新时间:2023-10-29 21:30:51 25 4
gpt4 key购买 nike

我有一个算法可以生成素数列表作为生成器:

def _odd_iter():
n=3
while True:
yield n
n=n+2

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

def primes():
yield 2
L=_odd_iter()
while True:
n=next(L)
yield n
L=filter(_not_divisible(n), L)

x=1
for t in primes():
print(t)
x=x+1
if x==10:
break

但如果我将 lambda 函数直接放入 filter 函数中,如下所示:

def primes():
yield 2
L=_odd_iter()
while True:
n=next(L)
yield n
L=filter(lambda x: x%n>0, L)

我只能得到一个奇数列表,而不是一个素数列表。 filter 函数似乎不起作用。

我能做什么?

最佳答案

这是一个更简单的程序,它说明了同样的问题。

adders = []
for i in range(4):
adders.append(lambda a: i + a)
print(adders[0](3))

虽然人们期望输出为 3,但实际输出为 6。这是因为 python 中的闭包会记住变量的名称和范围,而不是创建 lambda 时的值。由于 i 在使用 lambda 时已被修改,因此 lambda 使用 i 的最新值。

同样的事情发生在你的函数中。每当 n 被修改时,各种过滤器中的所有 lambda 函数也会被修改。因此,当迭代器到达 9 时,所有过滤器都是 7 的过滤因子,而不是 53.

因为在您的第一种方法中,每次调用 _not_divisible 都会创建一个新范围,因此该函数会按预期工作。

如果你绝对必须直接使用 lambda,你可以像这样使用第二个参数:

def primes():
yield 2
L=_odd_iter()
while True:
n=next(L)
yield n
L=filter(lambda x, n=n: x%n>0, L)

关于 python 过滤器不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38518240/

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