Array vs TupleHozir Pythonda tuple va list bir-biriga juda yaqin obyektlar sifatida qaralsa-da, aslida ikkalasining kelib chiqishi butunlay ikki xil olam.
List (array)Pythondagi list boshqa ko'pchilik tillardagi dynamic arrayga alternativ.
Array – mantiqiy jihatdan bir turdagi obyektlarning tartibli kolleksiyasi.
Ya'ni array bir xil turdagi bir qancha obyektlarni saqlash uchun ishlatiladi. Masalan, kompaniyadagi ishchilar ro'yxati. Arraydagi elementlar soni juda katta bo'lishi mumkin.
Arrayning eng kuchli tomoni bu ixtiyoriy indeksdagi elementni O(1) da olish mumkinligi. Odatda, oddiy matematikaga asoslangan offset qo'l keladi. Buning uchun ikkita shart bajarilishi kerak: arraydagi elementlar xotirada ketma-ket joylashishi va elementlarning o'lchami bir xil bo'lishi. Deylik, xotirada 1000 addressda joylashgan 32 bitli integerlardan iborat arrayning 6-o'rindagi elementini olish kerak bo'lsin. Array 1000 addressdan boshlanayapti, bizga kerakli elementdan oldingi 5 ta element 4 baytdan jami 20 bayt olsa, demak bizga kerakli element 1000 + 20 = 1020 addressda joylashgan bo'lishi kerak. Oddiy matematika yordamida kerakli element xotirada qayerda joylashganini O(1) da aniqlashning iloji bor. Umuman olganda, ko'p tillarda indekslash 1 emas 0 dan boshlanishiga sabab ham shu: indeks elementning tartib raqamini emas, u arrayning boshidan qancha uzoqda joylashganini ko'rsatadi.
TupleTuple – mantiqiy jihatdan bitta katta obyektni hosil qiladigan har xil turdagi obyekt(cha)larning tartibli kolleksiyasi.
Ya'ni tupledagi har bir element bir xil turda bo'lishi shart emas, aksincha, har bir element butun obyektning kichik bir qismi. Masalan,
(ishchining ismi, ishchining yoshi, ishchining maoshi) tupledagi 3 ta alohida element birlashib ishchi haqida (mantiqiy butun) ma'lumot beradi. Tupledagi elementlar soni odatda katta bo'lmaydi.
To'xta, sen aytayotgan narsa struct (yoki class) emasmi deyotgan bo'lsangiz demak tepadagilarni to'g'ri tushunayapsiz. Umuman olganda, struct ham xuddi tuplening ishini bajaradi, faqat qulay tomoni, u yerda har bitta elementga nom berilgan. Natijada 1-element ism, 2-si yosh, 3-si maosh deb eslab yurishga hojat qolmaydi. Aniqrog'i, sizning o'rningizga komputer eslab qoladi buni.
Endi eng qiziq joyi: agar elementlar o'lchami bir xil bo'lmasa unda tupleda qanday qilib elementni topamiz, offsetni hisoblash uchun elementlar o'lchami bir xil bo'lishi kerak edi-ku? Shunchaki bittalab yurib chiqamiz, boshqa variant yo'q. Masalan, tepadagi tupleda maoshni olmoqchi bo'lsak avval ism uchun uncha, yosh uchun buncha joy deb offsetni bittalab qo'shib chiqamiz. Natijada, elementni olish O(n) bo'lishi kerak edi. Lekin ozgina preprocessing orqali buni O(1) ga tushirsa bo'ladi. Tuple size odatda 100-200 dan oshmasligi hisobiga preprocessing ortiqcha ko'p vaqt va joy olmaydi.
P.S.1. Yuqoridagi narsalarni C/C++ kabi tillarda shunga yaqin holatda ko'rishingiz mumkin. Python, Javascript kabi tillarda bu narsalar ancha murakkab qurilgan va original ideadan ancha farq qiladi.
P.S.2. "Obyekt" deganda OOPdagi emas, umumiy, matematik obyekt nazarda tutilgan.
P.S.3. Strictly typed tillarda JSON obyektlarni struct/classga bind qilish yaxshiroqmi yoki map (key-value pair) ga? Bu savolning tepadagi mavzuga qanday aloqasi bor? Fikrlaringizni kommentariyada qoldiring.@boboshersnotes