40 / 59

Python Iterators

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.

Iterator bo'ylab aylanib chiqish

Pythonda, ketma-ketlikdagi keyingi elementni qaytarish uchun next() funksiyasidan foydalanishimiz mumkin.

Keling, bir misolni ko'ramiz,

example.py
# 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

kod
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.

for siklidan foydalanish

Avtomatik aylanib chiqishning yanada nafis usuli — for siklidan foydalanish. Masalan,

example.py
# ro'yxatni aniqlash
my_list = [4, 7, 0]

for element in my_list:
    print(element)

Natija

kod
4
7
0

Iteratorlar uchun for siklining ishlashi

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,

example.py
# 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.

Maxsus iteratorlar yaratish

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,

example.py
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

kod
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.

example.py
for i in PowTwo(3):
    print(i)

Natija

kod
1
2
4
8

Ob'ektga yo'naltirilgan dasturlash haqida ko'proq bilish uchun, Python OOP sahifasiga tashrif buyuring.

Python cheksiz iteratorlari

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,

example.py
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

kod
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.

QBilimingizni sinab ko'ring
1 / 3

1. Python iterator obyekti amalga oshirishi shart bo'lgan ikkita maxsus metod qaysilar?