Бесконечный генератор питонов - PullRequest
2 голосов
/ 02 ноября 2019

Я работаю над Python и программирую не так давно. Так что вы можете посчитать мой вопрос глупым. Я рассматриваю генератор и пытаюсь генерировать «да», «нет» бесконечно, просто чтобы понять концепцию.

Я пробовал этот код, но каждый раз получал «да»

def yes_or_no():
    answer = ["yes","no"]
    i=0
    while True:
        if i >=2:
            i=0
        yield answer[i]
        i+=1

c=next(yes_or_no())

print(c)
print(c)
print(c)
print(c)

Ответы [ 3 ]

5 голосов
/ 02 ноября 2019

yes_no() производит генератор;Вы хотите вызывать next на одном и том же генераторе каждый раз, вместо того, чтобы снова и снова печатать один и тот же первый элемент.

c = yes_no()

print(next(c))
print(next(c))
# etc.

При этом не требуется отдельный счетчик;просто выведите yes, затем выведите no, затем повторите.

def yes_or_no():
    while True:
        yield "yes"
        yield "no"
0 голосов
/ 02 ноября 2019

В то время как ваша функция возвращает генератор, и другие заявили, что все, что вам нужно сделать, это перебрать его, используя цикл или вызывая следующий по очереди. Python предоставляет вам отличную библиотеку под названием itertools, которая делает именно это;это называется itertools.cycle. Это весь код, который вам необходим для репликации ваших функций:

def yes_no():
    return itertools.cycle(['yes', 'no'])

И, как говорили другие, генератор может быть перебран с помощью next или цикла.

>>> c = yes_no()
>>> next(c) 
'yes'
>>> next(c) 
'no'
...
0 голосов
/ 02 ноября 2019

Вам нужно инициализировать генератор и затем вызвать next для инициализированного объекта генератора:

c = yes_or_no()

Теперь вам нужно вызвать next для c:

print(next(c))
print(next(c))

В вашем текущем коде c=next(yes_or_no()):

  • yes_or_no() инициализирует генератор, и при вызове next он получит первый yes, и высохраняя yes как имя c

  • В следующих строках вы просто печатаете тот же yes, на который ссылается c при выполнении print(c)

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