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.
Ushbu bo‘lim mundarijasi
- collections - kengaytirilgan to'plamlar
- Counter - sanash
- defaultdict - standart qiymatli lug'at
- namedtuple va dataclass
- deque - ikki tomonlama navbat
- re - muntazam ifodalar (regex)
- Amaliy misol: kiritilgan ma'lumotni tekshirish
- datetime - sana va vaqt
- os va pathlib - fayl tizimi
- math va statistics
- argparse - buyruq satri argumentlari
- Modullar qisqacha jadvali
- 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 #
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))
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.
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)
[('a', 2), ('s', 2), ('d', 1)]
Counter({'Python': 20, 'SQL': 5, 'Git': 3})
defaultdict - standart qiymatli lug'at #
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)}")
Toshkent 3 ta: Husanboy, Malika, Nodira
Namangan 1 ta: Sardor
Buxoro 1 ta: Bekzod
namedtuple va dataclass #
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")
41.311, 69.24
Mahsulot(nomi='Klaviatura', narxi=185000, soni=2, teglar=['aksessuar'])
Jami: 370,000 so'm
@dataclass juda ko'p kod tejaydiU 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 #
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)
deque(['Nodira', 'Husanboy', 'Sardor', 'Malika', 'Bekzod'])
Nodira
Bekzod
deque([5, 6, 7], maxlen=3)
re - muntazam ifodalar (regex) #
Matnda naqsh bo'yicha qidirish uchun.
| Belgi | Ma'nosi | Misol |
|---|---|---|
\d | Raqam (0-9) | \d{4} - 4 ta raqam |
\w | Harf, raqam yoki _ | \w+ - so'z |
\s | Bo'sh joy | \s+ |
. | Istalgan belgi | a.c |
* | 0 yoki ko'p marta | ab* |
+ | 1 yoki ko'p marta | ab+ |
? | 0 yoki 1 marta | ab? |
{n,m} | n dan m gacha | \d{2,4} |
^ | Satr boshi | ^Salom |
$ | Satr oxiri | tugadi$ |
[abc] | Ro'yxatdagi belgilardan biri | [aeiou] |
(...) | Guruh | (\d+)-(\d+) |
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])
Emaillar: ['[email protected]', '[email protected]']
Telefonlar: ['+998901234567', '+998712001020']
Sana topildi: kun=08, oy=09, yil=2026
Aloqa: [email protected], tel: +998*********
| Funksiya | Vazifasi |
|---|---|
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"..." prefiksiRegex 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 #
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}")
True
False
True
Parol kuchlimi: True
[+] Kamida 8 ta belgi
[+] Katta harf
[+] Kichik harf
[+] Raqam
[+] Maxsus belgi
datetime - sana va vaqt #
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')}")
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
| Kod | Ma'nosi | Misol |
|---|---|---|
%d | Kun | 08 |
%m | Oy raqami | 09 |
%Y | To'liq yil | 2026 |
%y | Qisqa yil | 26 |
%H:%M:%S | Soat:daqiqa:soniya | 15:12:44 |
%A | Hafta kuni | Tuesday |
%B | Oy nomi | September |
%j | Yilning kuni | 251 |
os va pathlib - fayl tizimi #
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}")
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 qurishPath 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 #
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)}")
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:
# 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()
python hisobot.py talabalar.csv -n 5 --batafsil
Kirish fayli: talabalar.csv
Chiqish fayli: hisobot.txt
Qatorlar soni: 5
Batafsil: True
python hisobot.py --help
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 #
| Modul | Nima uchun | Asosiy funksiyalar |
|---|---|---|
collections | Kengaytirilgan to'plamlar | Counter, defaultdict, deque |
dataclasses | Ma'lumot klasslari | @dataclass, field |
re | Matn naqshlari | search, findall, sub |
datetime | Sana va vaqt | now, strftime, timedelta |
pathlib | Fayl yo'llari | Path, glob, read_text |
os, shutil | Tizim amallari | listdir, copy, move |
json, csv | Ma'lumot formatlari | dump, load, DictReader |
math, statistics | Hisob-kitob | sqrt, mean, stdev |
random | Tasodifiy | randint, choice, shuffle |
itertools | Ketma-ketliklar | chain, combinations |
functools | Funksiyalar bilan ishlash | lru_cache, wraps, reduce |
argparse | CLI interfeys | ArgumentParser |
logging | Jurnal yuritish | basicConfig, error |
sqlite3 | Ma'lumotlar bazasi | connect, execute |
unittest | Testlar | TestCase, assertEqual |
log_tahlil.py dasturini yozing:
loggingbilan test log fayli yarating (kamida 20 ta satr, turli darajalarda).rebilan faqatERRORdarajali satrlarni ajratib oling.Counterbilan qaysi xato eng ko'p uchraganini aniqlang.datetimebilan xatolar qaysi soatlarda ko'p bo'lganini hisoblang.argparsebilan fayl nomini buyruq satridan qabul qiling.
Xulosa #
Countersanashni,defaultdictguruhlashni bir necha marta soddalashtiradi.@dataclassma'lumot saqlaydigan klasslarni juda qisqartiradi.remoduli matnda naqsh bo'yicha qidirish uchun; naqshnir"..."bilan yozing.pathlib.Pathfayl yo'llari bilan ishlashning zamonaviy va xavfsiz usuli.argparseskriptni to'liq huquqli buyruq satri vositasiga aylantiradi.
Keyingi bo'limda ma'lumotlar bazasi va tashqi API bilan ishlashni ko'ramiz.
O‘qish tarixini saqlamoqchimisiz?
Tizimga kirsangiz, tugatgan bo‘limlaringiz saqlanadi va qoldirgan joyingizdan davom etasiz.
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.