Зацикливание на генераторе

Я хочу перебрать генератор и выдать выходные данные генератора до StopIteration.

>>> list = [1,2,3,4,5,6]
>>> 
>>> def funct_one(list, number):
...     for item in list:
...         if item > number:
...             yield item
... 
>>> funct_one(list,0).__next__()
1
>>> 
>>> 
>>> def another_funct():
...     number = 0
...     while funct_one(list, number).__next__() != StopIteration:
...         yield funct_one(list, number).__next__()
...         number += 1
...     if funct_one(list, number).__next__() == StopIteration:
...         break
... 
  File "<stdin>", line 7
SyntaxError: 'break' outside loop
>>> for item in another_funct():
...     print(item)
... 
1
2
3
4
5
6
Traceback (most recent call last):
  File "<stdin>", line 3, in another_funct
StopIteration

The above exception was the direct cause of the following exception:

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
RuntimeError: generator raised StopIteration

Как мне распечатать только элементы, не получая сообщения об ошибке?

Почему нельзя просто использовать петлю for?

Jonathon Reinhart 26.10.2018 16:14

Фактически вы создаете много разных генераторов и берете только первое значение из каждого. Это очень необычный узор и, вероятно, означает, что ваш дизайн ошибочен.

Patrick Haugh 26.10.2018 16:15

@PatrickHaugh Для меня это пример исследования StopIteration, поэтому качество первого цикла for не имеет значения.

song0089 27.10.2018 02:40
0
3
58
1

Ответы 1

Я использовал строку except StopIteration:

def another_funct():
    number = 0
    while True:
        try:
            yield funct_one(list, number).__next__()
            number += 1
        except StopIteration:
            break

for item in another_funct():
    print(item)

Другие вопросы по теме