1-qism · Poydevor·03-bob
Satrlar: matn bilan professional ishlash
str tipi, indekslash va kesish (slicing), eng muhim metodlar, f-string formatlash, Unicode va baytlar, matnni tozalash va LLM uchun prompt shablonlari.
AI muhandisining ishi asosan matn bilan: promptlar, model javoblari, hujjatlar, loglar, JSON. LLM'ga yuboriladigan har bir narsa — satr. Model qaytargan har bir narsa — satr. Shuning uchun satrlarni chuqur bilish "yaxshi bo'lardi" emas, balki majburiy.
Satrlar bilan ishlash asoslari: indekslash, slicing, metodlar va formatlash. Bobdagi Unicode va o'zbekcha apostrof qismi videoda yo'q — uni bobdan o'qing.
1. Satr yaratish#
a = 'bitta qo\'shtirnoq'
b = "qo'sh tirnoq — ichida ' bemalol"
c = """Uch qo'shtirnoq —
bir necha qatorli matn uchun.
Prompt shablonlari uchun juda qulay."""
d = "" # bo'sh satr'...' va "..." orasida farq yo'q. Qoida: ichida ' bo'lsa, " ishlating
(o'zbek tilida o', g' ko'p — shuning uchun "..." qulayroq).
Maxsus belgilar (escape)#
| Yozuv | Ma'no |
|---|---|
\n | Yangi qator |
\t | Tab |
\\ | Teskari slesh |
\', \" | Tirnoq |
\u0410 | Unicode belgi (А) |
Raw satr — r"..." — escape'larni o'chiradi. Windows yo'llari va
muntazam ifodalar (regex, 18-bob) uchun:
print("C:\new\table") # \n va \t yangi qator va tab bo'lib qoladi!
print(r"C:\new\table") # C:\new\table — aynan shundayrepr() satrning "ichini" ko'rsatadi — yashirin belgilarni topishda
juda foydali:
>>> s = "salom\t\n"
>>> print(s) # ko'rinmaydi
salom
>>> repr(s)
"'salom\\t\\n'"
>>> print(repr(s))
'salom\t\n'2. Satr — belgilar ketma-ketligi#
Satr — immutable belgilar ketma-ketligi. Har bir belgining indeksi bor:
T o s h k e n t
0 1 2 3 4 5 6 7 ← musbat indeks
-8 -7 -6 -5 -4 -3 -2 -1 ← manfiy indekss = "Toshkent"
s[0] # 'T'
s[-1] # 't' — oxirgi belgi
s[10] # IndexError: string index out of rangeKesish (slicing) — [start:stop:step]#
Slicing Python'ning eng kuchli vositalaridan biri va u ro'yxatlar, tuple'lar, NumPy massivlari va PyTorch tensorlarida ham aynan shunday ishlaydi. Bir marta yaxshi o'rganing:
s = "Toshkent"
s[1:4] # 'osh' — 1 dan 4 gacha (4 kirmaydi!)
s[:3] # 'Tos' — boshidan
s[3:] # 'hkent' — oxirigacha
s[:] # 'Toshkent' — to'liq nusxa
s[::2] # 'Tskn' — har ikkinchi belgi
s[::-1] # 'tnekhsoT' — teskari
s[-3:] # 'ent' — oxirgi 3 ta
s[2:100] # 'shkent' — chegaradan chiqsa xato yo'q, shunchaki kesadiImmutable#
s = "salom"
s[0] = "S" # TypeError: 'str' object does not support item assignment
s = "S" + s[1:] # to'g'ri yo'l — yangi satr yaratish3. Eng muhim metodlar#
Satr metodlari asl satrni o'zgartirmaydi — yangi satr qaytaradi.
Tozalash#
" salom \n".strip() # 'salom' — ikki chetdagi bo'sh joy, \n, \t
" salom ".lstrip() # 'salom '
"xxsalomxx".strip("x") # 'salom'
"report.pdf".removesuffix(".pdf") # 'report'
"Mr. Aziz".removeprefix("Mr. ") # 'Aziz'Bo'lish va birlashtirish#
"a,b,,c".split(",") # ['a', 'b', '', 'c'] — bo'sh element saqlanadi
"a b c\n".split() # ['a', 'b', 'c'] — argumentsiz: har qanday bo'sh joy bo'yicha
"k=v=w".split("=", 1) # ['k', 'v=w'] — faqat birinchi marta
"satr1\nsatr2\r\nsatr3".splitlines() # ['satr1', 'satr2', 'satr3']
"kalit=qiymat".partition("=") # ('kalit', '=', 'qiymat')
", ".join(["olma", "nok", "uzum"]) # 'olma, nok, uzum'
"\n".join(qatorlar) # qatorlarni birlashtirishjoin — ajratuvchining metodi, ro'yxatniki emas: ", ".join(lst). Ro'yxat
elementlari satr bo'lishi shart: ", ".join(map(str, [1, 2, 3])).
Qidirish va tekshirish#
"python" in "I love python" # True — eng o'qiladigan usul
"banana".find("n") # 2 — birinchi uchragan indeks
"banana".find("x") # -1 — topilmadi
"banana".index("x") # ValueError — topilmasa xato
"banana".count("a") # 3
"report.pdf".endswith((".pdf", ".docx")) # True — tuple bilan bir nechta variant
"Toshkent".startswith("Tosh") # True
"123".isdigit() # True
"12.5".isdigit() # False — nuqta raqam emas
"abc".isalpha() # True
" ".isspace() # TrueRegistr va almashtirish#
"salom dunyo".title() # 'Salom Dunyo'
"Salom".lower() # 'salom'
"salom".upper() # 'SALOM'
"salom".capitalize() # 'Salom'
"banana".replace("a", "o") # 'bonono'
"banana".replace("a", "o", 1) # 'bonana' — faqat birinchisiRegistrsiz solishtirish uchun casefold() — lower()dan kuchliroq (nemischa
ß kabi maxsus holatlarni ham to'g'ri qiladi):
"Straße".casefold() == "STRASSE".casefold() # TrueTekislash#
"3".zfill(3) # '003'
"x".center(7, "*") # '***x***'
"ab" * 3 # 'ababab'4. f-string — formatlashning zamonaviy usuli#
f-string (Python 3.6+) — satr ichiga ifodani qo'yishning eng o'qiladigan va eng tez usuli:
ism = "Aziz"
yosh = 25
print(f"{ism} {yosh} yoshda. Kelasi yil {yosh + 1} bo'ladi."){} ichida har qanday ifoda bo'lishi mumkin: f"{len(ism)}",
f"{narx * 1.12:.2f}", f"{'ha' if ok else 'yoq'}".
Format spetsifikatsiyasi — {qiymat:format}#
x = 3.14159
n = 1234567.891
f"{x:.2f}" # '3.14' — 2 xona kasr
f"{n:,.2f}" # '1,234,567.89' — minglik ajratuvchi
f"{n:_.0f}" # '1_234_568'
f"{42:05d}" # '00042' — 5 xonali, nol bilan to'ldirilgan
f"{0.256:.1%}" # '25.6%' — foiz
f"{1e-5:.2e}" # '1.00e-05' — ilmiy yozuv
f"{'chap':<8}|" # 'chap |' — chapga tekislash, 8 belgi
f"{'ong':>8}|" # ' ong|' — o'ngga
f"{'markaz':^10}|" # ' markaz |' — markazga
f"{255:x}" # 'ff' — 16-lik
f"{255:b}" # '11111111' — ikkilikJadval chiqarish — ML tajribalarida natijalarni ko'rsatish uchun:
natijalar = [("logreg", 0.8731, 1.2), ("random_forest", 0.9102, 14.8), ("xgboost", 0.9254, 9.1)]
print(f"{'Model':<15}{'Accuracy':>10}{'Vaqt, s':>10}")
print("-" * 35)
for nom, acc, vaqt in natijalar:
print(f"{nom:<15}{acc:>10.2%}{vaqt:>10.1f}")Model Accuracy Vaqt, s
-----------------------------------
logreg 87.31% 1.2
random_forest 91.02% 14.8
xgboost 92.54% 9.1Debug uchun = belgisi#
x = 3.14159
print(f"{x=}") # x=3.14159
print(f"{x * 2 = :.3f}") # x * 2 = 6.283Bu print bilan debug qilishda vaqtni ancha tejaydi.
!r — repr ko'rinishi#
ism = "Ali "
print(f"Ism: {ism}.") # Ism: Ali . — oxiridagi bo'sh joy sezilmaydi
print(f"Ism: {ism!r}.") # Ism: 'Ali '. — darhol ko'rinadiEski usullar (o'qiy olish uchun)#
Eski kodlarda uchraydi — o'qiy olishingiz kerak, lekin yangi kodda f-string ishlating:
"{} va {}".format("A", "B") # str.format()
"%s yoshi %d" % ("Ali", 30) # % formatlash (C uslubi)Bitta istisno: logging (10-bob) — u yerda log.info("x=%s", x) uslubi
to'g'ri, chunki satr faqat kerak bo'lganda formatlanadi.
5. Unicode, kodlash va baytlar#
Bu bo'lim ko'pchilik o'tkazib yuboradi — keyin o'zbek, rus yoki emoji matnlarida g'alati xatolarga duch keladi.
str va bytes#
str— Unicode belgilar ketma-ketligi (inson uchun matn).bytes— baytlar ketma-ketligi (fayl, tarmoq, disk uchun).
Ularni bog'lovchi — kodlash (encoding), deyarli har doim UTF-8:
s = "😀"
len(s) # 1 — bitta belgi
b = s.encode("utf-8") # b'\xf0\x9f\x98\x80'
len(b) # 4 — to'rt bayt
b.decode("utf-8") # '😀'
"Ш".encode("utf-8") # b'\xd0\xa8' — kirill harfi 2 bayt
ord("A"), chr(1071) # (65, 'Я') — belgi ↔ kod nuqtasiAPOSTROFLAR = str.maketrans({"ʻ": "'", "‘": "'", "’": "'", "`": "'", "ʼ": "'"})
def normalize_uz(matn: str) -> str:
return matn.translate(APOSTROFLAR)
normalize_uz("Oʻzbekiston gʻalabasi") # "O'zbekiston g'alabasi"Fayllarda kodlashni har doim ko'rsating#
with open("data.txt", encoding="utf-8") as f: # encoding'ni HAR DOIM yozing
text = f.read()Windows'da standart kodlash UTF-8 emas bo'lishi mumkin — encoding
ko'rsatilmasa, o'zbekcha/ruscha matn buzilib o'qiladi
(UnicodeDecodeError yoki "Салом" kabi chalkash belgilar). 11-bobda
batafsil.
Tokenlar va belgilar#
LLM'lar belgilar bilan emas, tokenlar bilan ishlaydi. Token — odatda
so'zning bir qismi. Inglizcha matnda 1 token ≈ 4 belgi; o'zbekcha matn
odatda ko'proq tokenga bo'linadi (model o'zbek tilini kamroq ko'rgan).
Demak len(matn) LLM narxini yoki kontekst limitini aniq bildirmaydi —
buning uchun provayderning token hisoblash API'si kerak (23-bob).
6. Satrlarni solishtirish#
"abc" < "abd" # True — leksikografik (lug'at tartibi)
"Z" < "a" # True! — katta harflarning kodi kichikroq (Z=90, a=97)
"10" < "9" # True! — sonlar emas, belgilar solishtiriladiFayl nomlarini saralashda shu sabab file10.txt file9.txtdan oldin
keladi. Yechim — saralash kaliti (8-bobda key= haqida).
7. Amaliyot: LLM uchun prompt shabloni#
Ko'p qatorli satrlar + f-string — prompt yozishning asosiy vositasi:
PROMPT_TEMPLATE = """\
Quyidagi hujjatlarga asoslanib savolga {til} tilida javob ber.
Agar javob hujjatlarda bo'lmasa, "Bilmayman" de.
{hujjatlar}
Savol: {savol}
"""
def build_prompt(savol: str, kontekst: list[str], til: str = "o'zbek") -> str:
hujjatlar = "\n\n".join(
f'<hujjat id="{i}">\n{matn.strip()}\n</hujjat>' for i, matn in enumerate(kontekst, 1)
)
return PROMPT_TEMPLATE.format(til=til, hujjatlar=hujjatlar, savol=savol.strip())
print(build_prompt("Poytaxt qaysi?", ["O'zbekiston poytaxti — Toshkent.", "Aholisi 37 mln."]))Quyidagi hujjatlarga asoslanib savolga o'zbek tilida javob ber.
Agar javob hujjatlarda bo'lmasa, "Bilmayman" de.
<hujjat id="1">
O'zbekiston poytaxti — Toshkent.
</hujjat>
<hujjat id="2">
Aholisi 37 mln.
</hujjat>
Savol: Poytaxt qaysi?Bir necha muhim nuqta:
- Shablon modul darajasidagi konstanta — kod ichidagi chekinish promptga
aralashmaydi. Agar shablonni funksiya ichida chekinish bilan yozmoqchi
bo'lsangiz,
textwrap.dedentbor, lekin ehtiyot bo'ling: u faqat barcha qatorlarda umumiy bo'lgan chekinishni olib tashlaydi — ichiga chekinishsiz ko'p qatorli matn qo'yilsa, hech narsa olib tashlanmaydi. """\— boshidagi\birinchi bo'sh qatorni yo'q qiladi.str.format()bu yerda f-string'dan qulayroq: shablon bir joyda, qiymatlar boshqa joyda beriladi. (Shablonda haqiqiy{kerak bo'lsa — masalan, JSON misol — uni{{deb yozing.)- Hujjatlarni XML uslubidagi teglar bilan o'rash — model qaysi matn qayerda tugashini aniq ko'radi (Anthropic ham shu usulni tavsiya qiladi).
8. Amaliyot: matnni tozalash funksiyasi#
Dataset tayyorlashda deyarli har doim kerak bo'ladigan funksiya:
import re
import unicodedata
APOSTROFLAR = str.maketrans({"ʻ": "'", "‘": "'", "’": "'", "`": "'", "ʼ": "'"})
def clean_text(text: str) -> str:
text = unicodedata.normalize("NFC", text) # Unicode'ni bitta shaklga
text = text.translate(APOSTROFLAR) # apostroflarni birxillashtirish
text = text.replace("\u00a0", " ") # bo'linmaydigan bo'sh joy
text = re.sub(r"[ \t]+", " ", text) # ketma-ket bo'sh joylar → bitta
text = re.sub(r"\n{3,}", "\n\n", text) # 3+ bo'sh qator → 2
return text.strip()
print(repr(clean_text(" Oʻzbekiston\u00a0\u00a0 Respublikasi\n\n\n\nPoytaxti: Toshkent ")))
# "O'zbekiston Respublikasi\n\nPoytaxti: Toshkent"unicodedata.normalize("NFC", ...) — bir xil ko'rinadigan belgilarni bir xil
kodga keltiradi (masalan, "é" bitta belgi yoki "e" + urg'u belgisi bo'lishi
mumkin). re moduli 18-bobda batafsil.
Nima noto'g'ri ketishi mumkin#
| Holat | Belgisi | Yechim |
|---|---|---|
"Natija: " + 42 | TypeError: can only concatenate str (not "int") to str | f"Natija: {42}" |
", ".join([1, 2]) | TypeError: expected str instance | ", ".join(map(str, lst)) |
s.strip("abc") prefiks deb o'ylash | Kutilmagan belgilar o'chadi | removeprefix / removesuffix |
open(...) encoding'siz | Windows'da buzilgan kirill/o'zbek matni | encoding="utf-8" |
| Turli apostroflar | Qidiruv topmaydi, dublikatlar | Normalizatsiya: str.translate |
Siklda s += ... (katta hajm) | Sekinlik | Ro'yxatga yig'ib "".join() |
"10" < "9" | Noto'g'ri tartib | Songa aylantiring yoki key= bilan saralang |
"C:\new" | \n yangi qatorga aylanadi | r"C:\new" yoki pathlib (11-bob) |
Oxiridagi \n yoki bo'sh joy | Solishtirish False, lekin ko'zga bir xil | repr() bilan tekshiring, strip() |
1. Slicing mashqi
is_palindrome(s) funksiyasini yozing: katta-kichik harf, bo'sh joy va
tinish belgilarini e'tiborsiz qoldirib, satr palindrommi tekshirsin.
"A man, a plan, a canal: Panama" → True. Maslahat: str.isalnum().
Maslahatni ko'rsatish
s[::-1] teskari qiladi. Palindrom: tozalangan satr o'zining teskarisiga teng.
2. Jadval chiqarish
Lug'atdagi model natijalarini ({"bert": 0.912, "gpt2": 0.8734, "distilbert": 0.9})
chiroyli jadval sifatida chiqaring: nomlar chapga, foizlar o'ngga, bitta
kasr xonasi bilan, eng yaxshi natija qatorining oxirida ★ belgisi.
Maslahatni ko'rsatish
f'{nom:<12}{qiymat:>8.2f}' kabi format. Eng uzun nom bo'yicha kenglikni hisoblash uchun max(len(n) for n in ...) ishlating.
3. Token taxmini
Bir xil ma'noli inglizcha va o'zbekcha paragraf oling. Ikkalasi uchun belgilar soni, so'zlar soni va UTF-8 baytlar sonini chiqaruvchi funksiya yozing. Qaysi biri "qimmatroq"? (23-bobda haqiqiy token sonini API orqali tekshiramiz.)
Maslahatni ko'rsatish
split() so'zlarni beradi. Unicode belgilarni hisoblash uchun len(); baytlar uchun len(s.encode()).
4. Log qatorini tahlil qilish
Quyidagi formatdagi qatordan sana, daraja va xabarni ajratib oling
(regex ishlatmasdan, faqat split/partition bilan):
"2026-10-01 14:03:22 | ERROR | Model yuklanmadi: timeout" →
("2026-10-01 14:03:22", "ERROR", "Model yuklanmadi: timeout").
Xabarning o'zida | bo'lsa ham to'g'ri ishlashi kerak.
- 01Satr — immutable Unicode belgilar ketma-ketligi; metodlar yangi satr qaytaradi.
- 02Slicing [start:stop:step]: stop kirmaydi; xuddi shu sintaksis list, NumPy va tensorlarda ham.
- 03strip, split, join, replace, startswith, in — eng ko'p ishlatiladigan vositalar.
- 04f-string: {x:.2f}, {n:,}, {p:.1%}, {s:<10}, debug uchun {x=}, repr uchun {x!r}.
- 05str ↔ bytes: encode/decode, deyarli har doim UTF-8; fayllarda encoding'ni har doim yozing.
- 06O'zbekcha matnda apostroflar turlicha — avval normalizatsiya qiling.
- 07Promptlar — oddiy satrlar; foydalanuvchi matnini chegaralab qo'ying va prompt injection'ni unutmang.
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.
01Palindrom
is_palindrome(s) — satr palindrommi (teskarisiga teng) tekshirsin. Katta-kichik harf, bo'sh joy va tinish belgilari e'tiborsiz qoldirilsin. "A man, a plan, a canal: Panama" → True.
02Apostrof normalizatsiyasi
normalize_uz(matn) — o'zbekcha matndagi turli apostroflarni (ʻ, ‘, ’, ` `, ʼ) oddiy ' ga almashtirsin va ketma-ket bo'sh joylarni bittaga qisqartirib, chetlarini tozalasin. " Oʻzbekiston gʻalabasi " → "O'zbekiston g'alabasi"`.
03Log qatorini ajratish
parse_log(line) — "2026-10-01 14:03:22 | ERROR | Model yuklanmadi: timeout" formatidagi qatordan (vaqt, daraja, xabar) tuple'ini qaytarsin. Xabarning o'zida | bo'lsa ham to'g'ri ishlasin.