18-bo‘lim

Standart kutubxona amaliyoti

Kundalik ishda eng ko'p kerak bo'ladigan modullar: collections, re (regex), datetime, os/pathlib, math/statistics va argparse.

🕑 15 daqiqa o‘qish 📄 735 so‘z 👁 7 marta ko‘rilgan
Ushbu bo‘lim mundarijasi
  1. collections - kengaytirilgan to'plamlar
  2. Counter - sanash
  3. defaultdict - standart qiymatli lug'at
  4. namedtuple va dataclass
  5. deque - ikki tomonlama navbat
  6. re - muntazam ifodalar (regex)
  7. Amaliy misol: kiritilgan ma'lumotni tekshirish
  8. datetime - sana va vaqt
  9. os va pathlib - fayl tizimi
  10. math va statistics
  11. argparse - buyruq satri argumentlari
  12. Modullar qisqacha jadvali
  13. Xulosa

Python bilan ishlashning eng katta sirlaridan biri - g'ildirakni qaytadan ixtiro qilmaslik. Kerakli funksiya ko'p hollarda standart kutubxonada allaqachon bor.

collections - kengaytirilgan to'plamlar #

Counter - sanash #

Python
from collections import Counter

matn = "python dasturlash tili python bilan ishlash python kuchli"
sozlar = matn.split()

hisoblagich = Counter(sozlar)

print(hisoblagich)
print(hisoblagich["python"])
print(hisoblagich.most_common(3))
Natija
Counter({'python': 3, 'dasturlash': 1, 'tili': 1, 'bilan': 1, 'ishlash': 1, 'kuchli': 1})
3
[('python', 3), ('dasturlash', 1), ('tili', 1)]

8-bo'limda so'zlar chastotasini qo'lda hisoblagandik - Counter buni bitta satrda bajaradi.

Python
from collections import Counter

# Harflar chastotasi
harflar = Counter("dasturlash")
print(harflar.most_common(3))

# Ikki hisoblagichni qo'shish
birinchi_hafta = Counter({"Python": 12, "SQL": 5})
ikkinchi_hafta = Counter({"Python": 8, "Git": 3})
print(birinchi_hafta + ikkinchi_hafta)
Natija
[('a', 2), ('s', 2), ('d', 1)]
Counter({'Python': 20, 'SQL': 5, 'Git': 3})

defaultdict - standart qiymatli lug'at #

Python
from collections import defaultdict

talabalar = [
    ("Toshkent", "Husanboy"),
    ("Namangan", "Sardor"),
    ("Toshkent", "Malika"),
    ("Buxoro", "Bekzod"),
    ("Toshkent", "Nodira"),
]

# Oddiy lug'at bilan
guruhlar = {}
for shahar, ism in talabalar:
    if shahar not in guruhlar:
        guruhlar[shahar] = []
    guruhlar[shahar].append(ism)

# defaultdict bilan - tekshiruv kerak emas
guruhlar = defaultdict(list)
for shahar, ism in talabalar:
    guruhlar[shahar].append(ism)

for shahar, ismlar in guruhlar.items():
    print(f"{shahar:<12}{len(ismlar)} ta: {', '.join(ismlar)}")
Natija
Toshkent    3 ta: Husanboy, Malika, Nodira
Namangan    1 ta: Sardor
Buxoro      1 ta: Bekzod

namedtuple va dataclass #

Python
from collections import namedtuple
from dataclasses import dataclass, field

# namedtuple - yengil va o'zgarmas
Nuqta = namedtuple("Nuqta", ["x", "y"])
markaz = Nuqta(41.311, 69.240)
print(f"{markaz.x}, {markaz.y}")


# dataclass - zamonaviy va moslashuvchan
@dataclass
class Mahsulot:
    nomi: str
    narxi: int
    soni: int = 1
    teglar: list = field(default_factory=list)

    @property
    def jami(self) -> int:
        return self.narxi * self.soni


klaviatura = Mahsulot("Klaviatura", 185_000, 2, ["aksessuar"])
print(klaviatura)
print(f"Jami: {klaviatura.jami:,} so'm")
Natija
41.311, 69.24
Mahsulot(nomi='Klaviatura', narxi=185000, soni=2, teglar=['aksessuar'])
Jami: 370,000 so'm
@dataclass juda ko'p kod tejaydi

U avtomatik ravishda __init__, __repr__ va __eq__ metodlarini yozib beradi. 15-bo'limdagi Mahsulot klassini eslang - @dataclass bilan u uch marta qisqaradi.

