Python - Iteratorlar
Python Iteratorlari
Iterator - bu sanoqli miqdordagi qiymatlarni o'z ichiga olgan obyektdir.
Iterator - bu aylanib chiqiladigan obyekt bo'lib, ya'ni siz uning barcha qiymatlari bo'ylab o'tishingiz mumkin.
Texnik jihatdan, Python'da iterator __iter__() va __next__() metodlaridan iborat bo'lgan iterator protokolini amalga oshiradigan obyektdir.
Iterator va Aylantiriladigan obyektlar
Ro'yxatlar, tuplelar, lug'atlar va setlar hammasi aylantiriladigan obyektlardir. Ular iterator olishingiz mumkin bo'lgan aylantiriladigan konteynerlardir.
Bu obyektlarning hammasida iterator olish uchun ishlatiladigan iter() metodi mavjud:
Misol
Tuple'dan iterator qaytaring va har bir qiymatni chop eting:
mening_tuplem = ("olma", "banan", "gilos")
mening_iteratorim = iter(mening_tuplem)
print(next(mening_iteratorim))
print(next(mening_iteratorim))
print(next(mening_iteratorim))Hatto satrlar ham aylantiriladigan obyektlar bo'lib, iterator qaytara oladi:
Misol
Satrlar ham aylantiriladigan obyektlar bo'lib, belgilar ketma-ketligini o'z ichiga oladi:
mening_satim = "banan"
mening_iteratorim = iter(mening_satim)
print(next(mening_iteratorim))
print(next(mening_iteratorim))
print(next(mening_iteratorim))
print(next(mening_iteratorim))
print(next(mening_iteratorim))
print(next(mening_iteratorim))Iterator Bo'ylab Aylanish
Aylantiriladigan obyekt bo'ylab aylanish uchun for tsiklidan ham foydalanishimiz mumkin:
Misol
Tuple qiymatlarini aylanib chiqish:
mening_tuplem = ("olma", "banan", "gilos")
for x in mening_tuplem:
print(x)Misol
Satr belgilarini aylanib chiqish:
mening_satim = "banan"
for x in mening_satim:
print(x)for tsikli aslida iterator obyektini yaratadi va har bir tsikl uchun next() metodini bajaradi.
Iterator Yaratish
obyekt/sinfni iterator sifatida yaratish uchun obyektingizga __iter__() va __next__() metodlarini qo'shishingiz kerak.
Python Sinflar/obyektlar bo'limida o'rganganingizdek, barcha sinflarda obyekt yaratilganda ba'zi boshlang'ich sozlamalarni amalga oshirishga imkon beruvchi __init__() funksiyasi mavjud.
__iter__() metodi shunga o'xshash ishlaydi, siz operatsiyalar (boshlash va h.k.) qilishingiz mumkin, lekin har doim iterator obyektining o'zini qaytarishi kerak.
__next__() metodi ham operatsiyalar qilishga imkon beradi va ketma-ketlikdagi keyingi elementni qaytarishi kerak.
Misol
1 dan boshlanadigan va har bir ketma-ketlik birga oshib boradigan (1, 2, 3, 4, 5 va h.k.) raqamlarni qaytaradigan iterator yarating:
class MeningRaqamlarim:
def __iter__(self):
self.a = 1
return self
def __next__(self):
x = self.a
self.a += 1
return x
mening_sinfim = MeningRaqamlarim()
mening_iteratorim = iter(mening_sinfim)
print(next(mening_iteratorim))
print(next(mening_iteratorim))
print(next(mening_iteratorim))
print(next(mening_iteratorim))
print(next(mening_iteratorim))StopIteration
Yuqoridagi misol agar sizda yetarlicha next() iboralari bo'lsa yoki u for tsiklida ishlatilsa, abadiy davom etadi.
Aylanishning abadiy davom etishini oldini olish uchun StopIteration iborasidan foydalanishimiz mumkin.
__next__() metodida, agar aylanish belgilangan miqdorda bajarilgan bo'lsa, xatolik chiqarish uchun tugatish shartini qo'shishimiz mumkin:
Misol
20 ta iteratsiyadan keyin to'xtash:
class MeningRaqamlarim:
def __iter__(self):
self.a = 1
return self
def __next__(self):
if self.a <= 20:
x = self.a
self.a += 1
return x
else:
raise StopIteration
mening_sinfim = MeningRaqamlarim()
mening_iteratorim = iter(mening_sinfim)
for x in mening_iteratorim:
print(x)