Python-da Funksiyalar və onların strukturu (II hissə)

Zahra Alizada
Pragmatech
Published in
4 min readSep 8, 2020

Pythonda Method (Metod)

Data tiplərini yaradan hər bir dəyişən (variable) Pythonda obyekt olaraq qəbul olunur və bu oyektlərin bir sıra methodları var. Metodlar bir obyekt üzərində müəyyən hərəkətləri icra edən obyektlərə məxsus funskiyalardır və obyektlərin üzərində metodlar belə istifadə olunur:

obyekt.herHansiBirMetod(alinanDeyer)

Bir list obyekti yaratdığımız zaman bu obyektin üzərində müəyyən metodları icra edə bilərik. Nümunə olaraq bir neçə metoda nəzər yetirək:

Burada biz insert() metodu vasitəsilə ‘ada’ sözünü listin 2-ci elementi olaraq(yəni 1-ci index) əlavə etdik.

Burada biz append() metodu vasitəsilə dünya sözünü listin sonuna əlavə etdik.

Burada biz pop() metodu vasitəsilə listin sonundakı elementi sildik.

Bu metodların hansı işi gördüklərini unutduğumuz zaman help(obyekt.append) yazaraq hansı funksiyanı icra etdiyinə baxa bilərik.

Funksiyalarda return və void ifadələri

return ifadəsi funksiyalarda dəyər qaytarır. Biz print() funksiyasının dəyər yazdırdığını bilirik. Amma bu funksiyalar, icra etdikləri əməliyyatlar nəticəsində heç bir dəyər vermirdi bizə. Lakin biz proqramlarımızda bir funksiya nəticəsində əldə edilən dəyərləri proqamın başqa hissələrində istifadə etmək istəyə bilərik. return ifadəsi də məhz bu məsələnin həlli üçün yaradılıb.

return ifadəsi funksiya icra edildikdən sonra çağırıldığı yerə dəyər qaytarması mənasını daşıyır. Belə olduqda, funksiyada aldığımız dəyəri bir dəyişkəndə store edə (depolamaq) bilər və dəyəri proqramın başqa bir hissəsində istifadə edə bilərik. İndi return ifadəsini anlamaq üçün iki sadə funksiya yazaq:

Type error olduğu üçün cem dəyişəninin type-na baxaq:

Bu dəyişənin tipi None type-dır. Yəni bu dəyişənə heç bir dəyər mənimsədilməyib deməkdir. Çünki print() funksiyası dəyəri çap edir, dəyər qaytarmır. Bu nümunəni return ifadəsi ilə yoxlayaq:

Burada heç bir error almadıq. Çünki return zamanı cem=topla(3,4,5) –ifadənin nəticəsi cem=12 olaraq dəyəri ötürür. Daha sonra print(ikiyeVur(cem)) ifadəsi print(ikiyeVur(12)) olaraq hesablanır və nəticə 24 olaraq çap edilir. cem dəyişəninin type-na baxdıqda isə burada int(integer) olduğunu görürük. return ifadəsinin mənası tam olaraq burada aydınlaşır.

Real həyata uyğun bir nümunə ilə return-i izah edəcək olsaq. Fərz edək yeməyə qatmaq üçün soğan doğramalısınız. Bunun üçün bir doğrama aparatımız var. Doğrama aparatına soğanı daxil edirik və aparat soğanı doğrayır. Lakin bu iş başa çatdıqdan sonra aparat doğranmış soğanları sizə gətirib vermir. Bunu return istifadə etmir kimi başa düşmək olar. Nəticə olaraq siz doğranmış soğanları götürüb istifadə edə bilmirsiz yeməyinizi bişirmək üçün. Yəni bu aparatdan biz hansısa dəyəri ala bilmədik. Aparat bizə dəyər vermədi. Burada biraz utopiyaya qaçmış olsaq da returnin bizə dəyər vermə mənasını izah edə bilirik. Fikri ümumiləşdirəcək olsaq return ifadəsi ilə funksiyalarda aldığımız dəyərləri çağırıldığı yerə ötürə və istifadə edə bilirik deyə bilərik. return ifadəsinə aid izahlı növbəti nümunədə bunu daha yaxşı anlaya bilərik.

Burada return ifadəsi yeirnə print() istifadə etsə idik bizə geri dəyər qaytara bilməyib error verəcəkdi.

return bir funksiyanı tamamilə sonlarından ifadədir. return ifadəsindən sonra gələn heç bir ifadə işləmir. Buna bir nümunədə baxaq:

Burada print() daxilində yazılan ifadə çap edilmədi. Çünki return ifadəsindən sonra gəlir. İndi returnprint() ifadələrinin yerini dəyişək, bu zaman print() daxilində yazılan ifadə çap olunacaq.

return istifadə edilməyən, yəni çağırıldığı yerə dəyər qaytarmayan funksiyalara void funksiyalar deyilir. void funksiyaları dəyər qaytarmır. void funksiyalar funksiya daxilində işləyən kənara data göndərməyən və çox zaman aldığı parametrlər üzərində iş icra edən funskiayalardır. Buna bir nümunədə baxaq:

