Skip to content

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:

python
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:

python
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:

python
mening_tuplem = ("olma", "banan", "gilos")

for x in mening_tuplem:
    print(x)

Misol

Satr belgilarini aylanib chiqish:

python
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:

python
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:

python
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)