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



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

 # Совместимость с Python 2:
def next(self):
return self.__next__()
Чтобы сделать этот класс-итератор совместимым с Python 2, я внес в него 
два небольших изменения.
Во-первых, я добавил метод 
next
, который просто вызывает оригиналь-
ный метод 
__next__
и пересылает возвращаемое из него значение. По су-
ществу, тем самым создается псевдоним для существующей реализации 
метода 
__next__
для того, чтобы его нашел Python 2. Благодаря этому мы 


224 Глава 6 • Циклы и итерации
можем поддерживать обе версии Python, при этом сохраняя все фактиче-
ские детали реализации в одном месте.
И во-вторых, я модифицировал определение класса, и теперь он наследует 
от 
object
, чтобы обеспечить создание класса Python 2 в новом стиле. Это 
изменение не имеет никакого отношения к итераторам, что совершенно 
понятно, но, тем не менее, является хорошей практикой.
Ключевые выводы
‰
‰
Итераторы предоставляют объектам Python интерфейс последователь-
ности, который эффективен с точки зрения потребляемой оперативной 
памяти и который считается чисто питоновским. Любуйтесь красотой 
цикла 
for
...
in
!
‰
‰
Чтобы поддерживать итерации, в объекте должен быть реализован 
протокол итератора за счет обеспечения дандер-методов 
__iter__
и 
__next__.
‰
‰
Итераторы на основе класса являются лишь одним из способов на-
писания итерируемых объектов в Python. Следует также рассмотреть 
генераторы и выражения-генераторы.
6 .5 . Генераторы — это 
упрощенные итераторы
В разделе, посвященном итераторам, мы потратили довольно много 
времени на написание итератора на основе класса. Это было неплохой 
идеей с точки зрения обучения, но итератор на основе класса также 
продемонстрировал, что написание класса итератора требует большо-
го объема шаблонного кода. И если говорить по правде, то как «лени-
вому» разработчику мне не нравится утомительная и однообразная 
работа.
И все же итераторы очень полезны в Python. Они позволяют писать 
симпатичные циклы 
for…in
и помогают делать код более питоновским 


6 .5 . Генераторы — это упрощенные итераторы 225
и эффективным… если бы только не существовало более удобного способа 
писать эти итераторы изначально.
Сюрприз! Вот же он! В который раз Python нас выручает, предлагая еще 
немного синтаксического сахара, чтобы облегчить написание итераторов. 
В этом разделе вы увидите, как писать итераторы быстрее и с меньшим 
объемом кода, используя генераторы и ключевое слово 
yield
.
Бесконечные генераторы
Давайте начнем с того, что посмотрим еще раз на пример с классом 
Repeater
, который я уже использовал, чтобы познакомить вас с идеей 
итераторов. В нем реализована итеративная обработка бесконечной по-
следовательности значений на основе класса. Вот так этот класс выглядел 
в своей второй (упрощенной) версии:
class Repeater:
def __init__(self, value):
self.value = value
def __iter__(self):
return self
def __next__(self):
return self.value
Если вы думаете, что «для такого простого итератора тут довольно много 
исходного кода», то вы абсолютно правы. Некоторые части этого класса 
кажутся довольно стереотипными, как будто они переносились под ко-
пирку с одного итератора на основе класса на другой.
И вот где на сцену выходят генераторы Python. Если я перепишу этот 
класс итератора в качестве генератора, то он будет выглядеть так:
def repeater(value):
while True:
yield value
Мы только что перешли от семи строк кода к трем. Неплохо, правда? Как 
видите, генераторы похожи на обычные функции, но вместо инструкции 


226 Глава 6 • Циклы и итерации
возврата 
return
в них для передачи данных назад источнику вызова ис-
пользуется инструкция 
yield
.
Будет ли эта новая реализация генератора по-прежнему работать так 
же, как и наш итератор на основе класса? Давайте стряхнем пыль с теста 
в цикле 
for…in
, чтобы это выяснить:
>>> for x in repeater('Привет'):
... print(x) 

Download 6,94 Mb.

Do'stlaringiz bilan baham:
1   ...   64   65   66   67   68   69   70   71   ...   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