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.
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 🙂
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.
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} və {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.
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.
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 lokaldə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.
Bildiyiniz kimi, Guido van Rossum Python dilini meydana gətirərkən C dilindən də müəyyən sintaksis konstruksiyaları götürmüşdür. C dilində isə sırf formatlı çıxışlar üçün nəzərdə tutulan xüsusi printf() və sprintf() kimi funksiyalar vardır. Python dilinə həmin funksiyalar keçməsə də, onların funksionallığını təmin edən % (modul) operatorundan adi print() funksiyası daxilində istifadə etmək mümkündür. Modul (riyazi modul ilə qarışdırmayın) operatoruna çox vaxt sətir modulu və ya sətir interpolyasiyası da deyilir. Aşağıdakı sxem sətir modulu operatorunun necə işlədiyini göstərir:
Yuxarıdakı yazılışdan da gördüyünüz kimi, print() funksiyasına bütöv olaraq ötürülən parametr əslində üç hissədən ibarətdir:
Burada qiymətlər kortejinin elementləri literal, dəyişən və ya ixtiyari riyazi ifadədən ibarət ola bilər. Kortejin elementləri placeholders (yerləşdirmə göstəriciləri) vasitəsilə sətir formatında öz yerlərinə qoyulur. Bizim nümunədə iki (%5d və %8.2f) placeholder var. Placeholderin yazılışının ümumi sintaksisi aşağıdakı kimidir:
%[bayraqlar][genişlik][.dəqiqlik]tip
Burada bayraqlar bəzi konversiya (çevrilmə) tiplərinin nəticəsinə təsir edən parametrlərdir. Bu konversiya parametrlərinin istifadəsi opsionaldır (istəyə bağlıdır). Aşağıdakı cədvəldə onlarla tanış ola bilərsiniz:
Bayraq
Təyinatı
#
o, x və ya X spesifikatorları ilə istifadə edildiyi zaman çıxış qiymətlərinin önünə müvafiq olaraq 0, 0o, 0O, 0x və ya 0X simvolları əlavə edilir.
0
Ədədi qiymətlər üçün konversiya nəticəsi ön məsafəsiz çıxır.
–
Konversiya nəticələri soldan nizamlanır.
+
Ədədi qiymətlərdə istifadə edildiyi zaman onların işarəsi (“+” və ya “-“) konversiya nəticəsinin önündə göstərilir.
boşluq
Bayraq olaraq boşluq (probel) yazıldıqda müsbət çıxış qiymətlərinin önünə boşluq (probel) qoyulur.
Placeholderin yazılışında göstərilən genişlik ədədi qiymətlərdə çıxış veriləni üçün soldan sağa ayrılmış xanaların ümumi sayıdır. Əgər çıxış veriləni həqiqi ədəddirsə, vergüldən sonrakı rəqəmlərinin sayını bildirmək üçün dəqiqlik də göstərilməlidir:
Əgər çıxış qiymətində vergüldən sonrakı rəqəmlərin sayı onun üçün qeyd olunan dəqiqlikdən çoxdursa, yuvarlaqlaşdırma, azdırsa, sıfırlarla tamamlama baş verəcək. Aşağıdakı cədvəldə isə placeholderdə göstərilə bilən tiplər verilmişdir:
Konversiya
Təyinatı
d
Çıxışa işarəlionluq tam ədəd çıxarır.
i
Çıxışa işarəlionluqtam ədəd çıxarır.
u
Çıxışa işarəsiz onluq tam ədəd çıxarır.
o
Çıxışa işarəsiz səkkizlik ədəd çıxarır.
x
Çıxışa işarəsiz onaltılıq ədəd çıxarır (aşağı registr).
X
Çıxışa işarəsiz onaltılıq ədəd çıxarır (yuxarı registr).
e
Çıxışa eksponensialformatdahəqiqi ədəd çıxarır (aşağı registr).
E
Çıxışa eksponensialformatdahəqiqi ədəd çıxarır (yuxarı registr).
f
Çıxışa onluq həqiqi ədəd çıxarır.
F
Çıxışa onluq həqiqi ədəd çıxarır.
g
Eksponent -4-dən böyük və ya dəqiqlikdən kiçik olduqda e,əks halda, f konversiyası ilə eynidir.
G
Eksponent -4-dən böyük və ya dəqiqlikdən kiçik olduqda E,əks halda, F konversiyası ilə eynidir.
c
Çıxışa tək simvol çıxarır.
r
Çıxışa sətir çıxarır. (istənilən Python obyektini repr() funksiyası ilə çevirir).
s
Çıxışa sətir çıxarır (istənilən Python obyektini str() funksiyası ilə çevirir).
a
Çıxışa sətir çıxarır (istənilən Python obyektini ascii() funksiyası ilə çevirir).
%
Çıxışa yalnız % simvolunu çıxarır.
İndi isə gəlin bizim misaldakı placeholderləri nəzərdən keçirək:
Burada birinci olan %5d placeholderi kortejin ilk elementi olan 254 qiymətini sətir formatında öz yerinə yerləşdirir. Bu zaman çıxış veriləni üçün beş xanalıq yer ayrılır və o işarəlionluq tam ədəd şəklində konversiya olunur. Diqqət edin ki, çıxış veriləni üçün beş yer ayrıldığı halda onun özü üç rəqəmlidir. Məhz buna görə də, bu qiymət çıxışa önündə iki boşluqla gəlir. Misalda ikinci olan %8.2f placeholderinə gəlincə isə görmək olar ki, o 65.076 qiymətini onluq həqiqi ədəd şəklində konversiya edir. Çıxış veriləni üçün ümumilikdə səkkiz, vergüldən sonrakı rəqəmlər üçün (dəqiqlik) iki xanalıq yer ayrılır. Dəqiqlik üçün ayrılan xanaların sayı bir vahid az olduğuna görə çıxışda ədəd bir mövqe yuvarlaqlaşdırılır. Aşağıda verilmiş digər nümunələri də nəzərdən keçirin:
İlk baxışdan elə görünsə də, əslində formatlaşdırmaprint() funksiyasının bir parçası deyildir. Yazdığımız misallara diqqətlə nəzər yetirsəniz, görəcəksiniz ki, bütün hallarda print() funksiyasına ötürülən parametr sətir modulu (%) operatoru ilə formatlaşdırılan sətirdir. Köhnə üsulla çıxışları formatlaşdırarkən biz aşağıdakı ardıcıllıqdan da istifadə edə bilərdik:
>>> s = "Məhsul kod:%5d, qiymət:%8.2f" % (254, 65.076)
>>> print(s)
Məhsul kod: 254, qiymət: 65.08
>>>