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 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.
# 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.
>>> 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'>
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.
>>> 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.
>>> 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.
>>> 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.
*---*---*---*---*---*---*---*---*---*
| 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
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).
>>> 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.
>>> (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.
>>> 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
Elementlarni qo'shuvchi yoki o'chiruvchi metodlar kortejda mavjud emas. Faqat quyidagi ikkita metod mavjud.
Python kortej metodi
| Metod | Tavsif |
|---|---|
count(x) | xga teng bo'lgan elementlar sonini qaytaradi |
index(x) | xga teng bo'lgan birinchi elementning indeksini qaytaradi |
>>> my_tuple = ('a','p','p','l','e',)
>>> my_tuple.count('p')
2
>>> my_tuple.index('l')
3
Kortejda a'zolikni tekshirish
in kalit so'zi yordamida biror element kortejda mavjud yoki yo'qligini tekshirishimiz mumkin.
>>> 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.
>>> 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
| Funksiya | Tavsif |
|---|---|
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. |
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.