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.