generator python lesson

До загрузки: 30 сек.



Благодарим, что скачиваете у нас :)

Если, что - то:

  • Поделится ссылкой:
  • Документ найден в свободном доступе.
  • Загрузка документа - бесплатна.
  • Если нарушены ваши права, свяжитесь с нами.
Формат: pdf
Найдено: 29.09.2020
Добавлено: 30.09.2020
Размер: 0.06 Мб

Ге н ер ато р ы в я зы ке п р огр ам мир ова н и я P yth on
Однако ч то б ы н ап иса ть
ите р ато р ы в я п (я зы к п рогр ам мирова н ия) p yth on , п ри хо д ится и сп ол ьзо ва ть к л ассы - э т о
дост а то чн о с л ож но, д аж е т а ко й п рост о й и те р ато р , к о то р ы й б ы п ер еб и рал
k с л уча й н ы х з н аче н ий з а н ял о у н ас о ко л о 1 4
ст р ок. Э то д ост а то чн о м ного д ля т а ко й п рост о й з а д ачи . М ож ем л и м ы с д ел ать э т о к а к н ибуд ь п рощ е? Д а, м ож ем , в я п
pyth on с у щ ест в у ю т г е н ер ато р ы - э т о п о с у ти ф ун кц ии, в к о то р ы х в м ест о
return
м ы и сп ол ьзу е м
yield
и п ри э т о м
вм ест о т о го ч то б ы з н аче н ия в о зв р ащ ать , о н а б уд ет г е н ер и рова ть н ам с л ед ую щ ие з н аче н ия
In [7]:
from
random
import
random
class
RandomIterator
:


def
__init__
( self
, k ):

self
. k = k

self
. i = 0


def
__next__
( self
):

if
self
. i < self
. k :

self
. i +=
1

return
random
()

else
:

raise
StopIteration


def
__iter__
( self
):

return
self
Дава й те п ер еп иш ем н аш
RandomIterator
и сп ол ьзу я г е н ер ато р .
In [14]:
def
random_generator
( k ):

for
i in
range
( k ):

yield
random
()
gen
= random_generator
( 3 )
print
( type
( gen
))
In [15]:
for
i in
gen
:

print
( i )
Та ки м о б р азо м о тл и чи е г е н ер ато р а о т о б ы чн ой ф ун кц ии з а кл ю ча е тся в т о м ч то с п ом ощ ью к л ю че во го с л ова
yield
,
ко то р ы й м ы и сп ол ьзу е м в м ест о к л ю че во го с л ова
return
, м ы м ож ем в е р н уть з н аче н ия и з ф ун кц ий с р азу н еск о л ьк о р аз,
а с п раш ива ть к а ко е и м ен но з н аче н ие б уд ет с л ед ую щ им , б уд ем с п ом ощ ью ф ун кц ии
next()
Та к ж е в а ж но п он им ать ч то и н те р п рета то р с м отр и т с р азу н а в се т е л о ф ун кц ии и е сл и в ст р еча е т х о тя б ы о д ин р аз в т е л е
фун кц ии с л ово
yield
, т о п он им ае т ч то э т а ф ун кц ия я вл яе тся г е н ер ато р ом . А в ы зо в г е н ер ато р а в е д ет с е б я н е т а к ж е
ка к в ы зо в о б ы чн ой ф ун кц ии.

0.5514938090587456
0.5424979192728812
0.698063420081267

In [16]:
def
simple_gen
():

print
( "Checkpoint 1"
)

yield
1

print
( "Checkpoint 2"
)

yield
2

print
( "Checkpoint 3"
)

gen
= simple_gen
()
x = next
( gen
)
print
( x )
In [17]:
y = next
( gen
)
print
( y )
In [18]:
z = next
( gen
)
Ге н ер ато р ы с о хр ан яю т м ест о в ы дачи з н аче н ия, е сл и д ал ее н ет с л ова
yield
, т о в ы зы ва е тся и ск л ю че н ие
StopIteration
Та ки м о б р азо м г е н ер ато р ы - э т о у д об н ы й с и н та кси с д ля н ап иса н ия и те р ато р ов. В м ест о т о го ч то б ы с о зд ава ть к л асс и
об яза те л ьн ы е м ето д ы
__iter__
и
__next__
м ы н ап иса л и о д ну м ал ен ьк ую ф ун кц ию .
In [19]:
def
simple_gen
():

print
( "Checkpoint 1"
)

yield
1

print
( "Checkpoint 2"
)

return
"No more elements"

yield
2

print
( "Checkpoint 3"
)

gen
= simple_gen
()
x = next
( gen
)
In [20]:
print
( x )
In [21]:
y = next
( gen
)Checkpoint 1
1
Checkpoint 2
2
Checkpoint 3
---------------------------------------------------------------------------
StopIteration
Traceback (most recent call last)

in

----> 1
z
= next
( gen
)
StopIteration
:
Checkpoint 1
1
Checkpoint 2
---------------------------------------------------------------------------
StopIteration
Traceback (most recent call last)

in

----> 1
y
= next
( gen
)
StopIteration
: No more elements

При и сп ол ьзо ва н ии в г е н ер ато р е
return
, у н ас в ы зы ва е тся и ск л ю че н ие в к о то р ом п ер ед ае тся н аш
No m ore e le m en ts
ка к с о об щ ен ие и п рекр ащ ае тся р аб ота ф ун кц ии.
И то г
Та ки м о б р азо м г е н ер ато р ы в я зы ке p yth on т а ко й у д об н ы й с и н та кси с д ля н ап иса н ия и те р ато р ов, о н в е д ет с е б я п очти т а к
же к а к и ф ун кц ия, н о п ри э т о м с п ом ощ ью к о н кст р ук ц ии
yield
м ож ет в о зв р ащ ать с р азу н еск о л ьк о з н аче н ий и з
фун кц ии. В аж но п ом нить ч то и сп ол н ен ие т е л а ф ун кц ии п рои сх о д ит л и ш ь т о гд а, к о гд а м ы в ы зы ва е м
next
и п рои сх о д ит
он о т о д ного
yield
д о с л ед ую щ его , а е сл и с л ед ую щ ий
yield
о н н е н аш ел т о гд а о н з а ка н чи ва е т с в о е и сп ол н ен ие и
бр оса е т о ш ибку
StopIteration
.

Сообщить о нарушении / Abuse

Все документы на сайте взяты из открытых источников, которые размещаются пользователями. Приносим свои глубочайшие извинения, если Ваш документ был опубликован без Вашего на то согласия.