Skip to content

Files

Latest commit

 

History

History
249 lines (175 loc) · 6.65 KB

README.md

File metadata and controls

249 lines (175 loc) · 6.65 KB

Fəsil 11: İteratorlar və Generatorlar

Mündəricat

İterable-lərə və İteratorlara Giriş

Python-da iterable, iterator qaytara bilən bir obyektə deyilir. İterator isə məlumat axınını təmsil edən bir obyektə deyilir. İteratorlar kolleksiyanın bütün elementlərini bir-bir keçməyə imkan verir.

Nümunə: İterable

Listlər, tuple-lar və string-lər iterable-lərə nümunədir.

l = [1, 2, 3]

for i in l:
    print(i)

Çıxış:

1
2
3

İzah: l listi iterable-dir və biz for döngüsündən istifadə edərək onun elementlərini keçə bilərik.

iter() və next() ilə İteratorların Yaradılması

iter() funksiyasından istifadə edərək iterable-dən iterator yarada bilərsiniz. next() funksiyası iterator-dan növbəti elementi almaq üçün istifadə olunur.

Nümunə: İteratorun Yaradılması

l = [1, 2, 3]
iter_l = iter(l)

print(next(iter_l))
print(next(iter_l))
print(next(iter_l))

Çıxış:

1
2
3

İzah: iter() funksiyasından istifadə edərək l listindən iter_l iteratorunu yaradırıq. Daha sonra next() funksiyasından istifadə edərək iterator-dan növbəti elementi alırıq.

StopIteration-un İdarə Edilməsi

Artıq qaytarılacaq element qalmadıqda, next() funksiyası StopIteration istisnası yaradır.

l = [1, 2, 3]
iter_l = iter(l)

while True:
    try:
        print(next(iter_l))
    except StopIteration:
        break

Çıxış:

1
2
3

İzah: while döngüsü və try-except blokundan istifadə edərək StopIteration istisnasını idarə edirik və iterasiyanı dayandırırıq.

Xüsusi İteratorların Yaradılması

__iter____next__ metodlarını təyin edərək xüsusi iteratorlar yarada bilərsiniz.

Nümunə: Xüsusi İterator

class CustomRange:
    def __init__(self, start, end, step=1):
        self.value = start
        self.end = end
        self.step = step

    def __iter__(self):
        return self

    def __next__(self):
        if self.value >= self.end:
            raise StopIteration

        current = self.value
        self.value += self.step
        return current

numbers = CustomRange(1, 5, 1)

for num in numbers:
    print(num)

Çıxış:

1
2
3
4

İzah: CustomRange sinfi start-dan end-ə qədər verilmiş step ilə rəqəmlər yaradan xüsusi iterator təyin edir. __iter__ metodu iterator obyektini qaytarır və __next__ metodu ardıcıllıqda növbəti dəyəri qaytarır və ya StopIteration istisnası yaradır.

yield ilə Generatorların Yaradılması

Generatorlar iteratorları yaratmaq üçün sadə bir yoldur. Generator yield açar sözündən istifadə edərək dəyərləri bir-bir qaytaran funksiyadır.

Nümunə: Generatorun Yaradılması

def custom_range(start, end, step=1):
    current = start
    while current < end:
        yield current
        current += step

numbers = custom_range(1, 5)

for num in numbers:
    print(num)

Çıxış:

1
2
3
4

İzah: custom_range funksiyası start-dan end-ə qədər verilmiş step ilə dəyərləri qaytaran generator-dur. Biz for döngüsündən istifadə edərək yaradılmış dəyərləri keçirik.

Generator İfadələri

Generator ifadələri generatorları yaratmaq üçün qısa bir yol təqdim edir. Onlar list comprehensions-a bənzəyir, lakin kvadrat mötərizələr əvəzinə dairəvi mötərizələrdən istifadə olunur.

Nümunə: Generator İfadəsi

gen_exp = (x * x for x in range(5))

for num in gen_exp:
    print(num)

Çıxış:

0
1
4
9
16

İzah: (x * x for x in range(5)) generator ifadəsi 0-dan 4-ə qədər olan rəqəmlərin kvadratlarını qaytaran generator yaradır. Biz for döngüsündən istifadə edərək yaradılmış dəyərləri keçirik.

Generatorların İstifadə Halları

Generatorlar böyük dataset-lərlə işləmək üçün faydalıdır, çünki onlar dəyərləri yaddaşda saxlamadan dinamik olaraq yaradır. Bu, onları yaddaş baxımından səmərəli edir və böyük faylların oxunması və ya sonsuz ardıcıllıqların yaradılması kimi tapşırıqlar üçün uyğun edir.

Nümunə: Böyük Faylın Oxunması

def read_large_file(file_path):
    with open(file_path, 'r') as file:
        for line in file:
            yield line

for line in read_large_file('large_file.txt'):
    print(line.strip())

İzah: read_large_file funksiyası böyük faylı sətir-sətir oxuyan generator-dur. Biz for döngüsündən istifadə edərək sətirləri keçirik və çap edirik.

Nümunə: Sonsuz Ardıcıllığın Yaradılması

def infinite_sequence():
    num = 0
    while True:
        yield num
        num += 1

gen = infinite_sequence()

for i in range(10):
    print(next(gen))

Çıxış:

0
1
2
3
4
5
6
7
8
9

İzah: infinite_sequence funksiyası 0-dan başlayaraq sonsuz ardıcıllıq yaradan generator-dur. Biz for döngüsündən istifadə edərək generator-dan ilk 10 rəqəmi alırıq.

Xülasə

Bu fəsildə biz Python-da iterable-ləri, iteratorları və generatorları öyrəndik. iter()next() funksiyalarından istifadə edərək iteratorların necə yaradılacağını, xüsusi iteratorların necə qurulacağını, yield açar sözü ilə generatorların necə yaradılacağını və qısa generator yaratmaq üçün generator ifadələrindən necə istifadə ediləcəyini öyrəndik. Həmçinin, generatorların istifadə halları, məsələn, böyük faylların oxunması və sonsuz ardıcıllıqların yaradılması kimi mövzuları araşdırdıq.

Tapşırıqlar

  1. İlk n Fibonacci rəqəmlərini qaytaran generator funksiyası yazın.
  2. 1-dən 10-a qədər olan rəqəmlərin kubunu yaradan generator ifadəsi yaradın.
  3. Böyük faylı sətir-sətir oxuyan və sətirlərin sayını hesablayan proqram yazın.
  4. Verilmiş addımla rəqəmlər aralığını keçən xüsusi iterator sinfi yaradın.
  5. Sonsuz cüt rəqəmlər ardıcıllığını yaradan generator funksiyası yazın.

Növbəti Fəsil: Nəticə və Əlavə Öyrənmə