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.

Modulların kompilyasiyası

Öncə də qeyd etdiyimiz kimi, modulların istifadəsi həm də o cəhətdən faydalıdır ki, irihəcmli proqramları daha kiçik hissələrə ayırıb modullarda yerləşdirmək olar. Bu da öz növbəsində proqram kodunun mürəkkəbliyini azaltmağa imkan verir. Bu halda əsas proqrama çox sayda modullar daxil edilmiş olur. Proqramların daha sürətli yüklənməsini təmin etmək məqsədilə bu modullar kompilyasiya olunaraq bayt-koda çevrilirlər. Sonra proqramların növbəti icrası zamanı daxil edilmiş modullara rast gəlinəndə onların əvəzinə həmin bayt-kodlardan istifadə olunur. Kompilyasiya olunmuş modullar platformadan asılı deyil, odur ki, başqa əməliyyat sistemli kompüterlərdə də istifadə edilə bilər.
Python proqrama import instruksiyası ilə daxil edilən modulları avtomatik şəkildə kompilyasiya edir və .pyc genişləməli fayllarda saxlayır. Kompilyasiya olunmuş bu fayllar __pycache__ kataloqunda yerləşdirilir:

>>> import my_module 
>>> import test_module


Modulları proqram yolu ilə də kompilyasiya etmək mümkündür. Bunun üçün py_compile modulunun compile() funksiyasından istifadə etmək lazımdır:

>>> import py_compile
>>> py_compile.compile('my_module.py')
'__pycache__/my_module.cpython-311.pyc'
>>> 

Bir qovluqda yerləşən bütün faylları kompilyasiya etmək üçün isə compileall modulunun compile_dir() funksiyasından istifadə olunmalıdır:

>>> import compileall
>>> compileall.compile_dir('C:\\Python311
\\Dersler', force = True)
Listing 'C:\\Python311\\Dersler'...
Compiling 'C:\\Python311\\Dersler\\Paytaxt.py'...
Compiling 'C:\\Python311\\Dersler\\module_test.py'...
Compiling 'C:\\Python311\\Dersler\\my_module.py'...
1
>>>

Sonda onu da deyək ki, modulları əmr sətrindən yararlanmaqla da kompilyasiya etmək mümkündür.

Yenidən yüklənmə

Effektivlik baxımından interpretatorla hər iş seansında modullar yalnız bir dəfə daxil edilir. Odur ki, əgər modul kodlarında hər hansı dəyişiklik etmisinizsə, bu dəyişikliklərin qüvvəyə minməsi üçün ya interpretator yenidən işə salınmalı, ya da daxil etdiyiniz modul yenidən yüklənməlidir.
Modulun yenidən yüklənməsi importlib modulunun reload() funksiyası vasitəsilə həyata keçirilir. Bu funksiya çağırılmazdan öncə yenidən yükləmək istədiyimiz modul bir daha daxil edilməlidir. Mövzunun tam anlaşılması üçün gəlin bunu təcrübədə tətbiq edək. Nümunə üçün yuxarıda hazırladığımız my_module modulunun quadequ() funksiyasında cüzi bir dəyişiklik edib bu modulu yenidən yükləyəcəyik.
Xatırlayırsınızsa, quadequ() funksiyasında kvadrat tənliyin real kökü olmayanda print(‘No real roots.’) ifadəsi icra edilirdi. Biz bu funksiyanı bir dəfə icra etdikdən sonra modula daxil olub həmin ifadəni print(‘Həqiqi köklər yoxdur.’) ilə əvəzləyəcəyik. Sonra my_module modulunu yenidən yükləyib quadequ() funksiyasının yenilənmiş variantını çağıracağıq:

>>> import my_module
>>> import importlib
>>> my_module.quadequ(1, 2, 3)
No real roots.
>>> import my_module
>>> importlib.reload(my_module)
<module 'my_module' from 'C:\\Python34\\my_module.py'>
>>> my_module.quadequ(1, 2, 3)
Həqiqi köklər yoxdur.
>>>

Burada my_module modulunda müvafiq dəyişiklikləri etdikdən sonra onu yaddaşa verməyi unutmayın.