Bloqa Xoş Gəlmisiniz

   Müəllifi Kərim Tahiroğlu olan bu kitab Python proqramlaşdırma dili ilə bağlı Azərbaycan dilində nəşr edilmiş ilk ədəbiyyatdır.

Book_09

   Nüfuzlu TIOBE Proqramlaşdırma İcmasının məlumatlarına görə Python hazırda dünya üzrə ilk onluqda yer alan populyar proqramlaşdırma dili sayılır. Python dili 1991-ci ildə Guido van Rossum tərəfindən işlənib hazırlanmışdır. Proqramlaşdırmanın müasir tələblərinə cavab verən bu dil universaldır. Bu gün Google, Intel, CISCO, Hewlett-Packard, Qualcomm, IBM və NASA kimi qurumlar bir çox layihələrini Python dilində işləyib hazırlayırlar. Python dili pulsuz olaraq yayılır. Bu dili öyrənmək asan və əyləncəlidir. Odur ki, Python dili nəinki peşəkar proqramçılar tərəfindən istifadə olunur, eləcə də həvəskarlar, məktəblilər də bu dilin imkanlarından geniş surətdə faydalanırlar. Əgər proqramlaşdırmaya yeni başlayırsınızsa, o zaman Python dili tam Sizə görədir.

   Sizə təqdim edilən bu kitab ali məktəb tələbələri, informatika müəllimləri, orta məktəb şagirdləri və ümumiyyətlə proqramlaşdırmanı öyrənmək istəyən hər kəs üçün nəzərdə tutulmuşdur.

   Bu bloqda isə Sizləri bir-birindən maraqlı məlumatlar, proqramlar və əlbəttə ki, dərslər gözləyir. Kitab və bloqla bağlı öz düşüncələrinizi, təklif və rəylərinizi müəlliflə bölüşə bilərsiniz. Sizə uğurlar 🙂


Oktyabr 2025 üçün TIOBE İndeksi

Çoxluq tipləri

Çoxluq – nizamlanmamış təkrarlanmayan elementlər toplusudur. Python dilində iki növ çoxluq tipi var: setfrozenset. Bunların arasındakı yeganə fərq ondan ibarətdir ki, set dəyişən, frozenset isə dəyişməyən tipdir. Daha dəqiq desək, set tipindəki elementlər toplusunu dəyişmək (yeni element əlavə etmək və çıxarmaq) mümkündür, frozenset tipində isə bu mümkün deyil.
Çoxluqlar aşağıdakı üsullarla konstruksiya edilə bilər:

>>> {7, 4.44, 'z', "Turan", False}
{False, 'z', 'Turan', 4.44, 7}
>>> st1 = {2, 4, 8, 16}
>>> st2 = set('abcde')
>>> st3 = set({3,6,9})
>>> st4 = set()
>>> fs1 = frozenset('fghij')
>>> fs2 = frozenset({2,4,6,8})
>>> fs3 = frozenset()
>>> type(st1)
<class 'set'>
>>> type(fs1)
<class 'frozenset'>
>>>

Bir-birindən vergüllə (,) ayrılan çoxluğun elementləri müxtəlif tipdə qiymətlərdən ibarət ola bilər. Lakin təcrübədə, adətən, eynitipli elementlərdən istifadə edirlər. Çoxluğun özü isə fiqurlu mötərizə daxilində göstərilir. Çoxluqlar həmçinin setfrozenset konstruksiyaları ilə də verilə və boş da ola bilər. Yuxarıdakı proqramda st4 = set()fs3 = frozenset() konstruksiyalarıdanboş çoxluqları düzəltmək üçün istifadə olundu. Çalışın ki, boş çoxluğu göstərmək üçün {} konstruksiyasından istifadə etməyəsiniz. Çünki interpretator bu yazılışı çoxluq kimi qəbul etməyəcək.
Çoxluqlar nizamlanmamış elementlər toplusu olduqlarına görə ardıcıllıq tiplərində olan indeksləmə, dilimləmə və s. kimi əməliyyatlar onlar üçün keçərli deyil.
Çoxluqların uzunluğunu len() funksiyası ilə müəyyən etmək mümkündür. Verilmiş qiymətin çoxluğa daxil olub-olmadığını isə üzvlük operatorları (innot in) vasitəsilə yoxlamaq olar. Çoxluqlardan da for sayğaclı dövründə qiymətlər çoxluğu kimi istifadə oluna bilər.
Aşağıdakı cədvəldə set tipi ilə bağlı bir sıra metodlar verilmişdir:

