9. Modullar va paketlar

Python dasturi kattalashgani sari barcha kodni bitta faylda saqlash noqulay bo‘lib qoladi.

Kodlarni alohida fayllarga ajratish orqali:

kodni tartibli saqlash
kodni qayta ishlatish
loyihani boshqarishni osonlashtirish
funksiyalarni alohida modullarga ajratish
katta loyihalarni qismlarga bo‘lish

mumkin.

Python'da bitta .py fayl modul deb ataladi.

Bir nechta modullarni tartibli guruhlash esa paket hosil qiladi.


Modul nima?

Masalan, hisoblash.py nomli fayl yaratamiz:

def qoshish(
    birinchi_son,
    ikkinchi_son
):

    return (
        birinchi_son
        + ikkinchi_son
    )


def ayirish(
    birinchi_son,
    ikkinchi_son
):

    return (
        birinchi_son
        - ikkinchi_son
    )

Bu fayl modul hisoblanadi.

Boshqa fayldan undan foydalanish mumkin.

Masalan, asosiy.py:

import hisoblash

natija = hisoblash.qoshish(
    10,
    20
)

print(
    f"Natija: {natija}"
)

Natija:

Natija: 30

import

Modulni ulashning eng oddiy usuli:

import hisoblash

Keyin modul nomi orqali funksiyalardan foydalanamiz:

natija = hisoblash.qoshish(
    10,
    20
)

print(
    f"Yig‘indi: {natija}"
)

Bir nechta modulni import qilish

import matematika
import vaqt
import tasodifiy

Keyinchalik:

natija = matematika.qoshish(
    5,
    7
)

kabi foydalanish mumkin.


from ... import

Modulning faqat kerakli funksiyasini import qilish mumkin.

from hisoblash import qoshish

Endi modul nomini yozish shart emas:

natija = qoshish(
    10,
    20
)

print(
    f"Natija: {natija}"
)

Bir nechta funksiyani import qilish

from hisoblash import qoshish, ayirish

Keyin:

yigindi = qoshish(
    20,
    10
)

farq = ayirish(
    20,
    10
)

print(
    f"Yig‘indi: {yigindi}"
)

print(
    f"Farq: {farq}"
)

import *

Moduldagi barcha nomlarni import qilish mumkin:

from hisoblash import *

Lekin katta loyihalarda bundan foydalanish tavsiya etilmaydi.

Sababi koddagi nomlar qayerdan kelganini aniqlash qiyinlashadi.

Masalan:

from hisoblash import *
from matematika import *

Agar ikkala modulda ham bir xil nomli funksiya bo‘lsa, chalkashlik paydo bo‘lishi mumkin.

Shuning uchun quyidagisi aniqroq:

import hisoblash

natija = hisoblash.qoshish(
    10,
    20
)

Modulga boshqa nom berish

as yordamida modul uchun qisqa nom berish mumkin.

import hisoblash as hisob

Keyin:

natija = hisob.qoshish(
    10,
    20
)

print(
    f"Natija: {natija}"
)

Import qilingan funksiyaga nom berish

from hisoblash import qoshish as yigindi_hisobla

Keyin:

natija = yigindi_hisobla(
    10,
    20
)

print(
    f"Yig‘indi: {natija}"
)

Modul ichidagi o‘zgaruvchilar

Modul faqat funksiyalardan iborat bo‘lishi shart emas.

foydalanuvchi.py:

foydalanuvchi_nomi = "Softromeda"
foydalanuvchi_yoshi = 25


def malumot_ber():

    print(
        f"Ism: {foydalanuvchi_nomi}"
    )

    print(
        f"Yosh: {foydalanuvchi_yoshi}"
    )

Boshqa faylda:

import foydalanuvchi

print(
    foydalanuvchi.foydalanuvchi_nomi
)

foydalanuvchi.malumot_ber()

__name__

Python'da maxsus __name__ o‘zgaruvchisi mavjud.

Agar fayl to‘g‘ridan-to‘g‘ri ishga tushirilsa:

print(
    __name__
)

natija:

__main__

Agar boshqa modul tomonidan import qilinsa, __name__ modul nomiga teng bo‘ladi.


if __name__ == "__main__"

Bu Python'dagi juda muhim konstruksiyalardan biridir.

Masalan:

def salom_ber():

    print(
        "Salom, Softromeda!"
    )


