Вопросы и задачки для подготовки к собеседованиям и прокачки навыков
Разместить рекламу: @tproger_sales_bot
Правила общения: https://tprg.ru/rules
Другие каналы: @tproger_channels
Другие наши проекты: https://tprg.ru/media
Post #3664
1.26K
PY @quiz_python
Showing posts older than #3665 · Back to latest

G = (х ** 2 for х in range (4))
next(G) is G # 0
next(G) is G # 1
next(G) is G # 4
next(G) is G # 9
next(G) is G # Остановка итерации
for num in (х ** 2 for х in range (4)): # Автоматически вызывает next ()
print (’%s, %s’ % (num, num / 2.0))
for, встроенные функции sum, map и sorted, списковые включения и другие итерационные контексты, в том числе встроенные функции any, all и list. Будучи итерируемыми объектами, генераторные выражения могут появляться в любом итерационном контексте подобного рода в точности как результат вызова генераторной функции.
"ааа,bbb,ссс".split(",") # ["ааа", "bbb", "ссс"]
(х + "\n" for х in ...)
["ааа", "bbb", "ссс"] и добавляет к каждой строке символ новой строки "\n":
а, b, с = (х + "\n" for х in "ааа,bbb,ссс".split(","))
ааа\n"bbb\n"ссс\n"
>>> (х ** 2 for х in range(4)) # Генераторное выражение создает итерируемый объект
... <generator object <genexpr> at 0x10250ab50>
>>> list(x ** 2 for х in range(4))
... [О, 1, 4, 9]

G = gen()
G, но код внутри функции gen() не начинает выполняться, пока не будет вызван next(G).next(G):
print(next(G)) # 0
next(G) в первый раз, генератор начинает выполнение с начала функции gen(). Внутри функции запускается цикл for и выполняется первая итерация, где i становится равным 0. Затем происходит yield i, что означает, что значение 0 возвращается, и генератор приостанавливается. Значение 0 выводится на экран.next(G):
print(next(G)) # None 1
next(G) во второй раз, генератор продолжает выполнение с той точки, где он был приостановлен (после yield). В этот момент выполнение доходит до X = yield i, и так как вызывается next(G) без передачи аргумента, X будет установлено в значение None. Затем срабатывает print(X), и выводится None.X становится равным 1.
G.send(значение). Затем код генератора возобновляет выполнение, и выражение yield в генераторе возвращает значение, переданное send. Если вызывается обычный метод G.__next_() (или его эквивалент next(G)) для продвижения вперед, тогда yield просто возвращает None.
>>> next(G) # Сначала должен вызываться next(), чтобы запустить генератор
... 0
>>> G.send(77)
... 77
... 1

def gen():
for i in range(10):
X = yield i
print(X)
G = gen()
print(next(G)) # Сначала должен вызываться next(), чтобы запустить генератор