MetodTəyinatı
add()Çoxluğa element əlavə edir.
remove()Verilmiş elementi çoxluqdan xaric edir. Göstərilmiş element çoxluqda yoxdursa, xəta qeydə alınır.
discard()Verilmiş elementi çoxluqdan xaric edir. Göstərilmiş element çoxluqda yoxdursa, xəta qeydə alınmır.
pop()Çoxluqdan ixtiyari bir elementi xaric edir və göstərir. Çoxluq boşdursa, xəta qeydə alınır.
clear()Çoxluğun bütün elementlərini silir.
copy()Çoxluğun nüsxəsini çıxardır.
update()Çoxluğu özü ilə digər çoxluqları birləşdirərək yeniləyir.
union()Çoxluqları birləşdirərək yeni bir çoxluq düzəldir.
difference()Verilmiş çoxluqların fərqindən yeni bir çoxluq düzəldir.
difference_update()Çoxluqdan digər çoxluğun bütün elementlərini xaric edir.
symmetric_difference()Verilmiş çoxluqların simmetrik fərqindən yeni bir çoxluq düzəldir.
symmetric_difference_update()Çoxluğu özü ilə digər çoxluğun simmetrik fərqini əldə edərək yeniləyir.
intersection()Çoxluqların kəsişməsindən yeni bir çoxluq düzəldir.
intersection_update()Çoxluğu özü ilə digər çoxluğun kəsişməsini əldə edərək yeniləyir.
isdisjoint()Verilmiş iki çoxluq kəsişmədikdə True qiymətini qaytarır.
issubset()Çoxluq digər çoxluğun alt çoxluğu olduqda True qiymətini qaytarır.
issuperset()Çoxluq digər çoxluğun üst çoxluğu olduqda True qiymətini qaytarır.

Aşağıdakı misalları nəzərdən keçirək:

>>> a = {1, 2, 3, 4}
>>> a.add(5)
>>> a
{1, 2, 3, 4, 5}
>>> a.remove(5)
>>> a
{1, 2, 3, 4}
>>> 
>>> a.remove(5)
Traceback (most recent call last):
  File "<pyshell#27>", line 1, in <module>
    a.remove(5)
KeyError: 5
>>> a.discard(5)
>>> a.pop()
1
>>> a
{2, 3, 4}
>>> a.clear()
>>> a
set()
>>>
>>> a = {1, 2, 3}
>>> b = a.copy()
>>> b
{1, 2, 3}
>>> c = {4, 5}
>>> b.update(c)
>>> b
{1, 2, 3, 4, 5}
>>> d = {4, 5, 6, 7}
>>> e = b.union(d)
>>> e
{1, 2, 3, 4, 5, 6, 7}
>>> f = e.difference(d)
>>> f
{1, 2, 3}
>>> e.difference_update(f)
>>> e
{4, 5, 6, 7}
>>>
>>> a = {1, 2, 3, 4, 5}
>>> b = {4, 5, 6, 7, 8}
>>> a.symmetric_difference(b)
{1, 2, 3, 6, 7, 8}
>>> a.symmetric_difference_update(b)
>>> a
{1, 2, 3, 6, 7, 8}
>>>
>>> a = {1, 2, 3, 4, 5}
>>> b = {4, 5, 6, 7, 8}
>>> a.intersection(b)
{4, 5}
>>> a.intersection_update(b)
>>> a
{4, 5}
>>> c = {1, 2, 3}
>>> a.isdisjoint(c)
True
>>> d = {1, 2}
>>> d.issubset(c)
True
>>> e = {1, 2, 3, 4, 5}
>>> e.issuperset(c)
True
>>>