if __name__ == "__main__":

    salom_ber()

Bu kod fayl to‘g‘ridan-to‘g‘ri ishga tushirilganda ishlaydi.

Agar fayl boshqa moduldan import qilinsa, salom_ber() avtomatik ishlamaydi.


Nima uchun __main__ kerak?

Faraz qilamiz:

loyiha/
    asosiy.py
    yordamchi.py

yordamchi.py:

def salom_ber():

    print(
        "Salom, Softromeda!"
    )


if __name__ == "__main__":

    print(
        "Yordamchi modul ishga tushdi."
    )

asosiy.py:

import yordamchi

yordamchi.salom_ber()

asosiy.py ishga tushirilganda:

Salom, Softromeda!

chiqadi.

Ammo:

Yordamchi modul ishga tushdi.

chiqmaydi.


Standart modullar

Python juda ko‘p tayyor modullar bilan keladi.

Masalan:

math
random
datetime
os
sys
json
pathlib
statistics
re

Ularni alohida o‘rnatish shart emas.


math moduli

Matematik amallar uchun math modulidan foydalanish mumkin.

import math

natija = math.sqrt(
    144
)

print(
    f"Ildiz: {natija}"
)

Natija:

Ildiz: 12.0

math konstantalari

import math

print(
    f"Pi: {math.pi}"
)

print(
    f"Euler soni: {math.e}"
)

math.ceil()

Sonni yuqoriga qarab yaxlitlaydi.

import math

natija = math.ceil(
    4.2
)

print(
    f"Natija: {natija}"
)

Natija:

Natija: 5

math.floor()

Sonni pastga qarab yaxlitlaydi.

import math

natija = math.floor(
    4.8
)

print(
    f"Natija: {natija}"
)

Natija:

Natija: 4

math.pow()

Darajaga ko‘tarish:

import math

natija = math.pow(
    2,
    3
)

print(
    f"Natija: {natija}"
)

Natija:

Natija: 8.0

random moduli

Tasodifiy qiymatlar bilan ishlash uchun random moduli ishlatiladi.

import random

tasodifiy_son = random.randint(
    1,
    100
)

print(
    f"Tasodifiy son: {tasodifiy_son}"
)

random.choice()

Listdan tasodifiy element tanlash:

import random

mevalar = [
    "olma",
    "banan",
    "anor",
    "uzum"
]

tanlangan_meva = random.choice(
    mevalar
)

print(
    f"Tanlangan meva: {tanlangan_meva}"
)

random.shuffle()

List elementlarini tasodifiy tartibga keltiradi.

import random

sonlar = [
    1,
    2,
    3,
    4,
    5
]

random.shuffle(
    sonlar
)

print(
    f"Tasodifiy tartib: {sonlar}"
)

datetime

Sana va vaqt bilan ishlash uchun datetime modulidan foydalaniladi.

from datetime import datetime

hozirgi_vaqt = datetime.now()

print(
    f"Hozirgi vaqt: {hozirgi_vaqt}"
)

Faqat sanani olish

from datetime import datetime

bugungi_sana = datetime.now().date()

print(
    f"Bugungi sana: {bugungi_sana}"
)

Vaqtni formatlash

from datetime import datetime

hozirgi_vaqt = datetime.now()

formatlangan_vaqt = (
    hozirgi_vaqt.strftime(
        "%Y-%m-%d %H:%M:%S"
    )
)

print(
    f"Hozirgi vaqt: {formatlangan_vaqt}"
)

timedelta

Sana va vaqtga vaqt oralig‘ini qo‘shish yoki ayirish mumkin.

from datetime import datetime, timedelta

bugun = datetime.now()

ertaga = (
    bugun
    + timedelta(days=1)
)

print(
    f"Ertangi sana: {ertaga.date()}"
)

pathlib

Fayl va papkalar bilan ishlash uchun pathlib juda qulay.

from pathlib import Path

joriy_papka = Path.cwd()

print(
    f"Joriy papka: {joriy_papka}"
)

Fayl mavjudligini tekshirish

from pathlib import Path

fayl = Path(
    "malumot.txt"
)

if fayl.exists():

    print(
        "Fayl mavjud."
    )

else:

    print(
        "Fayl mavjud emas."
    )

Papka yaratish

from pathlib import Path

papka = Path(
    "malumotlar"
)

papka.mkdir(
    exist_ok=True
)

