Как мне распечатать выходные значения функций генератора?

#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