Yuxarıda sadalanan metodlardan, çoxluqlarda dəyişikliyə gətirib çıxaranlardan başqa, digərləri frozenset tipinə də tətbiq edilə bilər.

Modulların hazırlanması

Mövzunun əvvəlində qeyd etmişdik ki, modullar həm də proqram kodlarının təkrar istifadəsini təmin edir. Bu isə o deməkdir ki, daha çox istifadə olunan funksiya və sinifləri hər dəfə hazırlamaq və ya kopyalamaq əvəzinə onları bir modulda təyin edib istənilən proqramda işlətmək daha əlverişlidir. 
Gəlin my_module adlı yeni bir modul düzəldək və daxilində bir neçə funksiya təyin edək:

import math

def absum(a, b):
    s = 0
    for i in range(a, b + 1):
        s += i
    return s

def quadequ(a, b, c):
    d = b**2 - 4*a*c	
     
    if d > 0:
        x1 = (-b + math.sqrt(d)) / (2 * a)
        x2 = (-b - math.sqrt(d)) / (2 * a)
        print('x1 =', x1)
        print('x2 =', x2)  
    elif d == 0:
        x1 = -b / (2 * a)
        print('x1 = x2 =', x1)  
    else:
        print('No real roots.')

def cinstr(c, s):
    n = 0
    for i in s:
        if c == i:
            n += 1 
    return n

def wordlet(s):
    for i in s:
        print(i)

Biz öz modulumuzda sqrt() funksiyasından istifadə edəcəyik deyə başlanğıcda math modulunu daxil etməliyik. Gördüyünüz kimi, bir modul başqa bir modula daxil edilə bilər. Yuxarıdakı proqram kodunu skriptdə yazın və faylı my_module adı ilə yaddaşa verin.
İndi isə bu modulda təyin etdiyimiz funksiyalarla proqram hazırlayaq:

from my_module import *

print('Verilmiş aralıqdakı ədədlər cəmi')
x = int(input('Başlanğıc ədədi daxil edin: '))
y = int(input('Son ədədi daxil edin: '))
t = absum(x,y)
print('Cəm: ', t)

print('Kvadrat tənliyi')
a = float(input('a-nı daxil edin: '))
b = float(input('b-ni daxil edin: '))
c = float(input('c-ni daxil edin: '))
quadequ(a, b, c)

print('Verilmiş hərfin sözdəki sayı')
s = input('Sözü daxil edin: ')
c = input('Hərfi daxil edin: ')
print(cinstr(c, s))

print('Sözün hərf-hərf çapı')
z = input('Sözü daxil edin: ')
wordlet(z)

Gördüyünüz kimi, hər şey çox sadədir. Biz bu şəkildə öz modullarımızı hazırlayıb orada təyin etdiyimiz funksiyalardan tələb olunduğu zaman proqramlarımızda istifadə edə bilərik. Bu proqramı da skriptdə yazın və adını Test qoyaraq modul ilə eyni qovluqda yaddaşa verin. Sonra da icra edərək nəticələri yoxlayın.
Sonda modulların hazırlanması ilə bağlı bir-iki məsələyə də aydınlıq gətirək.

Modulları necə adlandırmalı?

Hazırladığınız modullar gələcəkdə həm özünüz, həm də başqaları tərəfindən istifadə olunacaq. Bu səbəbdən onlara anlaşılan və mənalı adlar verməlisiniz. Modulların adlandırılması dəyişənlərin adlandırılması kimidir, yəni burada da verəcəyiniz adlar latın hərfləri ilə yazılmalı, rəqəmlə başlamamalı və tərkibində rezerv sözlər olmamalıdır.