deque - ikki tomonlama navbat #

Python
from collections import deque

navbat = deque(["Husanboy", "Sardor", "Malika"])

navbat.append("Bekzod")           # oxiriga
navbat.appendleft("Nodira")       # boshiga
print(navbat)

print(navbat.popleft())           # boshidan olish - juda tez
print(navbat.pop())               # oxiridan olish

# Oxirgi N ta elementni saqlash
oxirgi_uch = deque(maxlen=3)
for son in range(1, 8):
    oxirgi_uch.append(son)
print(oxirgi_uch)
Natija
deque(['Nodira', 'Husanboy', 'Sardor', 'Malika', 'Bekzod'])
Nodira
Bekzod
deque([5, 6, 7], maxlen=3)

re - muntazam ifodalar (regex) #

Matnda naqsh bo'yicha qidirish uchun.

Naqsh: \+998\d{9} Matn: tel: +998901234567 , boshqa matn ← moslik topildi Qismlarga bo'lib: \+998 aynan shu belgilar \d{9} to'qqizta raqam
Regex naqshi matndagi ma'lum shaklga mos keladigan qismni topadi
BelgiMa'nosiMisol
\dRaqam (0-9)\d{4} - 4 ta raqam
\wHarf, raqam yoki _\w+ - so'z
\sBo'sh joy\s+
.Istalgan belgia.c
*0 yoki ko'p martaab*
+1 yoki ko'p martaab+
?0 yoki 1 martaab?
{n,m}n dan m gacha\d{2,4}
^Satr boshi^Salom
$Satr oxiritugadi$
[abc]Ro'yxatdagi belgilardan biri[aeiou]
(...)Guruh(\d+)-(\d+)
Python
import re

matn = """
Aloqa: [email protected], tel: +998901234567
Ofis: [email protected], tel: +998712001020
Sana: 08.09.2026, buyurtma raqami: BUY-4821
"""

# Emaillarni topish
emaillar = re.findall(r"[\w.-]+@[\w.-]+\.\w+", matn)
print("Emaillar:", emaillar)

# Telefon raqamlar
telefonlar = re.findall(r"\+998\d{9}", matn)
print("Telefonlar:", telefonlar)

# Sana
sana = re.search(r"(\d{2})\.(\d{2})\.(\d{4})", matn)
if sana:
    print(f"Sana topildi: kun={sana.group(1)}, oy={sana.group(2)}, yil={sana.group(3)}")

# Almashtirish
maxfiy = re.sub(r"\+998\d{9}", "+998*********", matn)
print(maxfiy.strip().split("\n")[0])
Natija
Emaillar: ['[email protected]', '[email protected]']
Telefonlar: ['+998901234567', '+998712001020']
Sana topildi: kun=08, oy=09, yil=2026
Aloqa: [email protected], tel: +998*********
FunksiyaVazifasi
re.search(n, m)Birinchi moslikni topadi
re.findall(n, m)Barcha mosliklar ro'yxati
re.finditer(n, m)Mosliklar generatori
re.sub(n, y, m)Almashtiradi
re.split(n, m)Naqsh bo'yicha bo'ladi
re.match(n, m)Faqat satr boshidan qidiradi
re.compile(n)Naqshni oldindan tayyorlaydi (tez)
r"..." prefiksi

Regex naqshlarida har doim r prefiksini ishlating. Usiz \d ni Python maxsus belgi deb o'ylashi mumkin va naqsh buziladi.

Amaliy misol: kiritilgan ma'lumotni tekshirish #

Python
import re


def email_togrimi(email: str) -> bool:
    naqsh = r"^[\w.-]+@[\w-]+\.[a-zA-Z]{2,}$"
    return bool(re.match(naqsh, email))


def telefon_togrimi(telefon: str) -> bool:
    naqsh = r"^\+998\d{9}$"
    return bool(re.match(naqsh, telefon))


def parol_kuchlimi(parol: str) -> tuple:
    talablar = {
        "Kamida 8 ta belgi":  len(parol) >= 8,
        "Katta harf":         bool(re.search(r"[A-Z]", parol)),
        "Kichik harf":        bool(re.search(r"[a-z]", parol)),
        "Raqam":              bool(re.search(r"\d", parol)),
        "Maxsus belgi":       bool(re.search(r"[!@#$%^&*]", parol)),
    }
    return all(talablar.values()), talablar


