Как решить ошибку StopIteration в Python? - PullRequest
0 голосов
/ 27 апреля 2018

Я только что прочитал кучу постов о том, как обрабатывать ошибку StopIteration в Python, у меня были проблемы с решением моего конкретного примера. Я просто хочу распечатать с 1 по 20 с моим кодом, но он выводит ошибку StopIteration. Мой код: (Я здесь новичок, поэтому, пожалуйста, не блокируйте меня.)

def simpleGeneratorFun(n):

    while n<20:
        yield (n)
        n=n+1
    # return [1,2,3]

x = simpleGeneratorFun(1)
while x.__next__() <20:
    print(x.__next__())
    if x.__next__()==10:
        break

Ответы [ 3 ]

0 голосов
/ 27 апреля 2018

Каждый раз, когда вы используете x.__next__(), он получает следующий полученный номер - вы не проверяете каждый полученный, и 10 пропускается - поэтому он продолжает работать после 20 и перерывов.

Исправлено:

def simpleGeneratorFun(n):

    while n<20:
        yield (n)
        n=n+1
    # return [1,2,3]

x = simpleGeneratorFun(1)
while True:
    try:
        val = next(x) # x.__next__() is "private", see @Aran-Frey comment 
        print(val)
        if val == 10:  
            break
    except StopIteration as e:
        print(e)
        break
0 голосов
/ 27 апреля 2018

Во-первых, в каждой итерации цикла вы продвигаете итератор 3 раза, делая 3 отдельных вызова для __next__(), так что if x.__next__()==10 может никогда не попасть, поскольку 10-й элемент мог быть использован ранее. То же самое с отсутствующим условием.

Во-вторых, в python обычно есть лучшие шаблоны, в которых вам не нужно напрямую звонить на next. Например, если у вас конечный итератор, используйте цикл for, чтобы автоматически прервать работу StopIteration:

x = simpleGeneratorFun(1)
for i in x:
    print i
0 голосов
/ 27 апреля 2018

Вы можете попробовать, но здесь проблема повторения.

x = simpleGeneratorFun(1)
print (x.__next__())
print (x.__next__())
print (x.__next__())
print (x.__next__())
print (x.__next__())
print (x.__next__())
...