Modulları harada yerləşdirməli?

Bildiyiniz kimi, proqrama modullar daxil ediləndə interpretator onları sys.path dəyişənində qeyd edilən kataloqlarda (qovluqlarda) axtarır. Siz də hazırladığınız modulları bu kataloqlar daxilində yerləşdirə bilərsiniz. Lakin yaxşı olar ki, öz modullarınız üçün ayrıca bir qovluq düzəldib onların hamısını bir yerdə saxlayasınız. Bu zaman sys.path dəyişənində müvafiq dəyişiklik edərək bu qovluğu əlavə etməyi unutmayın.

Formatlaşdırmanın yeni üsulu

Mövzumuzun əvvəlində qeyd etmişdik ki, Python proqramlaşdırma dilində çıxışların formatlaşdırılmasında üstünlük verilən üsul string sinfinin format metodudur. Çox çevik olan format metodunun ümumi yazılış forması aşağıdakı kimidir:

şablon.format(p0, p1, ..., k0=v0, k1=v1, ...)

Burada şablon formatlaşdırmaq istədiyimiz sətirdir. Bu sətrə bir və ya bir neçə format kodu, başqa sözlə, əvəzlənən sahələr daxil edilir. Fiqurlu {} mötərizə daxilində yazılan format kodları verilmiş arqumentləri formatlaşdıraraq sətir daxilində öz yerinə qoyur. Buradakı arqumentlər isə iki növdə verilə bilər: mövqeli (p0, p1,…) və açar sözlü (k0=v0, k1=v1,…). Qeyd edək ki, formatlaşdırma zamanı mövqeli və açar sözlü arqumentləri həm ayrı-ayrılıqda, həm də eyni zamanda (öndə mövqelilər, ardınca açar sözlülər olmaqla) istifadə etmək mümkündür.

Aşağıdakı sxem format metodunun mövqeli arqumentlərlə necə işlədiyini göstərir:


Yuxarıdakı yazılışdan da gördüyünüz kimi, mövqeli arqumentlər format kodları vasitəsilə şablonda (formatlaşdırılan sətirdə) öz yerlərinə qoyulur. Bizim nümunədə iki format kodu var: {0:5d}{1:8.2f}. Hər bir format kodu sıra sayı, qoşa nöqtə və format şəklindən (opsiya, genişlik və tip) ibarətdir.

>>> "Məhsul kod:{0:5d}, qiymət:{1:8.2f}".format(254, 65.076)
'Məhsul kod:  254, qiymət:   65.08'
>>>

Aşağıda verilmiş digər nümunələri də nəzərdən keçirin:

>>> "1-ci arqument: {0}, 2-ci arqument: {1}".format(55,11)
'1-ci arqument: 55, 2-ci arqument: 11'
>>> "2-ci arqument: {1}, 1-ci arqument: {0}".format(55,11)
'2-ci arqument: 11, 1-ci arqument: 55'
>>> "2-ci arqument: {1:3d}, 1-ci arqument: {0:7.2f}".format(55.23,11)
'2-ci arqument:  11, 1-ci arqument:   55.23'
>>> "1-ci arqument: {}, 2-ci arqument: {}".format(55,11)
'1-ci arqument: 55, 2-ci arqument: 11'
>>> "Müxtəlif dəqiqlik: {0:6.2f} və {0:6.3f}".format(1.6238)
'Müxtəlif dəqiqlik:   1.62 və  1.624'
>>>

Burada bir məqamı da qeyd edək ki, mövqeli arqumentlərdən verilmiş ardıcıllıqda istifadə edildiyi təqdirdə şablondakı format kodlarında sıra sayını, dördüncü nümünədə olduğu kimi, boş buraxmaq olar.
Aşağıdakı sxem isə format metodunun açar sözlü arqumentlərlə necə işlədiyini göstərir:

