Mehman Mirzeyev
Pragmatech
Published in
5 min readAug 16, 2021

--

İterators, Generators və Decorators

İteration — addımlamaq deməkdir. Obyekt dəyərlərini tək tək oxuyub dövr tamamlamaq üçündür.

İterable — Üzərində addımlaya bilmək deməkdir .Yəni dövrdə istifadə oluna biləcək obyektlər bura aiddir. Misal olaraq list , string və.s

İterator — Həmin bu addımla işini görən obyektdir. Bütün dövürdəki dəyərləri hamsını tək tək oxuyur və dövr harda qaldığını unutmur. Yəni aşağıdakı nümunədə kimi 1 oxuyur daha sora 2 belə ardıcıl olaraq.

Burda göründüyü kimi sadə bir dövr yazmışıq və normal olaraq oda ekrana 1, 2, 3 yazdırıb. Burda olan print içində yazdığımız rəqəm ilk öncə 1-in yerinə keçir , ekrana 1 yazdırır daha sora 2-in yerinə keçir , ekrana 2 yazdırır , son olaraqda 3-ün yerinə keçir və ekrana yazdırır. Dövr bitir.

Biz burda indi həmin rəqəmlər list -nə iterable deyə bilərik çünki dövrdə istifadə edə bildik. Məsələn tipini bilmədiyimiz bir şeyin “iterable” ola biləcəyini harda bilərik? Nümunə:

Bu bizə rəqəmlər obyekti üçün istifadə edə biləciyimiz metodları göstərir. Burda da “__iter__” metodu yazılıb iterable olduğunu burdan bilirik. “__iter__” — Bir iterator qaytırır . Yəni :

Yaratdığımız list olduğu üçün bizə list_iterator qaytarır.

Nəticə: Bir obyekt yaratmışıqsa onun metodlarının arasında __iter__ varsa deməli bu obyekt iterable obyektdir , dövrlərdə istifadə oluna bilir.İter metodunu işə saldığımız zaman iterator yaratmış oluruq. Bu İterotor -u yaradan isə next metodudur. Yəni yuxarda yazdığımız list içində olan dəyərlər 1 dən sora 2 -ə necə keçəciyini bildirən metoddur. Next metodu çağırıdıqda iterotar bir sonrakı dəyər keçir.Yəni:

Bir dəfədə proqramı run etsək qaldığı yerdən davam edəcək.Yuxarıda qeyd etdiyimiz iterator harda qaldığını yadında saxlıyır və ordan davam edir. Yəni :

Əgər yenə davam etsəm bu səhvi çıxaracaq yəni dövrdən çıxmış olacaq. Çünki list 3 rəqəm daxil etmişik. Yəni :

Nəticə : Biz for dövrü yaratdığımız zaman həmin dövrü üçün olan obyektin iter metodunu çağırır. İter metodu bizə iterator verir (nümünə olan i_rəqəmler yəni) , həmin bu dövr bir xəta verənə qədər next metodunu çağırır və dövr qutaranda yəni yuxarıda olan kimi xətanı tapır və dövr bitir .

Generator — Listlərə oxşayan obyekt növüdür. Generatorlardan istifadə etməklə listlərdən daha səmərəli istifadə edə bilərik. Yəni generatorda istifadə edəndə kompüterin yaddaşında (RAM) listlərə nəzərən daha az yer tutmuş olur. Generator list hamsın birdən çap etmir ekrana , tək- tək ekrana çap edir.Tutaq data sayı böyük olan list var onu hamısı print etmək həm prosess uzun çəkir həmdə yaddaş da çox yer tutur. Bir dəyər print etdikdən sora digər printin etdikdə generator ona kömək edirdiki 1 ci çap etdiyimizi yaddaşdan silir və 2-ci çap etdiyimiz dəyəri onun yerinə yazmış olur. Beləliklə çox datası olan bir list yaddaşda az yer tutur.

Decorator — Əslində bir funksiyadır yəni bizm yazdığımız funksiyalara bir xüsusiyyət vermək üçün istifadə olunur. Məsələn deyək ki bizim 50 dənə funksiyadan ibarət kodumuz var. Biz istiyirik ki hər bir funksiya nə qədər vaxta işləyir , bunun lazım olan kodları hər bir funksiya üçün ayrı-ayrı yazmaq lazımdır. Decorator bunun üçün var ki həmin funksiyaları onun içində yazıb sora hər funksiyada aktiv etmək üçün funksiyanın bir üst sətirində “@” qoymaqla aktiv edə bilərik. Yəni :

@decorator — decoratorun adı (istəlinən ad qoya bilərik)

def function(): — funksiya

İLk olaraq funksiyalarda : Dəyişkən olan bilən funksiyalar və funksiya içində funksiya anlayışından danışaq.

Dəyişkən(variable) olan bilən funksiyalar , funksiya kimi çağıra bilirik yəni :

Bu gördüyümüz adi bir funksiyadır çap etdi . İndi isə :

“a” dəyişəni bir funksiya oldu və nəticəni verdi.

Funksiya içində funksiya :

Burda gördüyümüz kimi iç içə funksiya yaratdıq . Yəni həm test həmdə test1 funksiyasını eyni vaxtda ekrana yazacaqdır. Bunu eliyən “print(test1())” funksiyasıdır. Nəticə olaraq iki funksiyanı iç içə yazmış olduq. Yəni biz test funksiyasını çağırdığımız zaman iki sözüdə ekrana yazdırır.

Burda arqumenti a olan dekorator(funksiya) yaratdıq .Yuxarıda qeyd etdiyimiz kimi iç içə funksiya yaratdıq. İçində wraper adında bir alt funksiya yaradırıq , daha sora yuxarıda təyin etdiyimiz a arqumentinin aktiv edirk. Bu bizim hazır funksiyadır hər hansı bir funksiya yazıb onun bu funksiyaları yerinə yetirməsi üçündür dekarotor. Nümunə olduğu kimi yazdır adında bir funksiyamız var və “@dec (delarotorun adı)” yazmaqla həmin funksiyanı yerinə yetirməsini təyin etdik. Bu dekoratoru arqumenti olmayan funksiya üçün yaza bilərik. Yəni:

Burda olan funksiyada niyə xəta verdi ?

Çünki biz bunu ancaq yuxarıda a funksiyasına arqument verməmişik yəni a() boş qəbul etməlidir. Ona görə xəta verir ki dekarotar arqument yoxdu ama biz arqument daxil etmişik. Bunu problemi arqument alan funksiya ilə aradan qaldıra bilərik . Nümunə :

*args — sayını bilmədiyimiz arqumentlər üçün yazılan xüsusiyyətdir. “*args “köməyi ilə istəlinən sayda arqument təyin edə bilərik. Buna görə aşağıda yazdığımız funksiya işlədi çünki funksiyada nə qədər arqument ala bilər bildrmişik.

Arqument alan dekarotor da yaza bilərik. Yəni:

Burda dekoratorun özünə arqument təyin etdik , “msj1- Start , msj2- End” , alınan “8” isə funksiya üçün təyin etdiymiz arqumentin nəticəsidir. Burda həm dekarotor üçün həmdə funksiya üçün təyin etdik.

--

--