Делегирование другому генератору с использованием «возврата» приводит к пустому спискуPython

Программы на Python
Ответить
Anonymous
 Делегирование другому генератору с использованием «возврата» приводит к пустому списку

Сообщение Anonymous »

Я пытаюсь создать приведенный ниже генератор, чтобы иметь возможность устанавливать верхний предел возвращаемых чисел.

Вызов list(it.take while(lambda x: x < 100, get_primes())) возвращает список всех простых чисел до 100, как и ожидалось, но list(get_primes(100)) (который должен возвращать тот же список таким же образом) просто возвращает пустой list.

Очевидно, я мог бы включить if n и Candidate>=n: Break в цикл for, но меня больше всего интересует, почему конструкция if n: return не работает так, как я ожидал. Разве он не должен просто возвращать тот же итератор take while, который работает выше? Что я здесь упускаю?

import itertools as it

def get_primes(n=None):
"""
Generates primes to a max of n.

>>> list(get_primes(100))
[2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97]
"""
if n:
return it.takewhile(lambda x: x < n, get_primes())
composites = {}
yield 2
for candidate in it.count(3, 2):
prime_factor = composites.pop(candidate, None)
if prime_factor is None:
yield candidate
composites[candidate**2] = candidate
else:
composite = candidate + 2*prime_factor
while composite in composites:
composite += 2*prime_factor
composites[composite] = prime_factor


Подробнее здесь: https://stackoverflow.com/questions/262 ... empty-list
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Python»