Sxemdən gördüyünüz kimi, açar sözlü arqumentlər də mövqeli arqumentlər kimi format kodları vasitəsilə şablonda (formatlaşdırılan sətirdə) öz yerlərinə qoyulur. Burada fərq yalnız ondan ibarətdir ki, arqumentlər açar=qiymət şəklində göstərilir.

>>> "Məhsul kod: {a:5d}, qiymət: {b:8.2f}".format(a=254, b=65.076)
'Məhsul kod:   254, qiymət:    65.08'
>>>

Çıxışları format metodu ilə formatlaşdırarkən format kodlarında əlavə olaraq aşağıdakı opsiyalardan da istifadə edə bilərsiniz:

OpsiyaTəyinatı
<Çıxış veriləni soldan nizamlanır. Sətirlər üçün bu, adətən, default (susmaya görə) nizamlanmadır.
>Çıxış veriləni sağdan nizamlanır. Ədədlər üçün bu default (susmaya görə) nizamlanmadır.
^Çıxış veriləni onun üçün ayrılmış yerdə mərkəzdən nizamlanır.
0Format şəkli daxilində genişlikdən öncə yazıldıqda, ədəd tipli çıxışların önünü boş mövqelərin sayı qədər sıfırlarla tamamlayır.
,Ədəd tipli çıxışları minlik ayırıcı simvol ilə çıxarır.
=Ədəd tipli çıxışlarda ədəd ilə işarəsinin (əgər varsa) arasını ön məsafə (və ya verilmiş simvol) ilə doldurur.
+Ədəd tipli çıxış verilənlərinin önündə mənfi ədədlərdə olduğu kimi, müsbət ədədlərdə də onların işarəsini çıxarır. 
Çıxış veriləni yalnız mənfi ədəd olduqda önündə onun işarəsini çıxarır. Bu, onsuz da default olaraq (susmaya görə) belədir.
boşluqÇıxış veriləni müsbət ədəd olduqda önünə boşluq (probel) qoyur.

Aşağıda verilmiş nümunələri nəzərdən keçirin:

>>> '{0:<20s} {1:4d}'.format('Təvəllüd:',1978)
'Təvəllüd:            1978'
>>> '{0:>20s} {1:4d}'.format('Təvəllüd:',1978)
'           Təvəllüd: 1978'
>>> '{0:^20s} {1:4d}'.format('Təvəllüd:',1978)
'     Təvəllüd:       1978'
>>>
>>> 'Sıra sayı: {:06d}'.format(125)
'Sıra sayı: 000125'
>>> 'Büdcə kəsiri: {:,d} manat'.format(1698000000)
'Büdcə kəsiri: 1,698,000,000 manat'
>>> '{:=6d}'.format((-23))
'-   23'
>>> "Anarın {:*=6d} manat pulu var".format(15)
'Anarın ****15 manat pulu var'
>>>
>>> 'Bakı {:+2d}°C'.format(5)
'Bakı +5°C'
>>> 'Bişkek {:+2d}°C'.format(-5)
'Bişkek -5°C'
>>> 'Aşqabad {:-2d}°C'.format(12)
'Aşqabad 12°C'
>>> 'Astana {:-2d}°C'.format(-12)
'Astana -12°C'
>>>
>>> '{: d}'.format(15)
' 15'
>>> '{: d}'.format(-15)
'-15'
>>>

Yeri gəlmişkən, bir məsələni də aydınlaşdıraq. Diqqət yetirsəniz, görəcəksiniz ki, formatlaşdırılmış çıxışlar ekrana dırnaq işarələri arasında çıxır:

>>> "{cnt} - {cap}".format(cnt = "Azərbaycan", cap = "Bakı")
'Azərbaycan - Bakı'
>>>

print() funksiyasından istifadə etməklə “dırnaqsız” çıxış ala bilərik:

>>> print("{cnt} - {cap}".format(cnt = "Azərbaycan", cap = "Bakı"))
Azərbaycan - Bakı
>>>

Burada əlavə dəyişəndən istifadə etməklə yazılışı sadələşdirmək də mümkündür:

