Iteratorlar bilan tanishish
Iteratorlar — ro'yxatlar, kortejlar va h.k. kabi kolleksiyalar bo'ylab aylanib chiquvchi metodlar. Iterator metodidan foydalanib, biz obyekt bo'ylab aylanib chiqishimiz va uning elementlarini qaytarishimiz mumkin.
Texnik jihatdan, Python iterator obyekti ikkita maxsus metodni amalga oshirishi shart: __iter__() va __next__(), ular birgalikda iterator protokoli deb ataladi.
Pythonda, ketma-ketlikdagi keyingi elementni qaytarish uchun next() funksiyasidan foydalanishimiz mumkin.
Keling, bir misolni ko'ramiz,
# ro'yxatni aniqlash
my_list = [4, 7, 0]
# ro'yxatdan iterator yaratish
iterator = iter(my_list)
# iteratorning birinchi elementini olish
print(next(iterator)) # 4 ni chop etadi
# iteratorning ikkinchi elementini olish
print(next(iterator)) # 7 ni chop etadi
# iteratorning uchinchi elementini olish
print(next(iterator)) # 0 ni chop etadi
Natija
4
7
0
Bu yerda, avval biz iter() metodi yordamida ro'yxatdan iterator yaratdik. Va keyin iteratorning elementlarini ketma-ket tartibda olish uchun next() funksiyasidan foydalandik.
Oxiriga yetganimizda va qaytariladigan boshqa ma'lumot qolmaganda, biz StopIteration xatoligini olamiz.
Avtomatik aylanib chiqishning yanada nafis usuli — for siklidan foydalanish. Masalan,
# ro'yxatni aniqlash
my_list = [4, 7, 0]
for element in my_list:
print(element)
Natija
4
7
0
Pythonda for sikli ro'yxat, kortej yoki satr kabi elementlar ketma-ketligi bo'ylab aylanib chiqish uchun ishlatiladi.
for siklini iterator bilan ishlatganimizda, sikl iterator tugaguncha uning elementlari bo'ylab avtomatik aylanib chiqadi.
Mana for sikli iterator bilan qanday ishlashiga misol,
# integerlar ro'yxatini yaratish
my_list = [1, 2, 3, 4, 5]
# ro'yxatdan iterator yaratish
iterator = iter(my_list)
# iteratorning elementlari bo'ylab aylanib chiqish
for element in iterator:
# Har bir elementni chop etish
print(element)
Bu misolda, for sikli iterator obyektining elementlari bo'ylab aylanib chiqadi.
Har bir iteratsiyada, sikl keyingi elementning qiymatini element o'zgaruvchisiga beradi, so'ngra chekingan kod blokini bajaradi.
Bu jarayon iterator tugaguncha davom etadi, shunda for sikli tugaydi.
Pythonda noldan iterator yaratish oson. Biz shunchaki __iter__() va __next__() metodlarini amalga oshirishimiz kerak,
__iter__() iteratorning o'zini qaytaradi. Agar kerak bo'lsa, ba'zi ishga tushirish (initialization) amallari bajarilishi mumkin.__next__() ketma-ketlikdagi keyingi elementni qaytarishi shart. Oxiriga yetganda, va keyingi chaqiruvlarda, u StopIterationni tashlashi shart.Keling, har bir iteratsiyada 2ning keyingi darajasini beradigan misolni ko'ramiz. Daraja ko'rsatkichi noldan foydalanuvchi belgilagan songacha boshlanadi,
class PowTwo:
"""2ning darajalarini
iterator sifatida amalga oshiruvchi klass"""
def __init__(self, max=0):
self.max = max
def __iter__(self):
self.n = 0
return self
def __next__(self):
if self.n <= self.max:
result = 2 ** self.n
self.n += 1
return result
else:
raise StopIteration
# obyekt yaratish
numbers = PowTwo(3)
# obyektdan iterable yaratish
i = iter(numbers)
# keyingi iterator elementiga o'tish uchun next'dan foydalanish
print(next(i)) # 1 ni chop etadi
print(next(i)) # 2 ni chop etadi
print(next(i)) # 4 ni chop etadi
print(next(i)) # 8 ni chop etadi
print(next(i)) # StopIteration xatoligini tashlaydi
Natija
1
2
4
8
Traceback (most recent call last):
File "<string>", line 32, in <module>
File "<string>", line 18, in __next__
StopIteration
Biz iterator klassimiz bo'ylab aylanib chiqish uchun for siklidan ham foydalanishimiz mumkin.
for i in PowTwo(3):
print(i)
Natija
1
2
4
8
Ob'ektga yo'naltirilgan dasturlash haqida ko'proq bilish uchun, Python OOP sahifasiga tashrif buyuring.
Cheksiz iterator — hech qachon tugamaydigan iterator, ya'ni u elementlarni cheksiz ishlab chiqarishda davom etadi.
Mana itertools modulidagi count() funksiyasi yordamida Pythonda cheksiz iterator qanday yaratilishiga misol,
from itertools import count
# 1dan boshlanadigan va har safar 1ga oshadigan cheksiz iterator yaratish
infinite_iterator = count(1)
# cheksiz iteratorning birinchi 5 ta elementini chop etish
for i in range(5):
print(next(infinite_iterator))
Natija
1
2
3
4
5
Bu yerda, biz 1dan boshlanadigan va har safar 1ga oshadigan cheksiz iterator yaratdik.
Va keyin for sikli va next() metodi yordamida cheksiz iteratorning birinchi 5 ta elementini chop etdik.