print(email_togrimi("[email protected]"))
print(email_togrimi("noto'g'ri.email"))
print(telefon_togrimi("+998901234567"))

kuchli, tafsilot = parol_kuchlimi("Python2026!")
print(f"\nParol kuchlimi: {kuchli}")
for talab, bajarildi in tafsilot.items():
    print(f"  [{'+' if bajarildi else '-'}] {talab}")
Natija
True
False
True

Parol kuchlimi: True
  [+] Kamida 8 ta belgi
  [+] Katta harf
  [+] Kichik harf
  [+] Raqam
  [+] Maxsus belgi

datetime - sana va vaqt #

Python
from datetime import datetime, date, time, timedelta

hozir = datetime.now()

print(hozir.strftime("%d.%m.%Y %H:%M:%S"))
print(hozir.strftime("%A, %d %B %Y"))
print(f"Yil: {hozir.year}, oy: {hozir.month}, kun: {hozir.day}")

# Matndan sanaga
sana = datetime.strptime("15.05.2004", "%d.%m.%Y")
print(sana.date())

# Farqni hisoblash
farq = hozir - sana
print(f"O'tgan kunlar: {farq.days:,}")
print(f"Taxminan {farq.days // 365} yosh")

# Kelajakdagi sana
imtihon = hozir + timedelta(days=30, hours=3)
print(f"Imtihon: {imtihon.strftime('%d.%m.%Y %H:%M')}")
Natija
08.09.2026 15:12:44
Tuesday, 08 September 2026
Yil: 2026, oy: 9, kun: 8
2004-05-15
O'tgan kunlar: 8,151
Taxminan 22 yosh
Imtihon: 08.10.2026 18:12
KodMa'nosiMisol
%dKun08
%mOy raqami09
%YTo'liq yil2026
%yQisqa yil26
%H:%M:%SSoat:daqiqa:soniya15:12:44
%AHafta kuniTuesday
%BOy nomiSeptember
%jYilning kuni251

os va pathlib - fayl tizimi #

Python
from pathlib import Path

joriy = Path.cwd()
print(f"Joriy papka: {joriy}")

# Fayllarni topish
loyiha = Path(".")
print("\nPython fayllari:")
for fayl in sorted(loyiha.glob("*.py")):
    hajm = fayl.stat().st_size
    print(f"  {fayl.name:<28}{hajm:>8,} bayt")

# Rekursiv qidirish
print(f"\nBarcha .md fayllar: {len(list(loyiha.rglob('*.md')))} ta")

# Yo'llarni birlashtirish
hisobot = joriy / "hisobotlar" / "2026" / "sentabr.csv"
print(f"\nTo'liq yo'l: {hisobot}")
print(f"Papkasi:    {hisobot.parent}")
print(f"Nomi:       {hisobot.stem}")
print(f"Kengaytma:  {hisobot.suffix}")
Natija
Joriy papka: D:\python-darslar

Python fayllari:
  asosiy.py                        1,204 bayt
  matn_vositalari.py                 892 bayt

Barcha .md fayllar: 3 ta

To'liq yo'l: D:\python-darslar\hisobotlar\2026\sentabr.csv
Papkasi:    D:\python-darslar\hisobotlar\2026
Nomi:       sentabr
Kengaytma:  .csv
/ operatori bilan yo'l qurish

Path obyektlarini / bilan birlashtirish mumkin. Bu Windows va Linux'da bir xil ishlaydi - "papka\" + "fayl" kabi qo'lda birlashtirishdan ko'ra ancha xavfsiz.

math va statistics #

Python
import math
import statistics

baholar = [85, 92, 78, 95, 88, 76, 91, 84]

print(f"O'rtacha (mean):    {statistics.mean(baholar):.2f}")
print(f"Mediana:            {statistics.median(baholar)}")
print(f"Standart og'ish:    {statistics.stdev(baholar):.2f}")
print(f"Dispersiya:         {statistics.variance(baholar):.2f}")

print(f"\nKvadrat ildiz(144): {math.sqrt(144)}")
print(f"log10(1000):        {math.log10(1000)}")
print(f"5 ning faktoriali:  {math.factorial(5)}")
print(f"Yaxlitlash 4.567:   {round(4.567, 2)}")
print(f"Yuqoriga:           {math.ceil(4.1)}")
print(f"Pastga:             {math.floor(4.9)}")
Natija
O'rtacha (mean):    86.12
Mediana:            86.5
Standart og'ish:    6.60
Dispersiya:         43.55