>>> s = "{cnt} - {cap}"
>>> print(s.format(cnt = "Azərbaycan", cap = "Bakı"))
Azərbaycan - Bakı
>>>

format metodunda lüğətlərin istifadəsi

Artıq bilirsiniz ki, yeni üsulla çıxışlar mövqeli və/və ya açar sözlü arqumentlərdən istifadə etməklə formatlaşdırılır. Mövqeli arqumetlərlə bağlı qeyri-adi heç nə yoxdur, amma açar sözlü arqumentlərə diqqətlə baxsanız, sizə əvvəlki mövzulardan tanış gələn bir şey görəcəksiniz:

>>> s = "{cnt} - {cap}"
>>> print(s.format(cnt = "Azərbaycan", cap = "Bakı"))
Azərbaycan - Bakı
>>>

Yəqin ki, xatırladınız, buradakı arqumentlər lüğətdir, yəni dictionary tipindəki verilənlərdir. O zaman yuxarıdakı misalı aşağıdakı şəkildə də yaza bilərik:

>>> cnt_cap = {"cnt":"Azərbaycan", "cap":"Bakı"}
>>> s="{cnt} - {cap}"
>>> print(s.format(**cnt_cap))
Azərbaycan - Bakı
>>> 

Burada arqumentlərin sayı lüğətin elementlərinin sayından asılıdır. Başqa sözlə, format metoduna ötürülən açar sözlü arqumentlərin sayı ixtiyaridir.  Məhz buna görə də, metod daxilindəki cnt_cap parametrinin önünə qoşa ulduz (**) simvolu qoyulmalıdır. Xatırlayırsınızsa, biz funksiyaları ixtiyari uzunluqlu arqumentlərlə təyin edərkən də bu qoşa ulduzdan (**) istifadə edirdik.

Gəlin daha bir proqram yazaq. Bu proqram Türk dövlətlərinin adlarını paytaxtları ilə bərabər ekrana çıxaracaq:

turk_rep = {"Azərbaycan":"Bakı",
            "Türkiyə":"Ankara",
            "Qazaxıstan":"Astana",
            "Qırğızıstan":"Bişkek",
            "Özbəkistan":"Daşkənd",
            "Türkmənistan":"Aşqabad",
            "Macarıstan":"Budapeşt"
            "ŞKTR":"Şimali Lefkoşa"}

print("Türk Dövlətləri və paytaxtları:")
for a in turk_rep:
    s = a + " - {" + a + "}"
    print(s.format(**turk_rep))

Proqramı skriptdə yazın və icra edin.

format metodunda lokal dəyişən adlarının istifadəsi

Python proqramlaşdırma dilində locals() adlı daxili bir funksiya var. Bu funksiya cari təsir sahəsinin lokal dəyişənləri və onların qiymətlərindən ibarət lüğəti qaytarır. Lokal dəyişənlərin adları lüğətin açarları, bu dəyişənlərin müvafiq qiymətləri isə açarların qiymətləri olur.
Aşağıdakı nümunəni nəzərdən keçirək:

>>> a = 11
>>> b = 22
>>> def f(): return 33

>>> locals()
{'b': 22, '__name__': '__main__', '__spec__': None, 'a': 11, 'f': <function f at 0x105654620>, '__package__': None, '__doc__': None, '__loader__': <class '_frozen_importlib.BuiltinImporter'>, '__builtins__': <module 'builtins' (built-in)>}
>>>

Biz locals() funksiyasının qaytardığı lüğətdən format metodunun parametri kimi istifadə edə bilərik:

>>> print("a={a}, b={b}, f={f}".format(**locals()))
a=11, b=22, f=<function f at 0x105654620>
>>>

Çıxışların formatlaşdırılması məqsədilə string sinfində digər sətir metodları da nəzərdə tutulmuşdur. Həmin metodlarla müvafiq bölmədə tanış ola bilərsiniz.