Burada print() funksiyasının dəyər qaytarmayan sadəcə ekranda nəticəni çap edən void funksiya olduğunu görürük.

Global və local dəyişənlər

Pythonda hər bir dəyişənin, funksiyanın və classların əslində bir scope-u (əhatə dairəsi) var və Python hər bir dəyişəni bir namespace(ad sahəsi) təyin edir. Dəyişənlərin namespace-i isə bu dəyişənlərin harada var olduğunu və harada istifadə ediləcəyini göstərir. Pythonda funksiyalar daxilində təyin olunan dəyişənlər Python tərəfindən local(yerli) dəyişənlər olaraq təyin edilir. Yəni bir funksiya bloku daxilində yaradılmış dəyişənlər bu funksiyaya aiddir və funksiya icra olunduqdan sonra bu dəyişənlər yaddaşdan silinir və yox olur. Belə olduğu zaman, funksiya içərisində təyin olunmuş bir dəyişənə başqa bir yerdən access (əlçatan) olunmayacaq. Pythonda ən genişəhatə dairəsinə sahib dəyişənlər global dəyişənlərdir. Global dəyişənlər təyin olunduğu andan etibarən proqramın hər yerindən əlçatan olur.

Local dəyişkənlərə uyğun bir nümunə yazaq:

Burada a — dəyişəninin təyin olunmadığı xətası baş verdi. Çünki biz a dəyişənini funksiya daxilində təyin etmişik. Funksiyadan kənarda yazılmış print(a) ifadəsi a dəyişənini istifadə edə bilmədiyi üçün xəta verdi.

Global dəyişənlərə nümunə yazaq:

Burada a dəyişəni global dəyişən olduğu üçün həm funksiya daxilində, həm də funksiyadan kənarda istifadə edildi. Buna görə də 2 dəfə çap olundur.

Global dəyişən funksiya çağırıldıqdan sonra təyin olunarsa bu zaman proqram xəta verəcək. Çünki funksiya icra olunduğu zaman dəyişənə mənimsədilmiş dəyəri görə bilmir:

Globalda və localda eyni adda iki dəyişən olarsa funksiya çağırıldığı zaman funksiya daxilində ilk olaraq local dəyər istifadə olunur:

Burada funksiya() icra olunduğu zaman ilk olaraq local dəyərə baxır və onu istifadə edir. Funksiya icra olunduqdan sonra local dəyər silinir.

Funksiya daxilində globalda istifadə olunmuş dəyişəndən istifadə edib yeni dəyər mənimsətmək istəyiriksə bu zaman funksiya daxilində dəyişənin qarşısında global sözünü yazırıq:

Burada funksiya çağırıldığı zaman global b dəyərini götürdü və ona 3 dəyərini mənimsətdi. Daha sonra bu dəyəri çap etdi və funksiyadan çıxdı. Artıq global dəyişənə 3 dəyəri mənimsədildiyi üçün print(b) icra olunduğu zaman ikinci dəfə 3 rəqəmi çap olundu.

Global dəyişəni bu formada istifadə etmək kodlarımızda qarışıqlıq yarada bilər. Ona görə də funksiya daxilində hər funksiya üçün özünəməxsus local dəyişən təyin etmək daha düzgün seçim olar.

Funksiya bloku daxilində yaradılan hər bir dəyişənə local dəyişəndir dedik. While və ya if bloku daxilində təyin edilmiş dəyişənlər də global dəyişən sayılır.

Burada e dəyişəni if daxilində təyin edilmiş olsa da global dəyişən sayılır. Buna görə də if daxilində olan və if-dən kənarda olan print() funksiyası iki dəfə 4 rəqəmini çap etdi.

Lambda ifadəsi ilə funksiya təyin etmək

Lambda ifadələri funksiyalarımızı Pythonda yaza bilməyimiz üçün praktik bir üsuldur və lazım olduqda bundna istifadə edirik. İlk əvvəl lambdanın strukturuna baxaq daha sonra nümunələrlə izah edək.

funksiya_adı = lambda parametr1,parametr2.... :  emeliyyat

Adi funksiya nümunəsi:

Eyni nümunəni lambda ilə yazaq:

Birdən çox parametr alan adi funksiya nümunəsi:

Birdən çox parametr alan lambda ilə yazılmış funksiya nümunəsi:

Hər iki nümunədən də görünür ki lambda ifadəsi yazılışında sətir sayı azalır. Bu funksiyamızı daha oxunaqlı və səliqəli edir. def açar sözü ilə ilə qısa funksiya yazıldığı zaman zəhmətli olduğu üçün lambda ifadəsindən istifadə edilir. Bu ifadə kiçik funksiyalar üçün istifadə edilir. lambda ifadəsindən çox əməliyyatlı funksiyalarda istifadə etmək məsləhət görülmür.

--

--