2015-11-30 3 views
0

Пожалуйста, подумайте Python 3 код для генерации простых чисел, используя неограниченное решето Эратосфена:фильтр Python3 с лямбда-функции и генератор

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 

До сих пор так хорошо. Теперь, давайте заменим функцию prime.__rmod__ с лямбда, который делает то же самое:

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 

Почему лямбда-функция не работает с фильтром? Что-то происходит в области лямбда-функции?

+1

да, посмотрите на [этот вопрос] (http://stackoverflow.com/questions/938429/scope-of-python-lambda-functions-and-their-parameters) для получения дополнительной информации о том, почему это так. –

ответ

0

As R Nar комментирует это из-за объема лямбда-функции. Поскольку prime является глобальным для лямбда-функции, то то же значение для prime используется в каждой лямбда, когда filter пытается выполнить свою работу. Решение создает замыкание для каждого лямбда, чтобы заставить их запомнить значение prime при их создании:

Смежные вопросы