Я видел несколько примеров, где мы можем передать generator
в list
, как показано ниже.Python от генератора к списку
Первый пример:
print [2 * n for n in range(5)]
# same as the list comprehension above
print list(2 * n for n in range(5))
Второй пример:
def double(L):
for x in L:
yield x*2
# eggs will be a generator
eggs = double([1, 2, 3, 4, 5])
# the above is equivalent to ("generator comprehension"?)
eggs = (x*2 for x in [1, 2, 3, 4, 5])
# need to do this if you need a list
eggs = list(double([1, 2, 3, 4, 5]))
print eggs
# the above is equivalent to (list comprehension)
eggs = [x*2 for x in [1, 2, 3, 4, 5]]
print eggs
Мой вопрос, может все generators
быть переданы в list
(я потерпел неудачу в примере ниже):
def get_primes(number):
while True:
if is_prime(number):
number = yield number
number += 1
def is_prime(number):
if number > 1:
if number == 2:
return True
if number % 2 == 0:
return False
for current in range(3, int(math.sqrt(number) + 1), 2):
if number % current == 0:
return False
return True
return False
generator = get_primes(5)
print list(generator)
Выход: TypeError: unsupported operand type(s) for +=: 'NoneType' and 'int'
Проблема здесь: number = yield number
почему-то. Некоторое объяснение этому оценивается.
Что? 'number = yield number'? 'yield' ничего не возвращает. –
Я отредактирую его, я использую его для проверки send() раньше. –
Не редактируйте его, потому что эта строка - это то, почему вы получаете этот TypeError. – user2357112