15 / 59

Python Tuples

Kortejlar (Tuple) bilan tanishish

Kortej (tuple) Pythonda ro'yxatga (list) o'xshaydi. Ikkalasi orasidagi farq shuki, kortej bir marta belgilangandan so'ng uning elementlarini o'zgartira olmaymiz.

Kortej yaratish

Kortej barcha elementlarni qavslar () ichiga, vergul bilan ajratib joylashtirish orqali yaratiladi. Qavslar ixtiyoriy, lekin ularni yozish yaxshi amaliyot hisoblanadi. Kortej istalgan sondagi elementlarga ega bo'lishi va ular turli turdagi (integer, float, list, string va h.k.) bo'lishi mumkin.

example.py
# bo'sh kortej
my_tuple = ()
print(my_tuple)

# integerlardan iborat kortej
my_tuple = (1, 2, 3)
print(my_tuple)

# aralash ma'lumot turlaridan iborat kortej
my_tuple = (1, "Hello", 3.4)
print(my_tuple)

# ichma-ich (nested) kortej
my_tuple = ("mouse", [8, 4, 6], (1, 2, 3))
print(my_tuple)

# kortejni qavslarsiz ham yaratish mumkin
# bu tuple packing deb ham ataladi
my_tuple = 3, 4.6, "dog"
# tuple unpacking (kortejni yozib olish) ham mumkin
a, b, c = my_tuple
print(a, b, c)

Bitta elementli kortej yaratish biroz murakkabroq. Qavs ichida bitta element bo'lishining o'zi yetarli emas. Buning haqiqatan ham kortej ekanligini bildirish uchun oxirida vergul kerak bo'ladi.

example.py
>>> my_tuple = ("hello")   # faqat qavsning o'zi yetarli emas
>>> type(my_tuple)
<class 'str'>
>>> my_tuple = ("hello",)  # oxirida vergul kerak
>>> type(my_tuple)
<class 'tuple'>
>>> my_tuple = "hello",    # qavs ixtiyoriy
>>> type(my_tuple)
<class 'tuple'>

Kortejdagi elementlarga murojaat qilish

Kortej elementlariga murojaat qilishning bir nechta usuli bor.

Indekslash

Kortejdagi elementga murojaat qilish uchun [] indeks operatoridan foydalanishimiz mumkin. Indeks 0dan boshlanadi. Shunday qilib, 6 ta elementga ega kortejning indeksi 0dan 5gacha bo'ladi. Bundan boshqasiga murojaat qilishga urinish IndexError xatoligini keltirib chiqaradi. Indeks integer bo'lishi shart. Float yoki boshqa turlardan foydalana olmaymiz, bu TypeErrorga olib keladi. Ichma-ich kortejlarga ichma-ich indekslash orqali murojaat qilinadi.

example.py
>>> my_tuple = ['p','e','r','m','i','t']
>>> my_tuple[0]
'p'
>>> my_tuple[5]
't'
>>> my_tuple[6]   # indeks oraliqda bo'lishi kerak
...
IndexError: list index out of range
>>> my_tuple[2.0] # indeks integer bo'lishi kerak
...
TypeError: list indices must be integers, not float
>>> n_tuple = ("mouse", [8, 4, 6], (1, 2, 3))
>>> n_tuple[0][3]  # ichma-ich indeks
's'
>>> n_tuple[1][1]  # ichma-ich indeks
4
>>> n_tuple[2][0]  # ichma-ich indeks
1

Manfiy indekslash (Negative Indexing)

Python o'z ketma-ketliklari uchun manfiy indekslashga ruxsat beradi. -1 indeksi oxirgi elementga, -2 esa oxiridan ikkinchi elementga ishora qiladi va hokazo.

example.py
>>> my_tuple = ['p','e','r','m','i','t']
>>> my_tuple[-1]
't'
>>> my_tuple[-6]
'p'

Slicing (Kesib olish)

Slicing operatori (ikki nuqta) yordamida kortejdagi elementlar oralig'iga murojaat qilishimiz mumkin.

example.py
>>> my_tuple = ('p','r','o','g','r','a','m','i','z')
>>> my_tuple[1:4]  # 2-dan 4-gacha bo'lgan elementlar
('r', 'o', 'g')
>>> my_tuple[:-7]  # boshidan 2-gacha bo'lgan elementlar
('p', 'r')
>>> my_tuple[7:]   # 8-dan oxirigacha bo'lgan elementlar
('i', 'z')
>>> my_tuple[:]    # boshidan oxirigacha bo'lgan barcha elementlar
('p', 'r', 'o', 'g', 'r', 'a', 'm', 'i', 'z')

Slicing'ni indeksni elementlar orasida deb hisoblasak, eng yaxshi tasavvur qilish mumkin, quyida ko'rsatilganidek. Shunday qilib, agar oraliqqa murojaat qilmoqchi bo'lsak, kortejning kerakli qismini kesib oladigan indeks kerak bo'ladi.

kod
 *---*---*---*---*---*---*---*---*---*
 | p | r | o | g | r | a | m | i | z |
 *---*---*---*---*---*---*---*---*---*
 0   1   2   3   4   5   6   7   8   9
-9  -8  -7  -6  -5  -4  -3  -2  -1

Kortejni o'zgartirish yoki o'chirish

Ro'yxatlardan farqli o'laroq, kortejlar o'zgarmas (immutable). Bu shuni anglatadiki, kortej bir marta belgilangandan so'ng uning elementlarini o'zgartirib bo'lmaydi. Lekin agar elementning o'zi ro'yxat kabi o'zgaruvchan (mutable) ma'lumot turi bo'lsa, uning ichidagi elementlarni o'zgartirish mumkin. Shuningdek, kortejga boshqa qiymatlarni ham berishimiz mumkin (qayta belgilash).

