Funksiyalar
@pythonaze
Proqramlaşdırmada müəyyən bir fəaliyyəti yerinə yetirən adlanmış əmrlər (kodlar, skriptlər) ardıcıllığı funksiya adlanır. Funksiyalar adlanmış və anonim, def ifadəsi ilə yaradılan olur. Bundan başqa return və lambda funksiyaları da mövcuddur. Python dilində funksiya deidkdə arqument qəbul edib qiymət qaytaran obyekt başa düşülür və adətən belə təyin olunur:

Yaradılan funksiyaya istənilən ad (rezervlənmiş açar sözlərdən savayı) vermək olar. Əgər funksiyanın işi üçün hansısa informasiyanın ötürülməsinə ehtiyac varsa, onda bu halda parametrlər siyahısı vasitəsilə istifadəçi bu informasiyanı funksiyaya ötürür. Funksiya daxilində istənilən sayda əmr ola bilər. Burada əsas vacib şərt odur ki, onlar def sözünə nəzərən sağa sürüşməlidirlər. Çox vaxt bu sürüşmə adətən 4 probel olur. Funksiyanın təyin olunması cümləsi bu funksiyanı təşkil edən bizim gördüyümüz əmrlər içində birincidir. Onlar belə bir sxemlə qurulur:
- Başlıq – def açar sözü ilə başlayır və ikinöqtə (“:”) ilə bitir.
- Gövdə– Python dilində yazılmış və başlığa nəzərən eyni (adətən 4 probel) sürüşməsi olan azı bir və ya daha çox cümlədən ibarətdir.

