Б41 Чистый Python. Тонкости программирования для профи. Спб.: Питер



Download 6,94 Mb.
Pdf ko'rish
bet69/80
Sana24.02.2022
Hajmi6,94 Mb.
#212875
1   ...   65   66   67   68   69   70   71   72   ...   80
Bog'liq
978544610803 Chisty Python Tonko

'Привет' 
'Привет' 
'Привет' 
'Привет' 
'Привет' 
...
Да! Мы по-прежнему без конца прокручиваем в цикле наши приветствия. 
Эта намного более короткая реализация генератора, по всей видимости, 
выполняется таким же образом, что и класс 
Repeater
. (Не забудьте нажать 
Ctrl+C
, если хотите выйти из бесконечного цикла в сеансе интерпретатора.)
Итак, каким же образом эти генераторы работают? Они похожи на нор-
мальные функции, но их поведение очень различается. Начнем с того, что 
вызов функции-генератора вообще не выполняет функцию. Он просто 
создает и возвращает объект-генератор:
>>> repeater('Эй') 

Программный код в функции-генератора исполняется только тогда, 
когда функция 
next()
вызывается с объектом-генератором в качестве 
аргумента:
>>> generator_obj = repeater('Эй') 
>>> next(generator_obj) 
'Эй'
Если вы еще раз прочитаете код функции 
repeater
, то увидите, что, судя 
по всему, ключевое слово 
yield
каким-то образом останавливает эту 
функцию-генератор посередине исполнения, а затем возобновляет ее на 
более позднем этапе:


6 .5 . Генераторы — это упрощенные итераторы 227
def repeater(value):
while True:
yield value
И это вполне подходящая ментальная модель того, что здесь происходит. 
Дело в том, что, когда инструкция 
return
вызывается внутри функции, 
она безвозвратно передает управление назад источнику вызова функции. 
Когда же вызывается инструкция 
yield
, она тоже передает управление 
назад источнику вызова функции — но она это делает лишь временно.
В отличие от инструкции 
return
, которая избавляется от локального 
состояния функции, инструкция 
yield
приостанавливает функцию и со-
храняет ее локальное состояние. На практике это означает, что локальные 
переменные и состояние исполнения функции-генератора лишь откла-
дываются в сторону и не выбрасываются полностью. Исполнение может 
быть возобновлено в любое время вызовом функции 
next()
с генератором 
в качестве аргумента:
>>> iterator = repeater('Привет') 
>>> next(iterator) 
'Привет'
>>> next(iterator) 
'Привет'
>>> next(iterator) 
'Привет'
Это делает генераторы полностью совместимыми с протоколом итератора. 
По этой причине мне нравится представлять их прежде всего как синтак-
сический сахар для реализации итераторов.
Вы убедитесь, что в отношении большинства типов итераторов написание 
функции-генератора будет проще, а восприятие легче, чем определение 
многословного итератора на основе класса.
Генераторы, которые прекращают генерацию
Этот раздел мы начали с того, что еще раз написали бесконечный генера-
тор. Сейчас вы, вероятно, задаетесь вопросом, как написать генератор, 
который через некоторое время прекращает порождать значения вместо 
того, чтобы без конца продолжать это делать.


228 Глава 6 • Циклы и итерации
Напомним, что в нашем итераторе на основе класса мы смогли подать 
сигнал об окончании итераций путем вызова исключения 
StopIteration
вручную. Поскольку генераторы полностью совместимы с итераторами 
на основе класса, за сценой будет по-прежнему происходить то же самое.
К счастью, на этот раз мы будем работать с более приятным интерфейсом. 
Генераторы прекращают порождать значения, как только поток управле-
ния возвращается из функции-генератора каким-либо иным способом, 
кроме инструкции 
yield
. Это означает, что вам больше вообще не нужно 
заботиться о вызове исключения 
StopIteration
!
Приведу пример:
def repeat_three_times(value):
yield value
yield value
yield value
Обратите внимание: эта функция-генератор не содержит никакого цикла. 
В действительности она проста как божий день и состоит всего из трех 
инструкций 
yield
. Если 
yield
временно приостанавливает выполнение 
функции и передает значение назад источнику вызова, то что произойдет, 
когда мы достигнем конца этого генератора? Давайте узнаем:
>>> for x in repeat_three_times('Всем привет'):
... print(x) 

Download 6,94 Mb.

Do'stlaringiz bilan baham:
1   ...   65   66   67   68   69   70   71   72   ...   80




Ma'lumotlar bazasi mualliflik huquqi bilan himoyalangan ©hozir.org 2024
ma'muriyatiga murojaat qiling

kiriting | ro'yxatdan o'tish
    Bosh sahifa
юртда тантана
Боғда битган
Бугун юртда
Эшитганлар жилманглар
Эшитмадим деманглар
битган бодомлар
Yangiariq tumani
qitish marakazi
Raqamli texnologiyalar
ilishida muhokamadan
tasdiqqa tavsiya
tavsiya etilgan
iqtisodiyot kafedrasi
steiermarkischen landesregierung
asarlaringizni yuboring
o'zingizning asarlaringizni
Iltimos faqat
faqat o'zingizning
steierm rkischen
landesregierung fachabteilung
rkischen landesregierung
hamshira loyihasi
loyihasi mavsum
faolyatining oqibatlari
asosiy adabiyotlar
fakulteti ahborot
ahborot havfsizligi
havfsizligi kafedrasi
fanidan bo’yicha
fakulteti iqtisodiyot
boshqaruv fakulteti
chiqarishda boshqaruv
ishlab chiqarishda
iqtisodiyot fakultet
multiservis tarmoqlari
fanidan asosiy
Uzbek fanidan
mavzulari potok
asosidagi multiservis
'aliyyil a'ziym
billahil 'aliyyil
illaa billahil
quvvata illaa
falah' deganida
Kompyuter savodxonligi
bo’yicha mustaqil
'alal falah'
Hayya 'alal
'alas soloh
Hayya 'alas
mavsum boyicha


yuklab olish