Kvadrat ildiz(144): 12.0
log10(1000):        3.0
5 ning faktoriali:  120
Yaxlitlash 4.567:   4.57
Yuqoriga:           5
Pastga:             4

argparse - buyruq satri argumentlari #

Skriptni professional CLI vositasiga aylantiradi:

Python
# hisobot.py
import argparse


def main():
    tahlilchi = argparse.ArgumentParser(
        description="CSV fayldan hisobot tayyorlaydi"
    )
    tahlilchi.add_argument("fayl", help="Kirish CSV fayli")
    tahlilchi.add_argument("-o", "--chiqish", default="hisobot.txt",
                           help="Chiqish fayli nomi")
    tahlilchi.add_argument("-n", "--soni", type=int, default=10,
                           help="Nechta qator chiqarilsin")
    tahlilchi.add_argument("--batafsil", action="store_true",
                           help="Batafsil rejim")

    argumentlar = tahlilchi.parse_args()

    print(f"Kirish fayli:  {argumentlar.fayl}")
    print(f"Chiqish fayli: {argumentlar.chiqish}")
    print(f"Qatorlar soni: {argumentlar.soni}")
    print(f"Batafsil:      {argumentlar.batafsil}")


if __name__ == "__main__":
    main()
Terminal
python hisobot.py talabalar.csv -n 5 --batafsil
Natija
Kirish fayli:  talabalar.csv
Chiqish fayli: hisobot.txt
Qatorlar soni: 5
Batafsil:      True
Terminal
python hisobot.py --help
Natija
usage: hisobot.py [-h] [-o CHIQISH] [-n SONI] [--batafsil] fayl

CSV fayldan hisobot tayyorlaydi

positional arguments:
  fayl                  Kirish CSV fayli

options:
  -h, --help            show this help message and exit
  -o CHIQISH, --chiqish CHIQISH
                        Chiqish fayli nomi
  -n SONI, --soni SONI  Nechta qator chiqarilsin
  --batafsil            Batafsil rejim

Modullar qisqacha jadvali #

ModulNima uchunAsosiy funksiyalar
collectionsKengaytirilgan to'plamlarCounter, defaultdict, deque
dataclassesMa'lumot klasslari@dataclass, field
reMatn naqshlarisearch, findall, sub
datetimeSana va vaqtnow, strftime, timedelta
pathlibFayl yo'llariPath, glob, read_text
os, shutilTizim amallarilistdir, copy, move
json, csvMa'lumot formatlaridump, load, DictReader
math, statisticsHisob-kitobsqrt, mean, stdev
randomTasodifiyrandint, choice, shuffle
itertoolsKetma-ketliklarchain, combinations
functoolsFunksiyalar bilan ishlashlru_cache, wraps, reduce
argparseCLI interfeysArgumentParser
loggingJurnal yuritishbasicConfig, error
sqlite3Ma'lumotlar bazasiconnect, execute
unittestTestlarTestCase, assertEqual
Amaliy topshiriq

log_tahlil.py dasturini yozing:

  1. logging bilan test log fayli yarating (kamida 20 ta satr, turli darajalarda).
  2. re bilan faqat ERROR darajali satrlarni ajratib oling.
  3. Counter bilan qaysi xato eng ko'p uchraganini aniqlang.
  4. datetime bilan xatolar qaysi soatlarda ko'p bo'lganini hisoblang.
  5. argparse bilan fayl nomini buyruq satridan qabul qiling.

Xulosa #

  • Counter sanashni, defaultdict guruhlashni bir necha marta soddalashtiradi.
  • @dataclass ma'lumot saqlaydigan klasslarni juda qisqartiradi.
  • re moduli matnda naqsh bo'yicha qidirish uchun; naqshni r"..." bilan yozing.
  • pathlib.Path fayl yo'llari bilan ishlashning zamonaviy va xavfsiz usuli.
  • argparse skriptni to'liq huquqli buyruq satri vositasiga aylantiradi.

Keyingi bo'limda ma'lumotlar bazasi va tashqi API bilan ishlashni ko'ramiz.

Xatolik topdingizmi?

Imlo xatosi, ishlamaydigan kod yoki noto‘g‘ri ma‘lumotni ko‘rsangiz - bizga xabar bering. Har bir xabar administrator tomonidan ko‘rib chiqiladi.