#python #generator
#python #генератор
Вопрос:
Я пытаюсь вывести результат функции генератора, который я получаю при использовании next().
Я определил функцию в соответствии с этим:
import itertools
sequence = ['a', 'b', 'c', 'd']
def next_player(seq):
yield itertools.cycle(seq)
Теперь, когда я вызываю указанную выше функцию и использую next() (например, next(next_player(sequence))), я получаю адрес памяти (например, <объект itertools.cycle в 0x7f9409fad440> ).
Как мне вместо этого напечатать фактическое значение в списке (например, «a», «b» и т. Д.). Я знаю, что могу выполнить итерацию по объекту генератора с помощью оператора ‘for’, но мне было любопытно, есть ли другой способ сделать это с помощью next () и т. Д.
Комментарии:
1. Вы имели в виду:
return itertools.cycle(seq)
?2. Вы хотите использовать
yield
, когда вам нужно возвращать несколько значений в цикле for. Например, это избавляет вас от необходимости добавлять в список. Здесь вам просто нужно вернуть один раз, поэтому вам нужноreturn
, что в данном случае совпадаетyield from
с тем, поскольку вы уже возвращаете генератор.
Ответ №1:
Вы хотите использовать yield from
:
import itertools
sequence = ['a', 'b', 'c', 'd']
def next_player(seq):
yield from itertools.cycle(seq)
g = next_player(sequence)
for _ in range(6):
print(next(g))
Вывод:
a
b
c
d
a
b
Для уточнения: yield from
можно ли связывать взаимодействия, в данном случае это то же самое, что писать:
def next_player(seq):
for x in itertools.cycle(seq):
yield x
но поскольку itertools.cycle
уже возвращает объект, подобный генератору, вы могли бы просто написать
def next_player(seq):
return itertools.cycle(seq)
Ответ №2:
Другой вариант, который у вас есть, — объявить цикл перед вашей функцией:
from itertools import cycle
sequence = ['a', 'b', 'c', 'd']
cycle_sequence = cycle(sequence)
def next_item():
return next(cycle_sequence)
А затем использовать его:
for _ in range(9):
n = next_item()
print(n)
будет печатать:
a
b
c
d
a
b
c
d
a