Sxemdən göründüyü kimi başlıqda açar söz def istifadə edilir. Ondan sonra ad gəlir. Addan sonra mötərizə içində parametrlər siyahısı gəlir. Sonda iki nöqtə qoyulur. Parametrlər siyahısı boş, ya da istənilən sayda ola bilər. Boş və ya dolu olmağından asılı olmayaraq mötərizə olmalıdır.
Əvvəlcə parametri olmayan funsiyaya aid bir misala baxaq. Bunu üçün VS Code`də main.py faylını yaradırıq.

Birinci iki sətirdə funksiya verilmişdir. Funksiyanın adı Yeni_setir - dir. Parametri yoxdur. Gövdəsində boş sətir çap edən bircə ədəd print() əmri var.Daha sonra əsas proqramın kodları gəlir. Əsas proqram 4 koddan ibarətdir. Birinci 2 kod 2 sətir mətn çap edir. Üçüncü kod boş sətir çap etmək üçün funksiyaya müraciət edir. Və nəhayət dördüncü kod yenə də mətn çap edir.İki sətir arasındakı boş sətir Yeni_setir() funksiyasının işinin nəticəsidir. Əgər boş sətirlərin sayını daha çox etmək istəyiriksə, onda əsas proqramda lazım olan qədər Yeni_setir() funksiyasını yazmaq lazımdır. Məsələn:

Başqa bir sadə funksiya təyin edək:

return əmri bildirir ki, qiyməti qaytarmaq lazımdır. Bizim misalda funksiya x və y arqumentlərinin cəmini qaytarır. İnterpretator rejimində funksiya belə çağıralacaq:

Funksiya yaratmağın nə üstünlükləri var?
- Bir qrup proqram kodu olan əmrlər qrupuna bir ad vermək olar. Sonradan həminadla həmin əmrlər qrupuna dəfələrlə müraciət etmək olar.
- Bu ümumi proqramın həcminin kifayət qədər kiçilməsinə gətirib çıxarır.
- Proqram daha gözə gəlimli və anlaşıqlı olur.
- Bir funksiya digər bir funksiyaya müraciət edə bilər.
Funksiyanın daxilindəki cümlə(lər) funksiya çağırılmayana qədər yerinə yetirilməyəcəklər. Funksiya yerinə yetirilməyənə qədər o təyin olunmalıdır. Başqa sözlə, əsas proqramda funksiya birinci dəfə çağırılana qədər o təyin olunmalıdır. Növbəti sxem bunu əks etdirir:

Öncədə dedik ki, funksiya yerinə yetirilənə qədər təyin edilməlidir. Bunun üçün proqram daxilindəki əmrlərin (kodların, skriptlərin) yerinə yetirilmə ardıcıllığını bilmək lazımdır. Bunu proqramın fəlsəfəsi kimi də başa düşmək olar. Proqramdakı əmrlərin yerinə yetirilmə ardıcıllığı icra axını adlanır. Yerinə yetmə həmişə proqramın birinci sətrindən başlayır. Proqramın əmrləri hər yuxarıdan aşağı gedəndə bir dəfə yerinə yetirilir. Funksiyanın təyini proqramın icra axınını dəyişmir. Amma funksiya daxili əmrləri funksiyaya müraciət olana qədər yerinə yetirilmir. Bəzən bir funksiya daxilində başqa bir funksiyanı təyin etmək olar (hərçənd ki, belə hallar çox nadir olur). Bu halda daxili funksiya xarici funksiya çağırılmayana qədər yerinə yetirilə bilməz. Funksiyanın çağırılmasını icra axınından sapma (yayınma) kimi başa düşmək olar. Növbəti əmrə keçmək əvəzinə çağılıran funksiyanın gövdəsinin birinci əmrinə müraciət olunur və funksiyanın gövdəsi yerinə yetirilir. Funksiyanın icrası bitdikdən sonra idarə funksiyaya müraciət olunan nöqtəyə qaytarılır və icranın davamı oradan davam etdirilir. Göründüyü kimi prinsip çox sadədir. Bəs bir funksiya digər funksiyaya müraciət edən halda necə olur? Burada da Python dili cari funksiyaya girişin haradan olduğunu yadda saxlayır və hər dəfə funksiya işini bitirdikdən sonra proqram işini cari funksiya çağılmamışdan əvvəlki yerdən davam edir. Proqramın sonu çatdıqda o icrasını bitirir. Bütün bu dediklərimizin fəlsəfəsi nədən ibarətdir? Proqramı oxuyarkən yuxarıdan aşağıya doğru oxumaq yanaşmasından qəti surətdə imtina edin. Yalnız və yalnız icra axını üzrə proqramın işini izləyin.
Yuxarıda nümunə üçün baxdığımız funksiyadan fərqli olaraq əksər funksiyalara emal etmək üçün arqumentlər lazım olur. Məsələn, hansısa ədədin mütləq qiymətini tapmaq üçün həmin ədədi göstərmək lazımdır. Python dilində mütləq qiyməti hesablamaq üçün daxili abs funksiyası mövcuddur.

Növbəti 2 funksiya ilə tanış olaq: max və min. Bu funksiyalar çox arqumentlidir. Mötərizə daxilində bir-biri ilə vergüllə ayrılmaqla çox sayda arqument vermək olar. max funksiyası bu arqumentlərin içindən maksimumu, min funksiyası isə minimumu seçib nəticə kimi qaytarır. Arqumentdə həm sadə qiymətlər, həm də ifadələr ola bilər.

İndi isə yeni bir parametrli funksiya yaradaq.

Bu funksiya yeganə arqumenti qəbul edir və onun qiymətini par_sahe adlı parametrə mənimsədir. Funksiya daxilində əvvəlcə parametrin qiyməti iki dəfə çap edilir və sonda sətrin sonu çap edilir. Burada par_sahe parametrə bizim verdiyimiz addır. Bu ad ixtiyarı (açar sözlərdən savayı) ola bilər. Adı elə seçmək lazımdır ki, o təyinatı haqqında müəyyən informasiya daşısın.

Biz bu misalda proqramın iki rejimdə (həm interpretator (interaktiv), həm də redaktor) yerinə yetirilməsinə baxdıq. İnteraktiv rejimdə müəyyən proqram parçalarını, funksiyaları test etmək rahatdır.
Import əmrindən istifadə etməklə skriptdə təyin edilmiş funksiyanı interpretatora yükləyib istifadə etmək olar. Tutaq ki, print_melumat funksiyası Pythonun kitabxanasında main.py adı ilə yadda saxlanılıb. Bu zaman onu import edib istifadə etmək olar:

Daxili funksiyalarda olduğu kimi yaradılan funksiyalarda da ifadələrdən istifadə etmək olar:

Bu misalda öncə 'Yoxlama'*4 ifadəsi hesablanır ('YoxlamaYoxlamaYoxlamaYoxlama'), sonra isə alınan qiymət çap üçün arqument kimiprint_melumat funksiyasına ötürülür. Riyaziyyatda olduğu kimi Python dilinin funksiyalarını kombinə etmək olar, yəni bir funksiyanın nəticəsindən digər funksiyaya müraciət edəndə arqument kimi istifadə etmək olar.
