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



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

StopIteration
Ага! Чтобы подать сигнал о том, что мы исчерпали все имеющиеся в ите-
раторе значения, он вызывает исключение 
StopIteration
.
Все верно: итераторы используют исключения для структуризации по-
тока управления. Чтобы подать сигнал о завершении итераций, итератор 
Python просто вызывает встроенное исключение 
StopIteration
.
Если я продолжу запрашивать значения из итератора, он продолжит вы-
зывать исключения 
StopIteration
, сигнализируя о том, что больше нет 
значений, доступных для итераций:
>>> next(iterator) 
StopIteration 
>>> next(iterator) 
StopIteration 
... 
Итераторы Python обычно не могут быть «обнулены» — как только они 
исчерпаны, им полагается вызывать исключение 
StopIteration
при каж-
дом вызове их функции 
next()
. Чтобы возобновить итерации, вам нужно 
запросить свежий объект-итератор при помощи функции 
iter()
.
Теперь мы знаем все, что нужно для написания нашего класса 
BoundedRepeater
, который прекращает итерации после заданного коли-
чества повторений:
class BoundedRepeater:
def __init__(self, value, max_repeats):
self.value = value
self.max_repeats = max_repeats


222 Глава 6 • Циклы и итерации
self.count = 0 
def __iter__(self):
return self 
def __next__(self):
if self.count >= self.max_repeats:
raise StopIteration
self.count += 1
return self.value
И он дает нам требуемый результат. Итерации прекращаются после ряда 
повторений, определенных в параметре 
max_repeats
:
>>> repeater = BoundedRepeater('Привет', 3) 
>>> for item in repeater:
print(item) 
Привет 
Привет 
Привет
Если переписать этот последний пример цикла 
for…in
, устранив часть 
синтаксического сахара, то в итоге мы получим следующий ниже рас-
ширенный фрагмент кода:
repeater = BoundedRepeater('Привет', 3) 
iterator = iter(repeater) 
while True:
try:
item = next(iterator)
except StopIteration:
break
print(item)
При каждом вызове функции 
next()
в этом цикле мы выполняем про-
верку на исключение 
StopIteration
и при необходимости выходим из 
цикла 
while
.
Возможность написать трехстрочный цикл 
for…in
вместо восьмистроч-
ного цикла 
while
представляет собой вполне хорошее улучшение. И в ре-
зультате программный код становится проще для восприятия и удобнее 
в сопровождении. И это еще одна причина, почему в Python итераторы 
являются таким мощным инструментом.


6 .4 . Красивые итераторы 223
Совместимость с Python 2 .x
Все примеры кода, которые я здесь показал, были написаны на Python 3. 
Существует одна небольшая, но важная разница между Python 2 
и Python 3 в том, что касается реализации итераторов на основе класса:
‰
‰
в Python 3 метод, который извлекает следующее значение из итератора, 
называется 
__next__
;
‰
‰
в Python 2 тот же самый метод называется 
next
(без символов под-
черкивания).
Эта разница в обозначении может привести к небольшой проблеме при 
попытке писать итераторы на основе класса, которые должны работать 
в обеих версиях Python. К счастью, существует простой подход, который 
можно применить, чтобы обойти эту разницу.
Ниже приведена обновленная версия класса 
InfiniteRepeater
, который 
будет работать как в Python 2, так и в Python 3:
class InfiniteRepeater(object):
def __init__(self, value):
self.value = value
def __iter__(self):
return self
def __next__(self):
return self.value 

Download 6,94 Mb.

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