aidoc.uz

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.

▶ Video dars· Corey Schafer· 21:11· ingliz tilida
Python Tutorial for Beginners 2: Strings - Working with Textual Data

Satrlar bilan ishlash asoslari: indekslash, slicing, metodlar va formatlash. Bobdagi Unicode va o'zbekcha apostrof qismi videoda yo'q — uni bobdan o'qing.

YouTube'da ochish ↗

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

YozuvMa'no
\nYangi qator
\tTab
\\Teskari slesh
\', \"Tirnoq
\u0410Unicode 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 shunday

repr() 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 indeks
s = "Toshkent"
s[0]       # 'T'
s[-1]      # 't' — oxirgi belgi
s[10]      # IndexError: string index out of range

Kesish (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 kesadi

Immutable#

s = "salom"
s[0] = "S"            # TypeError: 'str' object does not support item assignment
s = "S" + s[1:]       # to'g'ri yo'l — yangi satr yaratish

3. 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 birlashtirish

join — 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()      # True

Registr 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 birinchisi

Registrsiz solishtirish uchun casefold() — lower()dan kuchliroq (nemischa ß kabi maxsus holatlarni ham to'g'ri qiladi):

"Straße".casefold() == "STRASSE".casefold()   # True

Tekislash#

"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'      — ikkilik

Jadval 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.1

Debug uchun = belgisi#

x = 3.14159
print(f"{x=}")              # x=3.14159
print(f"{x * 2 = :.3f}")    # x * 2 = 6.283

Bu 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'rinadi

Eski 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:

str
"Salom 👋"
.encode("utf-8")
matn → baytlar
bytes
b'Salom \xf0\x9f\x91\x8b'
.decode("utf-8")
baytlar → matn
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 nuqtasi
APOSTROFLAR = 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 solishtiriladi

Fayl 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.dedent bor, 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#

HolatBelgisiYechim
"Natija: " + 42TypeError: can only concatenate str (not "int") to strf"Natija: {42}"
", ".join([1, 2])TypeError: expected str instance", ".join(map(str, lst))
s.strip("abc") prefiks deb o'ylashKutilmagan belgilar o'chadiremoveprefix / removesuffix
open(...) encoding'sizWindows'da buzilgan kirill/o'zbek matniencoding="utf-8"
Turli apostroflarQidiruv topmaydi, dublikatlarNormalizatsiya: str.translate
Siklda s += ... (katta hajm)SekinlikRo'yxatga yig'ib "".join()
"10" < "9"Noto'g'ri tartibSonga aylantiring yoki key= bilan saralang
"C:\new"\n yangi qatorga aylanadir"C:\new" yoki pathlib (11-bob)
Oxiridagi \n yoki bo'sh joySolishtirish False, lekin ko'zga bir xilrepr() bilan tekshiring, strip()
Amaliy topshiriq

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.

Amaliy topshiriq

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.

Amaliy topshiriq

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

Amaliy topshiriq

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.

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

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.

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.