12-dars: Ichma-ich tuzilmalar
3-blokMa'lumotni saqlash9–12 darslar
Bu darsdan keyin siz
- real ma’lumotni mos tuzilmalar bilan modellashtirasiz
- ichma-ich tuzilmaga qavat-qavat murojaat qilasiz
- ichma-ich sikl bilan butun tuzilmani aylanib chiqasiz
Nazariya
“Nazariya” bo'limiga havolaTuzilmani masala tanlaydi
“Tuzilmani masala tanlaydi” bo'limiga havolaYangi tuzilma o’ylab topish kerak emas — mavjudlarini bir-birining ichiga solish kifoya. Har qavat bitta savolga javob beradi: ro’yxat «tartib bilan nechta», lug’at «kimning nimasi».
# Lug'at ichida ro'yxat: har o'quvchining bir nechta bahosibaholar = {"Aziza": [5, 4, 5], "Bekzod": [4, 3]}print(baholar["Aziza"][1]) # 4# Lug'at ichida lug'at: kim, qaysi fandanjurnal = {"Aziza": {"matematika": 5, "fizika": 4}}print(jurnal["Aziza"]["fizika"]) # 4Murojaat chapdan o’ngga o’qiladi
“Murojaat chapdan o’ngga o’qiladi” bo'limiga havolajurnal["Aziza"]["fizika"] sirli ko’rinadi, lekin u ikki oddiy qadam:
avval jurnal["Aziza"] bajariladi va natijada lug’at chiqadi, keyin o’sha
lug’atdan ["fizika"] olinadi.
ichma-ich tuzilmanested structure
Bir tuzilmaning elementi sifatida boshqa tuzilma turishi. Har qavat mustaqil o’qiladi, shuning uchun murakkab ko’rinishdan qo’rqmaslik kerak.
Ro’yxat ichida lug’at
“Ro’yxat ichida lug’at” bo'limiga havolaBir turdagi yozuvlar ko’p bo’lganda bu shakl qulay — masalan har o’quvchi bitta yozuv bo’lgan jadval.
oquvchilar = [ {"ism": "Aziza", "sinf": "9-A", "baho": 5}, {"ism": "Bekzod", "sinf": "9-B", "baho": 4},]for o in oquvchilar: print(o["ism"], o["sinf"], o["baho"])Bu aynan 18-darsda CSV fayldan o’qiladigan shakl — shuning uchun uni yaxshi o’zlashtirish keyin ish beradi.
Ichma-ich aylanish
“Ichma-ich aylanish” bo'limiga havolaTashqi sikl o’quvchilar bo’ylab, ichki sikl har o’quvchining fanlari bo’ylab yuradi —
8-darsdagi ichma-ich sikl, faqat range o’rniga
tuzilma.
jurnal = { "Aziza": {"matematika": 5, "fizika": 4}, "Bekzod": {"matematika": 3, "fizika": 4},}for ism, fanlar in jurnal.items(): jami = sum(fanlar.values()) ortacha = jami / len(fanlar) print(ism, "o'rtacha:", round(ortacha, 2))Bashorat qiling
“Bashorat qiling” bo'limiga havolaAvval o'ylang: bu kod nima chiqaradi? Ishga tushirishdan oldin yozing.
baholar = {"Aziza": [5, 4, 5]}print(baholar["Aziza"][0])print(len(baholar["Aziza"]))print(len(baholar))Haqiqiy natija:
5 3 1
Birinchisi ichki ro'yxatning birinchi elementi. Ikkinchisi ichki ro'yxat uzunligi (3 baho). Uchinchisi tashqi lug'atda nechta kalit borligi — bitta o'quvchi.
Javobni ko'rish
5 3 1
Birinchisi ichki ro'yxatning birinchi elementi. Ikkinchisi ichki ro'yxat uzunligi (3 baho). Uchinchisi tashqi lug'atda nechta kalit borligi — bitta o'quvchi.
Avval o'ylang: bu kod nima chiqaradi? Ishga tushirishdan oldin yozing.
oquvchilar = [ {"ism": "Aziza", "baho": 5}, {"ism": "Bekzod", "baho": 3},]jami = 0for o in oquvchilar: jami = jami + o["baho"]print(jami)Haqiqiy natija:
8
Yig'indi naqshi, faqat element son emas, lug'at. Har lug'atdan «baho» kaliti olinib qo'shildi: 5 + 3 = 8.
Javobni ko'rish
8
Yig'indi naqshi, faqat element son emas, lug'at. Har lug'atdan «baho» kaliti olinib qo'shildi: 5 + 3 = 8.
Sinab ko’r
“Sinab ko’r” bo'limiga havolaBitta sondan boshlab, sinf jurnalini bosqichma-bosqich yig’ing. Har bosqichda tuzilmaning chegarasi ko’rsatiladi — keyingi qavat aynan shu chegarani ochadi.
Ma'lumot quruvchi
Sinf jurnalini bosqichma-bosqich yig'ing: har bosqich oldingisining chegarasini ochadi.
Bu simulyator sinf jurnalini besh bosqichda yig'adi: bitta sondan boshlanib, lug'at ichidagi lug'atgacha. Har bosqichda tuzilma qanday savolga javob berishi va qanday chegarasi borligi yoziladi.
JavaScript'siz sinash: daftargajurnal = {"Aziza": {"matematika": 5}}deb yozing va jurnal["Aziza"]["matematika"] murojaatini qavat-qavat oching: avval tashqi lug'atdan «Aziza» olinadi, natija — lug'at; keyin undan «matematika» olinadi, natija — 5.
- Bitta qiymat
- Ro'yxat
- Lug'at
- Lug'at ichida ro'yxat
- Lug'at ichida lug'at
Qanday savolga javob beradi
Murojaat
Chegarasi
Xatoni toping
“Xatoni toping” bo'limiga havolaBu kod ataylab buzuq — xatoni toping
jurnal = {"Aziza": {"matematika": 5}}print(jurnal["Aziza"]["fizika"])Python shunday javob beradi:
Traceback (most recent call last): File "jurnal.py", line 2, in <module> print(jurnal["Aziza"]["fizika"]) KeyError: 'fizika'
Sababi va tuzatish
Birinchi qavat topildi — jurnal[«Aziza»] ishladi. Xato ikkinchi qavatda: ichki lug'atda «fizika» kaliti yo'q.
Traceback qaysi kalit yo’qligini aytadi, lekin qaysi qavatda ekanini aytmaydi.
Shu sababli uzun murojaatni tekshirganda uni bo’laklab ko’ring:
ichki = jurnal["Aziza"], keyin print(ichki). Xato qavatini bir zumda topasiz.
O’zingizni sinang
“O’zingizni sinang” bo'limiga havola1jurnal['Aziza']['fizika'] murojaati qanday tartibda bajariladi?
Javobni ko'rish
Chapdan o’ngga: avval jurnal[“Aziza”] bajarilib ichki lug’at
olinadi, keyin o’sha lug’atdan “fizika” kaliti olinadi.
2Har o'quvchining bir nechta bahosini saqlash uchun qanday tuzilma kerak?
Javobni ko'rish
Lug’at ichida ro’yxat: {"Aziza": [5, 4, 5]}. Kalit — ism,
qiymat — baholar ro’yxati.
3len(baholar) va len(baholar['Aziza']) nimani beradi?
Javobni ko'rish
Birinchisi tashqi lug’atdagi kalitlar sonini (nechta o’quvchi), ikkinchisi Azizaning baholari sonini.
4Uzun murojaatdagi xatoni qanday tez topasiz?
Javobni ko'rish
Murojaatni bo’laklab, oraliq natijalarni alohida o’zgaruvchiga yozib
print qilish kerak — qaysi qavatda uzilganini darhol ko’rsatadi.
5Ro'yxat ichida lug'at qanday holatda qulayroq?
Javobni ko'rish
Bir turdagi yozuvlar ko’p bo’lganda — jadval shaklidagi ma’lumot uchun. CSV fayldan o’qilgan ma’lumot aynan shu shaklda bo’ladi.
Topshiriq
“Topshiriq” bo'limiga havolaTopshiriq — darajangizni tanlang
Asos · 5–7-sinf — Vizual va aniq ko'rsatmali
Uch sinfdoshingiz uchun lug’at tuzing: kalit — ism, qiymat — uchta bahodan
iborat ro’yxat. Keyin har birining birinchi bahosini, oxirgi bahosini va
baholari sonini chiqaring. Bittasiga yangi baho qo’shing (append) va
natijani qayta chiqaring.
Mustahkam · 8–9-sinf — Matnli masala, o'zingiz tuzasiz
Sinf jurnalini «lug’at ichida lug’at» shaklida tuzing (kamida 4 o’quvchi,
3 fan). Programma chiqarsin: har o’quvchining o’rtacha bahosi, har fanning
sinf bo’yicha o’rtachasi va eng yuqori o’rtachaga ega o’quvchi ismi.
Hisobot f-string bilan tekislangan holda chiqsin.
Chuqur · 10–11-sinf — Algoritmik, chegara holatlari bilan
Maktab bazasini uch qavatda modellashtiring: sinf → o’quvchilar → fanlar → baholar. Keyin uch savolga javob beruvchi kod yozing: (1) qaysi sinfning umumiy o’rtachasi eng yuqori, (2) qaysi fan bo’yicha eng ko’p ikki bor, (3) barcha sinflarda 5 olgan o’quvchilar ro’yxati. Chegara holatlarini hisobga oling: bahosi yo’q o’quvchi, o’quvchisi yo’q sinf. Har savol uchun necha qavat aylanish kerak bo’lganini yozib qo’ying.
Darsni belgilash uchun JavaScript kerak. Bu progressni saqlash uchun ishlatiladi — darslikning o'zi JavaScript'siz ham to'liq o'qiladi.