Почему ошибка StopIteretion для вызова следующей функции после отображения списка? - PullRequest
0 голосов
/ 12 апреля 2020
def hundred_numbers():
  i=0
  while i<100:
    yield i
    i=i+1

print(hundred_numbers())
g=hundred_numbers()
print(next(g))
print(next(g))
print(next(g))
print(list(h))
print(next(g))

Ошибка:
Трассировка (последний вызов был последним): файл "main.py", строка 13, в печати (следующий (g)) Остановка изменения

1 Ответ

1 голос
/ 12 апреля 2020

Поскольку вы исчерпали свой генераторный объект, и у вас ничего не осталось, чтобы он уступил вашей программе.

def hundred_numbers():
    i=0
    while i<100:
        yield i
        i=i+1
g=hundred_numbers()
[next(g) for _ in range(10)] # [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
[next(g) for _ in range(10)] # [10, 11, 12, 13, 14, 15, 16, 17, 18, 19]

Видите шаблон? Теперь давайте возьмем остальное, т.е. 20-99

items = list(g)  # Could have done [next(g) for _ in range(20,100)]

элементов теперь будут оставшимися значениями от 20 до 99. Так что же произойдет в следующий раз? Он не может войти в while l oop, так что нечего сдавать. Это можно увидеть, если вы сделаете: list(g) снова. Это приведет к пустому списку, так как захватывать нечего.

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