aidoc.uz

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.

▶ Video dars· Corey Schafer· 53:17· ingliz tilida
Python Tutorial: re Module - How to Write and Match Regular Expressions (Regex)

re moduli: muntazam ifodalar sintaksisi, qidirish, guruhlar va almashtirish — bobning 2-bo'limi batafsil.

YouTube'da ochish ↗

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 datetimes

Vaqt 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 kerak

Asosiy sintaksis#

BelgiMa'nosiMisol
.Istalgan belgi (yangi qatordan tashqari)a.c → abc, a-c
\d, \w, \sRaqam, harf/raqam/_, bo'sh joy\d+ → 2026
\D, \W, \STeskarilari
[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
\bSo'z chegarasi\bcat\b — "concat"da topilmaydi
(...), (?P<nom>...)Guruh, nomli guruh
(?:...)Ushlamaydigan guruh
a|bYokijpg|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 kam

Bayroqlar 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 ushlasin

3. 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()
terminal
uv run train.py data/train.jsonl --epochs 5 --dry-run
data/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'ga

Fayl 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 uchun

6. 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 taqsimot

Takrorlanuvchanlik (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] — kvartillar

Kichik 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 ID

AI ishida hash'ning amaliy qo'llanishlari:

  • Dublikatlarni topish: matnlar hash'i bo'yicha (set da 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'rnatilgan hash()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#

ModulNima uchun
textwrapMatnni o'rash, dedent (3-bob)
stringstring.ascii_letters, string.punctuation
unicodedataUnicode normalizatsiya (3-bob)
difflibIkki matn farqi, o'xshash so'zlarni topish (get_close_matches)
heapqEng katta/kichik k ta: heapq.nlargest(5, items, key=...)
bisectSaralangan ro'yxatda qidirish (5-bob)
copydeepcopy (5-bob)
pprintIchma-ich tuzilmalarni chiroyli chiqarish
tempfile, shutil, globFayllar (11-bob)
urllib.parseURL'larni tahlil qilish va yig'ish
base64Rasmlarni API'ga yuborish uchun kodlash (23-bob)
gzip, zipfile, tarfileSiqilgan fayllar
shlexBuyruq qatorini xavfsiz bo'lish/qo'shtirnoqlash
inspectFunksiya imzosi va manbasini o'qish (14-bob)
tomllibTOML o'qish (11-bob)
http.serverTezkor 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#

XatoOqibatTuzatish
Naive va aware datetime aralashTypeErrorHamma joyda UTC aware
Lokal vaqtni bazada saqlashServer/foydalanuvchi zonasi farqiUTC + ISO 8601
Regex'da oddiy satr ("\b")Naqsh ishlamaydir"..."
.+ ochko'zJuda ko'p ushlaydi.+?
Regex bilan HTML/JSON parseMo'rt kodHaqiqiy parser
shell=True + foydalanuvchi matniBuyruq in'ektsiyasiArgumentlar ro'yxati
random bilan token/parolTaxmin qilinadigansecrets
Global random.seedBoshqa kod natijani buzadirandom.Random(seed)
hash() bilan barqaror bo'linishHar ishga tushirishda boshqachahashlib
SQL f-string bilanSQL injection? parametrlar
Davomiylik time.time() bilanSoat sakrasa noto'g'ritime.perf_counter()
Amaliy topshiriq

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).

Amaliy topshiriq

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.

Amaliy topshiriq

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'.

Amaliy topshiriq

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.

Yodda saqlang
  • 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.

Test: topshirilmaganMasalalar: 0/3

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.