example.py
>>> my_tuple = (4, 2, 3, [6, 5])
>>> my_tuple[1] = 9  # elementni o'zgartira olmaymiz
...
TypeError: 'tuple' object does not support item assignment
>>> my_tuple[3] = 9  # elementni o'zgartira olmaymiz
...
TypeError: 'tuple' object does not support item assignment
>>> my_tuple[3][0] = 9   # lekin o'zgaruvchan elementning ichidagi qiymatni o'zgartirish mumkin
>>> my_tuple
(4, 2, 3, [9, 5])
>>> my_tuple = ('p','r','o','g','r','a','m','i','z') # kortejlarga qayta qiymat berish mumkin
>>> my_tuple
('p', 'r', 'o', 'g', 'r', 'a', 'm', 'i', 'z')

Ikkita kortejni birlashtirish uchun + operatoridan foydalanishimiz mumkin. Bu konkatenatsiya (concatenation) deb ham ataladi. * operatori esa kortejni berilgan marta takrorlaydi. Bu amallar natijasida yangi kortej hosil bo'ladi.

example.py
>>> (1, 2, 3) + (4, 5, 6)
(1, 2, 3, 4, 5, 6)
>>> ("Repeat",) * 3
('Repeat', 'Repeat', 'Repeat')

Kortejdan elementlarni o'chira yoki olib tashlay olmaymiz. Lekin kortejni butunlay o'chirish del kalit so'zi yordamida mumkin.

example.py
>>> my_tuple = ('p','r','o','g','r','a','m','i','z')
>>> del my_tuple[3] # elementlarni o'chira olmaymiz
...
TypeError: 'tuple' object doesn't support item deletion
>>> del my_tuple    # butun kortejni o'chirish mumkin
>>> my_tuple
...
NameError: name 'my_tuple' is not defined

Python kortej metodlari

Elementlarni qo'shuvchi yoki o'chiruvchi metodlar kortejda mavjud emas. Faqat quyidagi ikkita metod mavjud.

Python kortej metodi

MetodTavsif
count(x)xga teng bo'lgan elementlar sonini qaytaradi
index(x)xga teng bo'lgan birinchi elementning indeksini qaytaradi
example.py
>>> my_tuple = ('a','p','p','l','e',)
>>> my_tuple.count('p')
2
>>> my_tuple.index('l')
3

Boshqa kortej amallari

Kortejda a'zolikni tekshirish

in kalit so'zi yordamida biror element kortejda mavjud yoki yo'qligini tekshirishimiz mumkin.

example.py
>>> my_tuple = ('a','p','p','l','e',)
>>> 'a' in my_tuple
True
>>> 'b' in my_tuple
False
>>> 'g' not in my_tuple
True

Kortej bo'ylab aylanib chiqish

for sikli yordamida kortejdagi har bir element bo'ylab aylanib chiqishimiz mumkin.

example.py
>>> for name in ('John','Kate'):
...     print("Hello",name)
...     
Hello John
Hello Kate

Kortej bilan ishlaydigan tayyor (built-in) funksiyalar

all(), any(), enumerate(), len(), max(), min(), sorted(), tuple() kabi tayyor funksiyalar odatda kortej bilan turli vazifalarni bajarish uchun ishlatiladi.

Kortej bilan ishlaydigan tayyor funksiyalar

FunksiyaTavsif
all()Kortejning barcha elementlari true bo'lsa (yoki kortej bo'sh bo'lsa) True qaytaradi.
any()Kortejning istalgan elementi true bo'lsa True qaytaradi. Agar kortej bo'sh bo'lsa, False qaytaradi.
enumerate()enumerate obyektini qaytaradi. U kortejning barcha elementlarining indeksi va qiymatini juftlik sifatida o'z ichiga oladi.
len()Kortejning uzunligini (elementlar sonini) qaytaradi.
max()Kortejdagi eng katta elementni qaytaradi.
min()Kortejdagi eng kichik elementni qaytaradi.
sorted()Kortejdagi elementlarni olib, saralangan yangi ro'yxatni qaytaradi (kortejning o'zini saralamaydi).
sum()Kortejdagi barcha elementlarning yig'indisini qaytaradi.
tuple()Iterable (ro'yxat, satr, to'plam, lug'at)ni kortejga aylantiradi.

Kortejning ro'yxatdan ustunligi

Kortej va ro'yxat bir-birining o'zgarmasligi va o'zgaruvchanligidan tashqari juda o'xshash ko'rinadi. Biz odatda kortejdan turli xil (heterogeneous) ma'lumot turlari uchun, ro'yxatdan esa bir xil (homogeneous) ma'lumot turlari uchun foydalanamiz. Ro'yxat o'rniga kortejni amalga oshirishning bir nechta afzalliklari bor. Mana ulardan bir nechtasi.

  • Kortejlar o'zgarmas bo'lgani uchun, kortej bo'ylab aylanib chiqish ro'yxatga qaraganda tezroq. Shunday qilib, bu biroz unumdorlik (performance) yutug'ini beradi.
  • O'zgarmas elementlarni o'z ichiga olgan kortejlar lug'at uchun kalit (key) sifatida ishlatilishi mumkin. Ro'yxat bilan bu mumkin emas.
  • Agar sizda o'zgarmaydigan ma'lumot bo'lsa, uni kortej sifatida amalga oshirish uning yozishdan himoyalangan (write-protected) bo'lib qolishini kafolatlaydi.
QBilimingizni sinab ko'ring
1 / 3

1. Kortej (tuple) va ro'yxat (list) orasidagi asosiy farq nima?