python过滤器没有

2024-04-24 06:03:15 发布

您现在位置:Python中文网/ 问答频道 /正文

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

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函数中,如下所示:

^{pr2}$

我只能得到一个单数,不能得到素数。似乎filter函数不起作用。在

我能做什么?在


Tags: lambda函数算法true列表defnotfilter
2条回答

这里有一个更简单的程序来说明同样的问题。在

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

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

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

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

如果绝对必须直接使用lambda,则可以使用第二个参数,如下所示:

^{pr2}$

工作的lambda是lambda x, n=n: x%n != 0。如果您想在定义lambda时捕获n,显然需要这样做。否则lambda只在计算lambda时才查找变量名。在您的例子中,我认为这意味着在while循环的稍后迭代中锁定一个n值。在

相关问题 更多 >