print(
    "Papka tayyor."
)

Paket nima?

Paket — bir nechta Python modullarini bir joyda tashkil qilish usuli.

Masalan:

softromeda/
    asosiy.py
    hisoblash/
        __init__.py
        matematika.py
        statistika.py

Bu yerda:

softromeda
    → loyiha

hisoblash
    → paket

matematika.py
    → modul

statistika.py
    → modul

Paketdan modul import qilish

from hisoblash import matematika

natija = matematika.qoshish(
    10,
    20
)

print(
    f"Natija: {natija}"
)

Paket ichidan funksiya import qilish

from hisoblash.matematika import qoshish

natija = qoshish(
    10,
    20
)

print(
    f"Yig‘indi: {natija}"
)

__init__.py

Paket ichida __init__.py fayli bo‘lishi mumkin.

Masalan:

hisoblash/
    __init__.py
    matematika.py
    statistika.py

__init__.py paket ishga tushirilganda bajarilishi kerak bo‘lgan boshlang‘ich kod yoki paket API'sini tashkil qilish uchun ishlatilishi mumkin.


O‘z modulimizni yaratish

Keling, kichik modul yaratamiz.

salomlashish.py:

def salomlashish(
    ism
):

    return (
        f"Salom, {ism}!"
    )


def xayrlashish(
    ism
):

    return (
        f"Xayr, {ism}!"
    )

asosiy.py:

import salomlashish

birinchi_xabar = (
    salomlashish.salomlashish(
        "Softromeda"
    )
)

ikkinchi_xabar = (
    salomlashish.xayrlashish(
        "Softromeda"
    )
)

print(
    birinchi_xabar
)

print(
    ikkinchi_xabar
)

Natija:

Salom, Softromeda!
Xayr, Softromeda!

Modul orqali kodni ajratish

Katta dasturda quyidagi tuzilma foydali:

softromeda/
    asosiy.py
    foydalanuvchi.py
    mahsulot.py
    hisoblash.py

Masalan:

foydalanuvchi.py
    → foydalanuvchi bilan bog‘liq funksiyalar

mahsulot.py
    → mahsulot bilan bog‘liq funksiyalar

hisoblash.py
    → hisob-kitob funksiyalari

asosiy.py
    → dasturning asosiy qismi

Bu kodni boshqarishni osonlashtiradi.


Modulga obyekt yaratish

Modul ichida class ham bo‘lishi mumkin.

foydalanuvchi.py:

class Foydalanuvchi:

    def __init__(
        self,
        ism,
        yosh
    ):

        self.ism = ism
        self.yosh = yosh

    def malumot_ber(
        self
    ):

        return (
            f"Ism: {self.ism}, "
            f"Yosh: {self.yosh}"
        )

asosiy.py:

from foydalanuvchi import Foydalanuvchi

foydalanuvchi = Foydalanuvchi(
    "Softromeda",
    25
)

print(
    foydalanuvchi.malumot_ber()
)

Natija:

Ism: Softromeda, Yosh: 25

Tashqi paketlar

Python'da standart kutubxonadan tashqari boshqa dasturchilar yaratgan paketlardan ham foydalanish mumkin.

Bunday paketlar odatda pip yordamida o‘rnatiladi.

Masalan:

pip install requests

Keyin:

import requests

orqali foydalanish mumkin.


Virtual muhit

Loyihalarda paketlarni alohida muhitda saqlash juda muhim.

Virtual muhit yaratish:

python -m venv muhit

Windows'da faollashtirish:

muhit\Scripts\activate

Linux yoki macOS'da:

source muhit/bin/activate

Virtual muhit faol bo‘lgandan keyin o‘rnatilgan paketlar shu loyiha muhitida saqlanadi.


pip

pip Python paketlarini o‘rnatish va boshqarish uchun ishlatiladi.

Paket o‘rnatish:

pip install requests

Paketni o‘chirish:

pip uninstall requests

O‘rnatilgan paketlarni ko‘rish:

pip list

requirements.txt

Loyiha ishlatadigan paketlarni faylda saqlash mumkin.

Masalan:

requests==2.32.5

Keyin barcha paketlarni o‘rnatish:

pip install -r requirements.txt

Bu ayniqsa loyihani boshqa kompyuterga ko‘chirishda foydali.


Modul import qilishda xatolar

Agar modul topilmasa:

import mavjud_emas

Python:

ModuleNotFoundError

xatoligini chiqaradi.

Masalan:

try:

    import mavjud_emas

except ModuleNotFoundError:

    print(
        "Kerakli modul topilmadi."
    )

Import tartibi

Katta loyihalarda importlarni odatda guruhlash yaxshi amaliyot hisoblanadi.

Masalan:

import os
import json
import math

from datetime import datetime

from foydalanuvchi import Foydalanuvchi

Avval standart kutubxonalar, keyin tashqi paketlar, undan keyin loyiha modullari joylashtiriladi.


Modulning asosiy afzalliklari

Modullar yordamida:

Kod bo‘linadi
Kod qayta ishlatiladi
Loyiha tartibli bo‘ladi
Test yozish osonlashadi
Xatolarni topish osonlashadi
Jamoa bilan ishlash qulaylashadi

Masalan, 5000 qatorlik bitta fayl o‘rniga:

asosiy.py
foydalanuvchi.py
mahsulot.py
buyurtma.py
hisoblash.py

kabi alohida modullardan foydalanish mumkin.


Amaliy mashqlar

Mashq 1

hisoblash.py modulini yarating va unga quyidagi funksiyalarni yozing:

qoshish()
ayirish()
kopaytirish()
bolish()

Mashq 2

asosiy.py faylidan hisoblash.py modulini import qiling.

Mashq 3

foydalanuvchi.py modulida Foydalanuvchi classini yarating.

Mashq 4

datetime yordamida hozirgi sanani chiqaring.

Mashq 5

random yordamida 1 dan 100 gacha tasodifiy son yarating.

Mashq 6

pathlib yordamida yangi papka yarating.

Mashq 7

O‘zingizning paket tuzilishingizni yarating:

softromeda/
    asosiy.py
    hisoblash/
        __init__.py
        matematika.py
        statistika.py

Mashq 8

requirements.txt faylini yarating va unga loyiha paketlarini yozing.


Mini loyiha — Softromeda hisoblash tizimi

Loyihani bir nechta modulga ajratamiz.

Tuzilma:

softromeda/
    asosiy.py
    hisoblash.py

hisoblash.py:

def qoshish(
    birinchi_son,
    ikkinchi_son
):

    return (
        birinchi_son
        + ikkinchi_son
    )


def ayirish(
    birinchi_son,
    ikkinchi_son
):

    return (
        birinchi_son
        - ikkinchi_son
    )


def kopaytirish(
    birinchi_son,
    ikkinchi_son
):

    return (
        birinchi_son
        * ikkinchi_son
    )


def bolish(
    birinchi_son,
    ikkinchi_son
):

    if ikkinchi_son == 0:

        return None

    return (
        birinchi_son
        / ikkinchi_son
    )

asosiy.py:

import hisoblash

birinchi_son = 20
ikkinchi_son = 5

yigindi = hisoblash.qoshish(
    birinchi_son,
    ikkinchi_son
)

ayirma = hisoblash.ayirish(
    birinchi_son,
    ikkinchi_son
)

kopaytma = hisoblash.kopaytirish(
    birinchi_son,
    ikkinchi_son
)

bolinma = hisoblash.bolish(
    birinchi_son,
    ikkinchi_son
)

print(
    f"Yig‘indi: {yigindi}"
)

print(
    f"Ayirma: {ayirma}"
)

print(
    f"Ko‘paytma: {kopaytma}"
)

print(
    f"Bo‘linma: {bolinma}"
)

Natija:

Yig‘indi: 25
Ayirma: 15
Ko‘paytma: 100
Bo‘linma: 4.0

Bob xulosasi

Bu bobda Python'da kodni modullarga va paketlarga ajratishni o‘rgandik.

Asosiy tushunchalar:

modul
import
from ... import
as
__name__
__main__
paket
__init__.py
pip
virtual muhit
requirements.txt

Shuningdek Python standart kutubxonasidagi:

math
random
datetime
pathlib

modullari bilan tanishdik.

Eng muhim g‘oya:

Kichik dastur
    ↓
Bir nechta funksiya

Katta dastur
    ↓
Bir nechta modul

Juda katta loyiha
    ↓
Modullar + paketlar

Keyingi bobda xatolarni boshqarish, try, except, else, finally va o‘zimizning xatolarimizni yaratishni o‘rganamiz.