генераторы, python, бесконечный цикл - PullRequest
0 голосов
/ 27 января 2020

Я пытаюсь составить список нечетных чисел, используя генератор (просто для лучшего понимания генераторов). Я написал следующий код, но он не останавливается! Пока я ожидаю, что код останавливается, когда выполняется условие i> n. Любая помощь приветствуется.

import sys
def odd(n):
    i=0    
    while True: 
        if i%2==0:
            continue
        yield i
        i+=1
        if i>n:
            return
# Here we build a generator 
g = odd(10)
while True:
    try:
        print(next(g),end=' ')
    except StopIteration:
        sys.exit()

Ответы [ 2 ]

2 голосов
/ 27 января 2020

Когда i является четным, вы не увеличиваете его, поэтому оно сохраняется даже для каждой последующей итерации l oop и никогда не становится больше n.

Вы хотите увеличить i четное это или нет.

def odd(n):
    i=0    
    while True: 
        if i%2 != 0:  # yield i only if it is odd
            yield i
        i+=1  # Increment i in either case
        if i>n:
            return
0 голосов
/ 27 января 2020

По моему мнению, в вашем коде есть две проблемы стиля, из-за которых трудно увидеть проблему:

  1. Использование continue. Простой оператор if поможет увидеть, какой код может не выполняться и какой код обязательно будет выполняться. continue в основном полезно, когда вы вложили if операторов, усложняющих ситуацию.

  2. Вы не используете условие while. Это предполагает, что while l oop придется выполнить хотя бы один раз. При написании al oop вы обычно должны учитывать, что произойдет, если l oop необходимо выполнить 0 раз. Что если кто-то передаст аргумент -1? Что если вы измените начальное значение i на 1, чтобы сохранить итерацию?


def odd(n):
    i = 0
    while i <= n:
        if i % 2:
            yield i
        i += 1
    # Automatically return and throw StopIteration.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...