3-qism · Professional Python·18-bob
Standart kutubxona: har kuni kerak bo'ladigan modullar
datetime va vaqt zonalari, muntazam ifodalar (re), argparse bilan CLI, subprocess, os/sys, time va o'lchash, random va secrets, math va statistics, hashlib va uuid, sqlite3 — AI muhandisi uchun amaliy sharh.
Python'ning shiori — "batteries included" (batareyalar ichida): standart
kutubxonada yuzlab modul bor va ular o'rnatishsiz ishlaydi. Oldingi
boblarda ularning ko'pini ko'rdik: pathlib, json, csv, collections,
itertools, functools, logging, contextlib, dataclasses,
typing, asyncio, concurrent.futures. Bu bobda qolgan "har kunlik"
modullarni amaliy nuqtai nazardan ko'rib chiqamiz. Har birini chuqur
o'rganish shart emas — borligini va nimaga kerakligini bilish muhim:
shunda keraksiz kutubxona o'rnatmaysiz va g'ildirakni qayta ixtiro
qilmaysiz.
re moduli: muntazam ifodalar sintaksisi, qidirish, guruhlar va almashtirish — bobning 2-bo'limi batafsil.
1. datetime va vaqt zonalari#
from datetime import date, datetime, timedelta, timezone
from zoneinfo import ZoneInfo
now = datetime.now(ZoneInfo("Asia/Tashkent")) # vaqt zonasi bilan
today = date.today()
now.isoformat() # '2026-10-01T14:30:00+05:00' — saqlash va API uchun
now.strftime("%d.%m.%Y %H:%M") # '01.10.2026 14:30' — foydalanuvchiga ko'rsatish
now.astimezone(timezone.utc) # UTC'ga o'tkazish
datetime.fromisoformat("2026-10-01T09:00:00+05:00") # ISO satrdan
datetime.strptime("01.10.2026", "%d.%m.%Y") # ixtiyoriy formatdan
next_month = now + timedelta(days=30)
(date(2026, 12, 31) - date(2026, 10, 1)).days # 91"Naive" va "aware" — eng muhim farq#
- naive
datetime— vaqt zonasi yo'q (datetime.now(),datetime(2026, 10, 1)); - aware — vaqt zonasi bor (
datetime.now(timezone.utc)).
Ularni aralashtirib bo'lmaydi:
datetime.now() - datetime.now(timezone.utc)
# TypeError: can't subtract offset-naive and offset-aware datetimesVaqt qatorlari (time series) bilan katta hajmda ishlashda Pandas'ning vaqt vositalari qulayroq (20-bob).
2. re — muntazam ifodalar#
Regex — matnda naqsh bo'yicha qidirish tili. Ma'lumotlarni tozalash, loglarni tahlil qilish va LLM javoblaridan ma'lumot ajratishda doimiy kerak bo'ladi.
import re
text = "Aloqa: +998 90 123-45-67, aziz@mail.uz va info@aidoc.uz. Sana: 2026-10-01."
re.findall(r"[\w.+-]+@[\w-]+(?:\.[\w-]+)+", text) # ['aziz@mail.uz', 'info@aidoc.uz']
re.findall(r"\b\d{4}-\d{2}-\d{2}\b", text) # ['2026-10-01']
m = re.search(r"(?P<y>\d{4})-(?P<m>\d{2})-(?P<d>\d{2})", text)
if m:
m.group("y") # '2026'
m.groupdict() # {'y': '2026', 'm': '10', 'd': '01'}
re.sub(r"\d", "#", "a1b22") # 'a#b##'
re.split(r"[,;]\s*", "a, b;c") # ['a', 'b', 'c']
re.fullmatch(r"[a-z0-9-]+", "ok-slug") # butun satr mos kelishi kerakAsosiy sintaksis#
| Belgi | Ma'nosi | Misol |
|---|---|---|
. | Istalgan belgi (yangi qatordan tashqari) | a.c → abc, a-c |
\d, \w, \s | Raqam, harf/raqam/_, bo'sh joy | \d+ → 2026 |
\D, \W, \S | Teskarilari | |
[abc], [^abc], [a-z] | Belgilar to'plami / inkor / oraliq | |
*, +, ? | 0+, 1+, 0 yoki 1 marta | \d+ |
{n}, {n,m} | Aniq n, n dan m gacha | \d{4} |
^, $ | Satr boshi / oxiri | |
\b | So'z chegarasi | \bcat\b — "concat"da topilmaydi |
(...), (?P<nom>...) | Guruh, nomli guruh | |
(?:...) | Ushlamaydigan guruh | |
a|b | Yoki | jpg|png |
Ochko'z va dangasa#
re.findall(r"<.+>", "<a><b>") # ['<a><b>'] — ochko'z (greedy): iloji boricha ko'p
re.findall(r"<.+?>", "<a><b>") # ['<a>', '<b>'] — dangasa (lazy): iloji boricha kamBayroqlar va kompilyatsiya#
PHONE = re.compile(r"\+998\s?(\d{2})\s?(\d{3})-?(\d{2})-?(\d{2})") # bir marta kompilyatsiya
PHONE.search(text).groups() # ('90', '123', '45', '67')
re.findall(r"error", log, flags=re.IGNORECASE)
re.search(r"```json(.*?)```", reply, flags=re.DOTALL) # . yangi qatorni ham ushlasin3. argparse — buyruq qatori interfeysi#
ML skriptlari deyarli har doim parametrlar bilan ishga tushiriladi:
import argparse
from pathlib import Path
def parse_args() -> argparse.Namespace:
p = argparse.ArgumentParser(description="Sentiment modelini o'qitish")
p.add_argument("data", type=Path, help="train.jsonl fayli")
p.add_argument("--epochs", type=int, default=10)
p.add_argument("--lr", type=float, default=3e-4)
p.add_argument("--model", choices=["small", "large"], default="small")
p.add_argument("--dry-run", action="store_true", help="faqat tekshirish, o'qitmaslik")
p.add_argument("--tags", nargs="*", default=[])
return p.parse_args()
def main() -> None:
args = parse_args()
print(args.data, args.epochs, args.dry_run) # --dry-run → args.dry_run
if __name__ == "__main__":
main()uv run train.py data/train.jsonl --epochs 5 --dry-rundata/train.jsonl 5 True
--help avtomatik yaratiladi. Murakkabroq CLI'lar uchun uchinchi tomon
kutubxonalari bor — Typer (type hint'lardan CLI yasaydi) va Click —
lekin argparse qo'shimcha bog'liqliksiz ishlaydi.
4. os, sys va shutil#
import os
import sys
os.environ.get("HOME") # muhit o'zgaruvchilari (9-bob)
os.cpu_count() # yadrolar soni — ProcessPoolExecutor uchun
os.getpid() # joriy jarayon ID'si
sys.argv # buyruq qatori argumentlari (xom)
sys.executable # qaysi Python ishlayapti (1-bob mashqi)
sys.version_info >= (3, 12) # versiya tekshiruvi
sys.exit(1) # chiqish kodi bilan tugatish (0 — muvaffaqiyat)
print("xato", file=sys.stderr) # xatolar stderr'gaFayl yo'llari uchun os.path emas, pathlib (11-bob); fayllarni
nusxalash/ko'chirish uchun shutil (11-bob).
5. subprocess — tashqi dasturlarni ishga tushirish#
import subprocess
result = subprocess.run(
["git", "rev-parse", "--short", "HEAD"], # ro'yxat sifatida — shell'siz
capture_output=True,
text=True,
check=True, # chiqish kodi 0 bo'lmasa — CalledProcessError
timeout=30,
)
commit = result.stdout.strip() # tajriba natijalariga kod versiyasini yozish uchun6. time — vaqtni o'lchash#
import time
time.time() # Unix vaqti (1970'dan beri soniyalar) — vaqt belgisi uchun
time.perf_counter() # eng aniq taymer — davomiylikni o'lchash uchun
time.monotonic() # hech qachon orqaga ketmaydi — timeout va limitlar uchun
time.sleep(0.5)Davomiylikni time.time() bilan o'lchamang — tizim soati sinxronizatsiya
paytida sakrashi mumkin. Kichik kod bo'laklarini solishtirish uchun
timeit (25-bob).
7. random va secrets#
import random
random.seed(42) # global holat — takrorlanuvchanlik uchun
rng = random.Random(42) # ✅ yaxshiroq: alohida generator obyekti
rng.random() # 0.6394267984578837 — [0, 1)
rng.randint(1, 6) # 1..6 (ikkala chet kiradi)
rng.choice(["a", "b", "c"])
rng.sample(range(100), 5) # takrorlanmasdan 5 ta
rng.shuffle(items) # joyida aralashtiradi
rng.choices(["a", "b"], weights=[0.9, 0.1], k=10) # og'irlik bilan, takrorlanib
rng.gauss(0, 1) # normal taqsimotTakrorlanuvchanlik (reproducibility) ML'da muqaddas: bir xil seed —
bir xil train/test bo'linishi, bir xil natija. Global random.seed()
o'rniga alohida Random(seed) obyekti afzal — boshqa kod (kutubxonalar)
global holatni o'zgartirib, natijangizni buzmaydi. NumPy'da xuddi shu
g'oya: np.random.default_rng(42) (19-bob).
8. math va statistics#
import math
import statistics as st
math.sqrt(16), math.log(100, 10), math.exp(1), math.pi
math.isclose(a, b), math.isnan(x), math.isfinite(x) # 2-bob
math.prod([1, 2, 3]), math.comb(5, 2), math.factorial(5)
math.ceil(4.1), math.floor(4.9)
data = [2, 4, 4, 4, 5, 5, 7, 9]
st.mean(data) # 5
st.median(data) # 4.5
st.stdev(data) # 2.138... — tanlanma (n-1)
st.pstdev(data) # 2.0 — bosh to'plam (n)
st.quantiles(data, n=4) # [4.0, 4.5, 6.5] — kvartillarKichik hajmdagi hisob-kitoblar uchun yetarli. Katta massivlar uchun — NumPy (tezroq va ko'proq imkoniyat).
9. hashlib, uuid#
import hashlib
import uuid
hashlib.sha256("salom".encode()).hexdigest() # mazmun "barmoq izi"
uuid.uuid4() # tasodifiy noyob IDAI ishida hash'ning amaliy qo'llanishlari:
- Dublikatlarni topish: matnlar hash'i bo'yicha (
setda saqlash arzon); - Kesh kaliti: prompt + parametrlar hash'i (14-bob mashqidagi disk keshi);
- Deterministik bo'linish: foydalanuvchini doim bir xil qismga
(train/test) tushirish —
int(hashlib.md5(user_id.encode()).hexdigest(), 16) % 100 < 80. Python'ning o'rnatilganhash()i bunga yaramaydi: satrlar uchun u har ishga tushirishda boshqacha (xavfsizlik uchun tasodifiylashtirilgan).
10. sqlite3 — fayldagi ma'lumotlar bazasi#
Server o'rnatmasdan, bitta faylda to'liq SQL ma'lumotlar bazasi:
import sqlite3
con = sqlite3.connect("results.db")
con.execute("""CREATE TABLE IF NOT EXISTS runs (
id INTEGER PRIMARY KEY, model TEXT, lr REAL, accuracy REAL, created TEXT
)""")
with con: # tranzaksiya: muvaffaqiyatda commit, xatoda rollback
con.execute(
"INSERT INTO runs (model, lr, accuracy, created) VALUES (?, ?, ?, datetime('now'))",
("small", 3e-4, 0.912), # ? — parametrlar: SQL injection'dan himoya
)
best = con.execute("SELECT model, lr, accuracy FROM runs ORDER BY accuracy DESC LIMIT 3").fetchall()Tajribalar natijalari, kesh, kichik ilovalar uchun ideal. Hech qachon
SQL'ni f-string bilan yig'mang (f"... WHERE name = '{name}'") — har doim
? parametrlar.
11. Yana bir nechta foydali modullar#
| Modul | Nima uchun |
|---|---|
textwrap | Matnni o'rash, dedent (3-bob) |
string | string.ascii_letters, string.punctuation |
unicodedata | Unicode normalizatsiya (3-bob) |
difflib | Ikki matn farqi, o'xshash so'zlarni topish (get_close_matches) |
heapq | Eng katta/kichik k ta: heapq.nlargest(5, items, key=...) |
bisect | Saralangan ro'yxatda qidirish (5-bob) |
copy | deepcopy (5-bob) |
pprint | Ichma-ich tuzilmalarni chiroyli chiqarish |
tempfile, shutil, glob | Fayllar (11-bob) |
urllib.parse | URL'larni tahlil qilish va yig'ish |
base64 | Rasmlarni API'ga yuborish uchun kodlash (23-bob) |
gzip, zipfile, tarfile | Siqilgan fayllar |
shlex | Buyruq qatorini xavfsiz bo'lish/qo'shtirnoqlash |
inspect | Funksiya imzosi va manbasini o'qish (14-bob) |
tomllib | TOML o'qish (11-bob) |
http.server | Tezkor statik server: python -m http.server |
HTTP so'rovlar haqida#
Standart kutubxonada urllib.request bor, lekin u noqulay. Amalda hamma
uchinchi tomon kutubxonasini ishlatadi: httpx (sinxron va async,
zamonaviy) yoki requests (eng mashhur, faqat sinxron). 23-bobda
batafsil.
import httpx
resp = httpx.get("https://api.github.com/repos/python/cpython", timeout=10)
resp.raise_for_status() # 4xx/5xx bo'lsa — xato
data = resp.json()
data["stargazers_count"]12. Amaliyot: tajriba ishga tushiruvchi CLI#
"""Tajribani ishga tushiradi va natijani SQLite'ga yozadi."""
import argparse
import json
import logging
import random
import sqlite3
import subprocess
import time
from datetime import datetime, timezone
from pathlib import Path
log = logging.getLogger("run")
def git_commit() -> str:
try:
out = subprocess.run(["git", "rev-parse", "--short", "HEAD"],
capture_output=True, text=True, check=True, timeout=5)
return out.stdout.strip()
except (OSError, subprocess.SubprocessError):
return "unknown"
def fake_train(lr: float, epochs: int, seed: int) -> float:
rng = random.Random(seed)
time.sleep(0.1)
return round(0.8 + rng.random() * 0.1 - abs(lr - 3e-4) * 50, 4)
def main() -> None:
p = argparse.ArgumentParser()
p.add_argument("--lr", type=float, default=3e-4)
p.add_argument("--epochs", type=int, default=10)
p.add_argument("--seed", type=int, default=42)
p.add_argument("--db", type=Path, default=Path("runs.db"))
args = p.parse_args()
logging.basicConfig(level=logging.INFO, format="%(asctime)s %(message)s")
start = time.perf_counter()
acc = fake_train(args.lr, args.epochs, args.seed)
elapsed = time.perf_counter() - start
con = sqlite3.connect(args.db)
with con:
con.execute("""CREATE TABLE IF NOT EXISTS runs (
id INTEGER PRIMARY KEY, created TEXT, commit_sha TEXT, params TEXT, accuracy REAL, seconds REAL)""")
con.execute("INSERT INTO runs (created, commit_sha, params, accuracy, seconds) VALUES (?, ?, ?, ?, ?)",
(datetime.now(timezone.utc).isoformat(), git_commit(),
json.dumps(vars(args), default=str), acc, round(elapsed, 3)))
log.info("accuracy=%.4f (%.2fs) → %s", acc, elapsed, args.db)
if __name__ == "__main__":
main()Bitta skriptda: argparse, subprocess (xatolarga chidamli), random.Random(seed),
time.perf_counter, UTC vaqt, sqlite3 parametrli so'rov va tranzaksiya,
json va logging. Har bir tajriba qaysi kod versiyasi, qaysi parametrlar
bilan ishlaganini eslab qoladi — bu takrorlanuvchanlikning asosi.
Nima noto'g'ri ketishi mumkin#
| Xato | Oqibat | Tuzatish |
|---|---|---|
| Naive va aware datetime aralash | TypeError | Hamma joyda UTC aware |
| Lokal vaqtni bazada saqlash | Server/foydalanuvchi zonasi farqi | UTC + ISO 8601 |
Regex'da oddiy satr ("\b") | Naqsh ishlamaydi | r"..." |
.+ ochko'z | Juda ko'p ushlaydi | .+? |
| Regex bilan HTML/JSON parse | Mo'rt kod | Haqiqiy parser |
shell=True + foydalanuvchi matni | Buyruq in'ektsiyasi | Argumentlar ro'yxati |
random bilan token/parol | Taxmin qilinadigan | secrets |
Global random.seed | Boshqa kod natijani buzadi | random.Random(seed) |
hash() bilan barqaror bo'linish | Har ishga tushirishda boshqacha | hashlib |
| SQL f-string bilan | SQL injection | ? parametrlar |
Davomiylik time.time() bilan | Soat sakrasa noto'g'ri | time.perf_counter() |
1. Log tahlilchi
"2026-10-01 14:03:22 ERROR Model yuklanmadi: timeout" formatidagi log
faylini regex bilan tahlil qiling: darajalar bo'yicha soni, har soatdagi
ERROR'lar soni, eng ko'p uchragan 5 ta xato xabari (raqamlarni # ga
almashtirib guruhlang — "timeout after 30s" va "timeout after 45s" bitta
guruh bo'lsin).
Maslahatni ko'rsatish
re.compile(r'^(?P<ts>\S+ \S+) (?P<level>\w+) (?P<msg>.*)$'); datetime.fromisoformat; Counter; soat bo'yicha: ts.replace(minute=0, second=0).
2. PII tozalovchi
LLM'ga yuborishdan oldin matndan shaxsiy ma'lumotlarni (email, telefon
raqamlar — O'zbekiston formatlari, karta raqamlari — 16 xona, bo'sh joy
bilan yoki bo'shsiz) [EMAIL], [PHONE], [CARD] bilan almashtiradigan
funksiya yozing. 10 ta test holati bilan pytest yozing.
Maslahatni ko'rsatish
Har bir tur uchun alohida regex; re.sub(pattern, '[EMAIL]', text). Telefon uchun +998 va 9 xonali mahalliy formatlarni qo'llang.
3. Deterministik bo'linish
assign_split(user_id, test_ratio=0.2, salt="v1") funksiyasini yozing:
bir xil foydalanuvchi har doim bir xil qismga tushsin (dastur qayta
ishga tushganda ham), 100 000 ta ID uchun test ulushi 20% ga yaqin
bo'lsin. Nega hash() bu yerda yaramasligini PYTHONHASHSEED bilan
tajriba qilib ko'rsating.
Maslahatni ko'rsatish
h = int(hashlib.sha256(f'{salt}:{user_id}'.encode()).hexdigest(), 16) % 10_000; h < ratio * 10_000 bo'lsa 'test'.
4. Tajribalar jadvali
Yuqoridagi CLI'ni turli --lr qiymatlari bilan 10 marta ishga tushiring
(bash sikli yoki subprocess bilan Python'dan), keyin sqlite3 bilan
eng yaxshi 3 ta natijani va har bir lr uchun o'rtacha accuracy'ni
chiqaruvchi report.py yozing.
- 01datetime: ichkarida UTC aware, ko'rsatishda mahalliy zona; ISO 8601 formatida saqlang.
- 02re: raw string, findall/search/sub, nomli guruhlar, dangasa .+?; HTML/JSON uchun parser.
- 03argparse — CLI parametrlar; subprocess — argumentlar ro'yxati bilan, shell=True'siz.
- 04time.perf_counter — davomiylik, time.monotonic — timeout, time.time — vaqt belgisi.
- 05random.Random(seed) — takrorlanuvchanlik; secrets — xavfsizlik.
- 06hashlib — barqaror hash (dublikat, kesh kaliti, deterministik bo'linish); hash() emas.
- 07sqlite3 — fayldagi SQL baza; har doim ? parametrlar.
- 08Kutubxona o'rnatishdan oldin standart kutubxonani tekshiring.
Mustahkamlash
Test va amaliy masalalar
Avval testni ishlang — har javobdan keyin izoh chiqadi. Keyin masalalarni shu yerning o'zida yechib, brauzerdagi haqiqiy Python bilan avtomatik tekshiring. Natijalaringiz kurs progressi sahifasida jamlanadi.
Bilimni tekshirish
Bob bo'yicha test
12 ta savol · har javobdan keyin to'g'ri yoki xatoligi va izoh ko'rsatiladi · oxirida natija foizda.
Amaliy masalalar
Kodni yozing va «Tekshirish»ni bosing (yoki Ctrl/⌘ + Enter). Kodingiz shu brauzerda saqlanib turadi.
01PII tozalovchi
mask_pii(text) — email'larni [EMAIL], O'zbekiston telefon raqamlarini (+998 90 123-45-67, +998901234567, 90 123 45 67) [PHONE] bilan almashtirsin (re.sub).
02Deterministik bo'linish
assign_split(user_id, test_ratio=0.2, salt="v1") — hashlib.sha256(f"{salt}:{user_id}") asosida "train" yoki "test" qaytarsin: hash'ni butun songa aylantirib % 10_000 < test_ratio * 10_000 bo'lsa "test".
03Log tahlili
error_stats(lines) — "2026-10-01 14:03:22 ERROR timeout after 30s" formatidagi qatorlardan faqat ERROR larni olib, xabardagi raqamlarni # ga almashtirib guruhlasin va [(xabar_shabloni, soni), ...] ni soni bo'yicha kamayish tartibida qaytarsin.