Python 3.x 蟒蛇3';带lambda函数的s滤波器及发生器 < P>请考虑这个Python 3代码,使用ErasoStes的无界筛选器生成素数: import itertools def primes(): numbers = itertools.count(2) while True: prime = next(numbers) yield prime numbers = filter(prime.__rmod__,numbers) prime_gen = primes() next(prime_gen) # Prints 2 next(prime_gen) # Prints 3 next(prime_gen) # Prints 5 next(prime_gen) # Prints 7

Python 3.x 蟒蛇3';带lambda函数的s滤波器及发生器 < P>请考虑这个Python 3代码,使用ErasoStes的无界筛选器生成素数: import itertools def primes(): numbers = itertools.count(2) while True: prime = next(numbers) yield prime numbers = filter(prime.__rmod__,numbers) prime_gen = primes() next(prime_gen) # Prints 2 next(prime_gen) # Prints 3 next(prime_gen) # Prints 5 next(prime_gen) # Prints 7,python-3.x,filter,lambda,generator,itertools,Python 3.x,Filter,Lambda,Generator,Itertools,到目前为止还不错。现在,让我们用lambda替换prime.\uu\rmod\uu函数,lambda做同样的事情: import itertools def primes(): numbers = itertools.count(2) while True: prime = next(numbers) yield prime numbers = filter(lambda n: n % prime,numbers) prime_g

到目前为止还不错。现在,让我们用lambda替换
prime.\uu\rmod\uu
函数,lambda做同样的事情:

import itertools
def primes():
    numbers = itertools.count(2)
    while True:
        prime = next(numbers)
        yield prime
        numbers = filter(lambda n: n % prime,numbers)

prime_gen = primes()
next(prime_gen)
# Prints 2
next(prime_gen)
# Prints 3
next(prime_gen)
# Prints 4
next(prime_gen)
# Prints 5

为什么lambda函数不与过滤器一起工作?lambda函数的作用域出现问题?

如R Nar所述,这是由于lambda函数的作用域造成的。由于
prime
是lambda函数的全局值,因此当
filter
尝试执行其工作时,在每个lambda中使用相同的
prime
值。解决方案是为每个lambda创建一个闭包,以使它们在创建时记住
prime
的值:

filter(lambda n, prime=prime: n % prime,numbers)
是的,请查看了解更多有关为什么会出现这种情况的信息。