May 5, 2025

Пост 05.05.2025

1. String nima?

Python'da string - bu matnli ma'lumotlarni ifodalash uchun ishlatiladigan ma'lumot turi. Stringlar belgilar ketma-ketligidan iborat bo'lib, ular bir tirnoq ('), ikkita tirnoq (") yoki uchta tirnoq (""") ichida yoziladi. Python'da stringlar Unicode formatida saqlanadi, ya'ni har qanday til yoki maxsus belgilarni (masalan, emoji yoki alohida simvollar) qo'llab-quvvatlaydi.

Stringlarning muhim xususiyati - ular o'zgarmas (immutable). Bu shuni anglatadiki, string yaratilgandan so'ng uning ichidagi belgilarni to'g'ridan-to'g'ri o'zgartirib bo'lmaydi. Agar o'zgartirish kerak bo'lsa, yangi string yaratiladi.

1.1. String yaratish usullari

Stringlarni turli usullarda yaratish mumkin:

# Oddiy stringlar
ism = "Ali"  # Ikkita tirnoq bilan
shahar = 'Toshkent'  # Bitta tirnoq bilan
bosh_string = ""  # Bo'sh string

# Ko'p qatorli string
uzun_matn = """Bu ko'p qatorli
matn misoli.
Uchta tirnoq bilan yoziladi."""

# Raw string (escape belgilarni o'qimaydi)
raw_matn = r"C:\\new\\test.txt"

# Unicode string
unicode_matn = "Salom \\u2764 Dunyo"  # Yurak belgisi

print(ism)  # Natija: Ali
print(shahar)  # Natija: Toshkent
print(uzun_matn)  # Natija: Ko'p qatorli matn
print(raw_matn)  # Natija: C:\\new\\test.txt
print(unicode_matn)  # Natija: Salom ❤ Dunyo

Izohlar:

  • Bitta va ikkita tirnoq: Ikkalasini ham ishlatish mumkin, lekin ichma-ich tirnoq ishlatilganda ehtiyot bo'lish kerak (masalan, "O'zbekiston" yoki 'O"zbekiston').
  • Uchta tirnoq: Ko'p qatorli matnlar, uzun sharhlar yoki SQL so'rovlari kabi murakkab matnlar uchun ishlatiladi.
  • Raw string: r prefiksi escape belgilarni (\\n, \\t) oddiy belgi sifatida talqin qiladi. Bu fayl yo'llari yoki regexlarda foydali.
  • Unicode: \\u yoki \\U bilan maxsus belgilarni qo'shish mumkin.

1.2. Stringning ichki tuzilishi

Python'da stringlar belgilar ketma-ketligi sifatida saqlanadi. Har bir belgi o'ziga xos indeks raqamiga ega:

  • Ijobiy indekslar: 0 dan boshlanadi (chapdan o'ngga).
  • Salbiy indekslar: -1 dan boshlanadi (o'ngdan chapga).

Masalan:

matn = "Python"
# Indekslar:   P  y  t  h  o  n
# Ijobiy:     0  1  2  3  4  5
# Salbiy:    -6 -5 -4 -3 -2 -1

2. Stringlar bilan asosiy operatsiyalar

Stringlar bilan ishlashda bir nechta asosiy operatsiyalar mavjud.

2.1. Stringlarni birlashtirish (Concatenation)

+ operatori yordamida ikki yoki undan ko'p stringlarni birlashtirish mumkin.

first_name = "Ali"
last_name = "Valiyev"
full_name = ism + " " + familiya  # Bo'shliq qo'shish
print(full_name)  # Natija: Ali Valiyev

Eslatma: Ko'p sonli stringlarni + bilan birlashtirish sekin ishlashi mumkin, chunki har bir birlashtirishda yangi string yaratiladi. Buning o'rniga join() metodi tavsiya etiladi (keyinroq tushuntiriladi).

2.2. Stringni takrorlash

  • operatori stringni ko'rsatilgan marta takrorlaydi.
soz = "Salom! "
takrorlangan = soz * 3
print(takrorlangan)  # Natija: Salom! Salom! Salom!

Qiziqarli misol:

chiziq = "-" * 20
print(chiziq)  # Natija: --------------------

2.3. String uzunligini aniqlash

len() funksiyasi stringdagi belgilar sonini (bo'shliqlar va maxsus belgilarni hisobga olgan holda) qaytaradi.

matn = "Python o'rganish qiziqarli!"
uzunlik = len(matn)
print(uzunlik)  # Natija: 25

Izoh: Unicode belgilari (masalan, emoji) odatda bitta belgi sifatida hisoblanadi.

2.4. String indekslari va kesish (Slicing)

Stringdagi har bir belgi indeks orqali murojaat qilinadi. Kesish (slicing) esa stringning bir qismini olish imkonini beradi.

matn = "Python"

# Indeks orqali belgi olish
birinchi_harf = matn[0]  # 0-indeksdagi belgi
oxirgi_harf = matn[-1]  # Oxirgi belgi
print(birinchi_harf)  # Natija: P
print(oxirgi_harf)  # Natija: n

# Kesish (slicing)
qism = matn[1:4]  # 1-indeksdan 4-indeksgacha (4 kirmaydi)
print(qism)  # Natija: yth

# Qadamli kesish
har_ikkinchi = matn[::2]  # Har ikkinchi belgi
teskari = matn[::-1]  # Teskari tartib
print(har_ikkinchi)  # Natija: Pto
print(teskari)  # Natija: nohtyP

Kesish formati: [start:stop:step]

  • start: Qayerdan boshlash (agar bo'sh bo'lsa 0-indeksdan boshlab).
  • stop: Qayergacha (bu indeks kirmaydi, agar bo'sh bo'lsa oxirigacha oladi).
  • step: Qadam (agar bo'sh bo'lsa 1).

Qiziqarli misol:

matn = "Salom, Dunyo!"
print(matn[::2])  # Natija: Slo uy!
print(matn[-5:-1])  # Natija: unyo

2.5. String ichida kerali belgilar bor yoki yo’qligini tekshirish

in va not in operatorlari string ichida qism bor-yo'qligini tekshiradi.

matn = "Salom, Dunyo!"
if "Dunyo" in matn:
    print("Dunyo so'zi mavjud")  # Natija: Dunyo so'zi mavjud
if "Olam" not in matn:
    print("Olam so'zi mavjud emas")  # Natija: Olam so'zi mavjud emas

2.6. Stringlarni taqqoslash

Stringlar ==, !=, <, >, <=, >= operatorlari bilan taqqoslanadi. Taqqoslash Unicode kodlari asosida amalga oshiriladi (alfbo tartibida).

matn1 = "Ali"
matn2 = "Bob"
print(matn1 == matn2)  # Natija: False
print(matn1 < matn2)  # Natija: True (A < B)

3. String metodlari

Python'da stringlar bilan ishlash uchun 40 dan ortiq metod mavjud. Quyida barcha metodlar guruhlarga bo'lingan holda, har biri uchun misollar va qo'llanilishi tushuntiriladi.

3.1. Harf registrini o'zgartirish metodlari

Bu metodlar stringdagi harflarning katta-kichikligini o'zgartiradi. Belgilar (raqamlar, simvollar) o'zgarmaydi.

  • upper(): Barcha harflarni katta harfga aylantiradi.
matn = "salom DUNYO"
print(matn.upper())  # Natija: SALOM DUNYO

  • lower(): Barcha harflarni kichik harfga aylantiradi.
print(matn.lower())  # Natija: salom dunyo

  • title(): Har bir so'zning birinchi harfini katta, qolganlarini kichik qiladi.
matn = "salom dunyo python"
print(matn.title())  # Natija: Salom Dunyo Python

  • capitalize(): Faqat stringning birinchi harfini katta, qolganlarini kichik qiladi.
print(matn.capitalize())  # Natija: Salom dunyo python

  • swapcase(): Katta harflarni kichik, kichik harflarni katta qiladi.
matn = "Salom DUNYO"
print(matn.swapcase())  # Natija: sALOM dunyo

Eslatma: Ushbu metodlar yangi string qaytaradi, asl string o'zgarmaydi.

3.2. Bo'shliq va maxsus belgilarni tozalash metodlari

Bu metodlar stringning boshida yoki oxirida joylashgan bo'shliqlar yoki maxsus belgilarni olib tashlaydi.

  • strip([chars]): Ikkala tarafdagi bo'shliq yoki ko'rsatilgan belgilarni olib tashlaydi.
matn = "!!!  Salom Dunyo  !!!"
print(matn.strip())  # Natija: Salom Dunyo
print(matn.strip("!"))  # Natija:   Salom Dunyo

  • lstrip([chars]): Faqat chap tarafdagi belgilarni olib tashlaydi.
print(matn.lstrip("!"))  # Natija:   Salom Dunyo  !!!

  • rstrip([chars]): Faqat o'ng tarafdagi belgilarni olib tashlaydi.
print(matn.rstrip("!"))  # Natija: !!!  Salom Dunyo

Izoh: chars parametri bo'lmasa, bo'shliqlar, tabulyatsiyalar (\\t), yangi qatorlar (\\n) olib tashlanadi.

3.3. Matnni qidirish va almashtirish metodlari

Bu metodlar string ichida qismni qidirish yoki almashtirish uchun ishlatiladi.

  • find(sub[, start[, end]]): Qismning birinchi paydo bo'lish indeksini qaytaradi. Topilmasa, -1 qaytaradi.
matn = "Salom, Dunyo! Dunyo yaxshi."
print(matn.find("Dunyo"))  # Natija: 7
print(matn.find("Olam"))  # Natija: -1
print(matn.find("Dunyo", 8))  # 8-indeksdan qidirish; Natija: 14

  • rfind(sub[, start[, end]]): Qismning oxirgi paydo bo'lish indeksini qaytaradi.
print(matn.rfind("Dunyo"))  # Natija: 14

  • index(sub[, start[, end]]): find ga o'xshaydi, lekin topilmasa ValueError chiqaradi.
print(matn.index("Dunyo"))  # Natija: 7
# print(matn.index("Olam"))  # ValueError

  • rindex(sub[, start[, end]]): rfind ga o'xshaydi, lekin topilmasa ValueError.
print(matn.rindex("Dunyo"))  # Natija: 14

  • replace(old, new[, count]): Qismni yangi matn bilan almashtiradi. count bilan almashtirish sonini cheklash mumkin.
print(matn.replace("Dunyo", "Olam"))  # Natija: Salom, Olam! Olam yaxshi.
print(matn.replace("Dunyo", "Olam", 1))  # Natija: Salom, Olam! Dunyo yaxshi.

3.4. Matnni bo'lish va birlashtirish metodlari

Bu metodlar stringni bo'lish yoki ro'yxatni stringga birlashtirish uchun ishlatiladi.

  • split([sep[, maxsplit]]): Matnni bo'luvchiga ko'ra ro'yxatga ajratadi.
matn = "Python,Java,C++,Go"
print(matn.split(","))  # Natija: ['Python', 'Java', 'C++', 'Go']
print(matn.split(",", 1))  # Natija: ['Python', 'Java,C++,Go']

  • rsplit([sep[, maxsplit]]): O'ngdan boshlab bo'ladi.
print(matn.rsplit(",", 1))  # Natija: ['Python,Java,C++', 'Go']

  • splitlines([keepends]): Matnni qatorlarga bo'ladi. keepends=True bo'lsa, yangi qator belgilari saqlanadi.
ko_p_qator = "Birinchi qator\\nIkkinchi qator"
print(ko_p_qator.splitlines())  # Natija: ['Birinchi qator', 'Ikkinchi qator']
print(ko_p_qator.splitlines(True))  # Natija: ['Birinchi qator\\n', 'Ikkinchi qator']

  • join(iterable): Ro'yxat yoki boshqa iteratsion ob'ektdagi stringlarni birlashtiradi.
suzlar = ['Python', 'Java', 'C++']
print("-".join(suzlar))  # Natija: Python-Java-C++

  • partition(sep): Matnni bo'luvchiga ko'ra uch qismga bo'ladi (oldin, bo'luvchi, keyin).
matn = "Python,Java,C++"
print(matn.partition(","))  # Natija: ('Python', ',', 'Java,C++')

  • rpartition(sep): O'ngdan boshlab bo'ladi.
print(matn.rpartition(","))  # Natija: ('Python,Java', ',', 'C++')

3.5. Tekshirish metodlari

Bu metodlar stringning tarkibini tekshiradi va True yoki False qaytaradi.

  • isalnum(): String faqat harf va raqamlardan iboratmi.
print("Python123".isalnum())  # Natija: True
print("Python 123".isalnum())  # Natija: False (bo'shliq bor)

  • isalpha(): String faqat harflardan iboratmi.
print("Python".isalpha())  # Natija: True
print("Python123".isalpha())  # Natija: False

  • isdigit(): String faqat raqamlardan iboratmi.
print("123".isdigit())  # Natija: True
print("12a3".isdigit())  # Natija: False

  • isdecimal(): String faqat o'nlik raqamlardan iboratmi.
print("123".isdecimal())  # Natija: True
print("²".isdecimal())  # Natija: False

  • isnumeric(): String raqamli belgilardan iboratmi (masalan, ½ yoki 123).
print("123".isnumeric())  # Natija: True
print("½".isnumeric())  # Natija: True

  • isspace(): String faqat bo'shliq belgilardan iboratmi.
print("   ".isspace())  # Natija: True
print(" a ".isspace())  # Natija: False

  • islower(): Hamma harflar kichikmi.
print("salom".islower())  # Natija: True
print("Salom".islower())  # Natija: False

  • isupper(): Hamma harflar kattami.
print("SALOM".isupper())  # Natija: True
print("Salom".isupper())  # Natija: False

  • istitle(): Har so'zning birinchi harfi katta, qolganlari kichikmi.
print("Salom Dunyo".istitle())  # Natija: True
print("Salom dunyo".istitle())  # Natija: False

  • startswith(prefix[, start[, end]]): String ko'rsatilgan prefiks bilan boshlanadimi.
matn = "Salom, Dunyo!"
print(matn.startswith("Salom"))  # Natija: True
print(matn.startswith("Dunyo", 7))  # Natija: True

  • endswith(suffix[, start[, end]]): String ko'rsatilgan suffiks bilan tugaydimi.
print(matn.endswith("Dunyo!"))  # Natija: True
print(matn.endswith("Salom", 0, 5))  # Natija: True

3.6. Formatlash va joylashtirish metodlari

Bu metodlar stringni ma'lum uzunlikda formatlash yoki joylashtirish uchun ishlatiladi.

  • center(width[, fillchar]): Matnni ko'rsatilgan uzunlikda markazlashtiradi.
matn = "Python"
print(matn.center(10, "*"))  # Natija: **Python**

  • ljust(width[, fillchar]): Matnni chapga tekislaydi.
print(matn.ljust(10, "-"))  # Natija: Python----

  • rjust(width[, fillchar]): Matnni o'ngga tekislaydi.
print(matn.rjust(10, "-"))  # Natija: ----Python

  • zfill(width): Matnni chapdan nollar bilan to'ldiradi.
print("42".zfill(5))  # Natija: 00042
print("-42".zfill(5))  # Natija: -0042

3.7. Maxsus metodlar

Bu metodlar maxsus holatlarda ishlatiladi.

  • expandtabs(tabsize=8): Tab belgilarni (\\t) ko'rsatilgan bo'shliqlarga aylantiradi.
matn = "Salom\\tDunyo"
print(matn.expandtabs(4))  # Natija: Salom    Dunyo

  • translate(table): Belgilarni almashtirish jadvaliga ko'ra o'zgartiradi.
  • maketrans(x[, y[, z]]): Almashtirish jadvalini yaratadi.
jadval = str.maketrans("aeiou", "12345")
print("Salom".translate(jadval))  # Natija: S1l4m

# Belgilarni o'chirish
jadval = str.maketrans("", "", "aeiou")
print("Salom".translate(jadval))  # Natija: Slm

3.8. Kodlash va dekodlash metodlari

Stringlar Unicode formatida bo'lsa-da, ularni baytlarga aylantirish mumkin.

  • encode(encoding='utf-8', errors='strict'): Stringni baytlarga kodlaydi.
matn = "Salom, Дунё!"
baytlar = matn.encode("utf-8")
print(baytlar)  # Natija: b'Salom, \\xd0\\x94\\xd1\\x83\\xd0\\xbd\\xd1\\x91!'

  • isascii(): String faqat ASCII belgilardan iboratmi.
print("Python".isascii())  # Natija: True
print("Salom, Дунё!".isascii())  # Natija: False

4. String formatlash usullari

Python'da stringlarni formatlashning bir nechta usullari mavjud. Quyida har biri chuqur tushuntiriladi.

4.1. % operatori (Eski usul)

Bu usul C tilidagi printf funksiyasiga o'xshaydi.

ism = "Ali"
yosh = 25
matn = "Ismim %s, yoshim %d" % (ism, yosh)
print(matn)  # Natija: Ismim Ali, yoshim 25

Formatlar:

  • %s: String
  • %d: Butun son
  • %f: O'nlik son
  • %.2f: Ikki xonali o'nlik son
narx = 19.99
print("Narx: %.2fquot; % narx)  # Natija: Narx: 19.99$

4.2. format() metodi

Bu usul ko'proq moslashuvchan va zamonaviyroq.

matn = "Ismim {}, yoshim {}".format("Ali", 25)
print(matn)  # Natija: Ismim Ali, yoshim 25

# Indeksli formatlash
matn = "Ismim {0}, yoshim {1}, yana ismim {0}".format("Ali", 25)
print(matn)  # Natija: Ismim Ali, yoshim 25, yana ismim Ali

# Ismli formatlash
matn = "Ismim {ism}, yoshim {yosh}".format(ism="Ali", yosh=25)
print(matn)  # Natija: Ismim Ali, yoshim 25

4.3. f-string (Python 3.6+, Eng zamonaviy)

f-stringlar eng qulay va tez usul hisoblanadi.

ism = "Ali"
yosh = 25
matn = f"Ismim {ism}, yoshim {yosh}"
print(matn)  # Natija: Ismim Ali, yoshim 25

# Ifodalar bilan
matn = f"Yoshim {yosh + 5} bo'ladi 5 yildan keyin"
print(matn)  # Natija: Yoshim 30 bo'ladi 5 yildan keyin

Qiziqarli misol:

son = 42
print(f"Son: {son:05d}")  # Natija: Son: 00042
print(f"Son: {son:.2f}")  # Natija: Son: 42.00

4.4. str.format_map() bilan formatlash

Lug'atlar bilan ishlash uchun qulay.

data = {"ism": "Ali", "yosh": 25}
matn = "Ismim {ism}, yoshim {yosh}".format_map(data)
print(matn)  # Natija: Ismim Ali, yoshim 25

5. Escape belgilari va Unicode

5.1. Escape belgilari

Escape belgilari maxsus ma'noga ega bo'lib, \\ bilan boshlanadi:

  • \\n: Yangi qator
  • \\t: Tabulyatsiya
  • \\\\: Orqa chiziq
  • \\": Ikkita tirnoq
  • \\': Bitta tirnoq
  • \\r: Qaytish belgisi
  • \\b: Backspace
matn = "Salom\\nDunyo\\tPython\\\\test"
print(matn)
# Natija:
# Salom
# Dunyo    Python\\test

5.2. Unicode belgilari

Unicode belgilari \\u (4 xonali) yoki \\U (8 xonali) bilan yoziladi.

matn = "Salom \\u2764 Dunyo"  # Yurak belgisi
print(matn)  # Natija: Salom ❤ Dunyo

matn = "Emoji: \\U0001F600"  # Kulayotgan emoji
print(matn)  # Natija: Emoji: 😊

Izoh: Unicode belgilarni topish uchun unicode.org yoki maxsus jadvallardan foydalaning.

6. Stringlar bilan ishlashda maxsus holatlar

6.1. O'zgarmaslik (Immutability)

Stringlar o'zgarmas bo'lgani uchun to'g'ridan-to'g'ri o'zgartirish mumkin emas.

matn = "Python"
# matn[0] = 'J'  # TypeError: 'str' object does not support item assignment
matn = "J" + matn[1:]  # Yangi string yaratish
print(matn)  # Natija: Jython

6.2. Performans masalalari

Ko'p sonli string birlashtirishlarda + operatori sekin ishlaydi, chunki har safar yangi string yaratiladi.

# Yomon usul
natija = ""
for i in range(1000):
    natija += str(i)

Yaxshi usul: join() bilan ro'yxatdan foydalanish.

natija = "".join(str(i) for i in range(1000))

6.3. Case sensitivity

Stringlar harf katta-kichikligiga sezgir. Masalan:

print("Python" == "python")  # Natija: False

7. Amaliy misollar

Misol 1: Parolni tekshirish

def parolni_tekshir(parol):
    if (len(parol) >= 8 and
        any(c.isupper() for c in parol) and
        any(c.islower() for c in parol) and
        any(c.isdigit() for c in parol) and
        any(not c.isalnum() for c in parol)):
        return "Parol kuchli"
    return "Parol zaif"

print(parolni_tekshir("Python123!"))  # Natija: Parol kuchli
print(parolni_tekshir("python"))  # Natija: Parol zaif

Misol 2: Matnni so'zlarga bo'lib, statistika chiqarish

matn = "Python dasturlash tili juda qulay va kuchli"
suzlar = matn.split()
uzunliklar = [len(suz) for suz in suzlar]
eng_uzun = max(suzlar, key=len)
print(f"So'zlar: {suzlar}")  # Natija: ['Python', 'dasturlash', 'tili', 'juda', 'qulay', 'va', 'kuchli']
print(f"Uzunliklar: {uzunliklar}")  # Natija: [6, 10, 4, 4, 5, 2, 6]
print(f"Eng uzun so'z: {eng_uzun}")  # Natija: dasturlash

Misol 3: Emailni tasdiqlash

def emailni_tekshir(email):
    if ("@" in email and
        email.count("@") == 1 and
        email.endswith((".com", ".org", ".net")) and
        email[0].isalnum() and
        len(email.split("@")[1].split(".")[0]) > 0):
        return "Email to'g'ri"
    return "Email noto'g'ri"

print(emailni_tekshir("user@example.com"))  # Natija: Email to'g'ri
print(emailni_tekshir("user@@example.com"))  # Natija: Email noto'g'ri

Misol 4: Caesar shifri bilan shifrlash

def caesar_shifr(matn, siljish):
    natija = ""
    for belgi in matn:
        if belgi.isalpha():
            ascii_kod = ord(belgi)
            baza = 65 if belgi.isupper() else 97
            yangi_kod = (ascii_kod - baza + siljish) % 26 + baza
            natija += chr(yangi_kod)
        else:
            natija += belgi
    return natija

matn = "Salom, Dunyo!"
shifrlangan = caesar_shifr(matn, 3)
print(shifrlangan)  # Natija: Vdorp, Gxqbr

Misol 5: Palindromni tekshirish

def palindrommi(matn):
    tozalangan = "".join(c.lower() for c in matn if c.isalnum())
    return tozalangan == tozalangan[::-1]

print(palindrommi("A man, a plan, a canal: Panama"))  # Natija: True
print(palindrommi("Python"))  # Natija: False

8. Stringlar bilan ishlashda ehtiyotkorlik

  • O'zgarmaslik: Har qanday o'zgartirish yangi string yaratadi. Bu xotirani ko'p ishlatishi mumkin.
  • Unicode muammolari: Turli tillardagi matnlar bilan ishlashda encode/decode metodlariga e'tibor bering.
  • Bo'shliqlar: strip(), lstrip(), rstrip() metodlari bo'shliqlarni e'tiborsiz qoldirishni oldini oladi.
  • Case sensitivity: Katta-kichik harflarga e'tibor bering, chunki ular farqli belgilar sifatida qabul qilinadi.
  • Performans: Katta matnlarda join() va ro'yxatlardan foydalanish + ga qaraganda samaraliroq.

Python'da stringlar dasturlashning eng muhim va ko'p qirrali qismidir. Ular bilan ishlash uchun boy metodlar, operatsiyalar va formatlash usullari mavjud. Ushbu qo'llanma stringlarning har bir detalini - yaratishdan tortib, murakkab manipulyatsiyalargacha - chuqur yoritdi. Misollar va izohlar yordamida siz stringlar bilan ishlashni to'liq o'zlashtira olasiz. Amaliyot uchun yuqoridagi misollarni sinab ko'ring va o'zingizning loyihalaringizda qo'llang. Stringlarni yaxshi bilish Python dasturchisi uchun muhim ko'nikmadir!