Shanraq.org Shanraq.org
Тізім мен кортеж: өзін санай алатын чек
IT

Python: деректен өз есебіңізге дейін 5-сабақ (барлығы 56)

Тізім мен кортеж: өзін санай алатын чек

Python курсының бесінші сабағы. Тізімдегі бағалар: индекстер, тілімдер, өзгерту, сома мен ең үлкені — бірде-бір циклсіз. Бәрі сүрінетін айырма өлшенді: sorted() жаңа тізім қайтарады, .sort() бастапқысын өзгертіп, None береді. Сондай-ақ өзгеруден бас тартатын кортеж: TypeError.

Не үшін керек

Бір баға — бұл айнымалы. Чек — бұл қазірдің өзінде бағалар жиынтығы, ал оларды price_1, price_2 деген бөлек айнымалыларда ұстау мүмкін емес: нағыз файлда жолдар мыңдап.

Жиынтық үшін Python-да тізім бар. Ол көрінгеннен көбірек біледі: бәрін қосу, ең үлкенін табу, сұрыптау — бұның бәрі сіз цикл жазуды үйренбей тұрып.

Бірден тұтас

tizim.py файлы. Іске қосу: ортадан python tizim.py.

Бағдарлама ұзын — алпыс жол. Міндеттісі: тізім, тілімдер, sum, max және сұрыптау. itemgetter пен кортеж — соның үстінен: оларды бет-жүзінен танып қойса жеткілікті, тапсырмада керек болмайды.

"""5-сабақ: тізім мен кортеж — бір чектің бағаларында.

Циклдер әлі болған жоқ, олар мұнда керек те емес: кірістірілген функциялар
тізімді тұтас өңдейді, ал сұрыптауды ол өзі де істей алады.
"""

from operator import itemgetter

# Тізім — реттелген мәндер жиынтығы. Рет салынған қалпында сақталады: бұл
# реті жоқ «жиын» емес.
prices = [260, 620, 1890, 90]
names = ["нан", "сүт", "май", "тұз"]

print("== тізім түгел әрі бөліктермен")
print("барлық баға:   ", prices)
print("нешеу:         ", len(prices))
print("біріншісі:     ", prices[0])
print("соңғысы:       ", prices[-1])
print("алғашқы үшеуі: ", prices[:3])
print("екіншіден:     ", prices[1:])
print("кері ретпен:   ", prices[::-1])

print()
print("== тізімді өзгертуге болады")
prices.append(310)
print("append-тен соң:", prices)
prices[0] = 280
print("біріншісін көтердік:", prices)
last = prices.pop()
print("pop қайтарды:  ", last, "| қалды:", prices)

print()
print("== бірде-бір цикл жазбай санаймыз")
print("чектің сомасы: ", sum(prices))
print("ең қымбаты:    ", max(prices))
print("ең арзаны:     ", min(prices))
print("орташа баға:   ", sum(prices) / len(prices))

print()
print("== екі сұрыптау, әрі олардың айырмасы маңызды")
print("сұрыптауға дейін:", prices)
print("sorted() берді:", sorted(prices), "| бастапқысы:", prices)
prices.sort()
print(".sort() кейін: ", prices, "← тізімнің өзі өзгерді")
print("сөз ұзындығы:  ", sorted(names, key=len))
print("әліпби бойынша:", sorted(names, key=str.lower))

print()
print("== кортеж: өзгертілмейтін нәрсе")
item = ("нан", 280)
print("жазба:", item, type(item))
try:
    item[1] = 300
except TypeError as err:
    print("item[1] = 300 →", type(err).__name__, "—", err)

print()
print("== тарқату")
name, price = item
print("аты:", name, "| бағасы:", price)
a, b = 1, 2
a, b = b, a
print("үшінші айнымалысыз алмасу: a =", a, ", b =", b)

print()
print("== кортеждер тізімі — бұл қазірдің өзінде кесте")
check = [("нан", 280), ("сүт", 620), ("май", 1890), ("тұз", 90)]
print("баға бойынша: ", sorted(check, key=itemgetter(1)))
print("аты бойынша:  ", sorted(check, key=itemgetter(0)))
print("ең қымбат жол:", max(check, key=itemgetter(1)))

Шығатыны:

== тізім түгел әрі бөліктермен
барлық баға:    [260, 620, 1890, 90]
нешеу:          4
біріншісі:      260
соңғысы:        90
алғашқы үшеуі:  [260, 620, 1890]
екіншіден:      [620, 1890, 90]
кері ретпен:    [90, 1890, 620, 260]

== тізімді өзгертуге болады
append-тен соң: [260, 620, 1890, 90, 310]
біріншісін көтердік: [280, 620, 1890, 90, 310]
pop қайтарды:   310 | қалды: [280, 620, 1890, 90]

== бірде-бір цикл жазбай санаймыз
чектің сомасы:  2880
ең қымбаты:     1890
ең арзаны:      90
орташа баға:    720.0

== екі сұрыптау, әрі олардың айырмасы маңызды
сұрыптауға дейін: [280, 620, 1890, 90]
sorted() берді: [90, 280, 620, 1890] | бастапқысы: [280, 620, 1890, 90]
.sort() кейін:  [90, 280, 620, 1890] ← тізімнің өзі өзгерді
сөз ұзындығы:   ['нан', 'сүт', 'май', 'тұз']
әліпби бойынша: ['май', 'нан', 'сүт', 'тұз']

== кортеж: өзгертілмейтін нәрсе
жазба: ('нан', 280) <class 'tuple'>
item[1] = 300 → TypeError — 'tuple' object does not support item assignment

== тарқату
аты: нан | бағасы: 280
үшінші айнымалысыз алмасу: a = 2 , b = 1

== кортеждер тізімі — бұл қазірдің өзінде кесте
баға бойынша:  [('тұз', 90), ('нан', 280), ('сүт', 620), ('май', 1890)]
аты бойынша:   [('май', 1890), ('нан', 280), ('сүт', 620), ('тұз', 90)]
ең қымбат жол: ('май', 1890)

Талдау

Тізім: рет пен нөмірлер

prices = [260, 620, 1890, 90]

Тік жақшалар, мәндер үтір арқылы. Рет салынған қалпында сақталады, әр мәннің нөмірі бар — индекс.

Нөлден санайды: prices[0] — біріншісі. Теріс индекс соңынан санайды: prices[-1] — соңғысы, бұл prices[len(prices) - 1] дегеннен ыңғайлы.

Тілім: тізімнің бөлігі

prices[:3] — алғашқы үшеуі. prices[1:] — екіншісінен бастап. prices[::-1] — кері ретпен.

Ереже біреу: сол шек кіреді, оң шек кірмейді. prices[1:3] 1 мен 2 нөмірлі элементтерді береді, 3-ті емес. Бұл prices[:3] пен prices[3:] бірге тұтас тізімді қабаттаспай, жетіспейтін мәнсіз берсін деп жасалған.

Тілім жаңа тізім қайтарады; бастапқысы сол күйінде қалады.

Елестетіп көріңіз. Таспаны белгілер бойынша кесу. «3» белгісі — үшінші мен төртіншінің арасындағы сызық, үшіншінің өзі емес. Сондықтан 1-ден 3-ке дейін — екі бөлік, үшеу емес.

Тізімді өзгертуге болады

append соңына қосады, pop соңғысын алып, алынғанды қайтарады, ал индекс бойынша меншіктеу мәнді ауыстырады:

append-тен соң: [260, 620, 1890, 90, 310]
біріншісін көтердік: [280, 620, 1890, 90, 310]
pop қайтарды:   310 | қалды: [280, 620, 1890, 90]

Бұл тізімді өткен сабақтағы жолдан ажыратады: жол өзгермейді, тізім — керісінше.

Циклсіз санаймыз

чектің сомасы:  2880
ең қымбаты:     1890
ең арзаны:      90
орташа баға:    720.0

sum, max, min және len — кірістірілген функциялар, олар тізімді түгел қабылдайды. Орташасы — sum(prices) / len(prices), ал төртінші сабақта мұнда неге 720 емес, 720.0 шығатынын көрдік.

Осы жерді есте сақтаңыз: pandas модулінде миллион жолдық кесте бойынша дәл соны санағанда, пәрмен дерлік осылай көрінеді.

sorted() мен .sort() — екі басқа нәрсе

Жаңадан бастаушының ең жиі қатесі:

sorted() берді: [90, 280, 620, 1890] | бастапқысы: [280, 620, 1890, 90]
.sort() кейін:  [90, 280, 620, 1890] ← тізімнің өзі өзгерді

sorted(prices) жаңа сұрыпталған тізім қайтарады, бастапқысын қозғамайды. prices.sort() орнында сұрыптайды да, None қайтарады — сондықтан prices = prices.sort() деректеріңізді жойып, орнына бос қалдырады. Бұл — классикалық тұзақ, абзацты екі рет оқуға тұрарлық.

Сұрыптауды мән бойынша ғана емес жасауға болады. key= сұрыптаушы әр элементті өткізетін функцияны қабылдайды:

  • sorted(names, key=len) — сөз ұзындығы бойынша;
  • sorted(names, key=str.lower) — бас әріпті ажыратпай, әліпби бойынша;
  • sorted(check, key=itemgetter(1)) — жұптың екінші элементі, яғни баға бойынша.

operator модуліндегі itemgetter — «пәлен нөмірлі элементті ал» дегені. key= үшін өз функциямызды функциялар сабағында жазамыз.

Кортеж: өзгертілмейтін жиынтық

item = ("нан", 280)

Тік жақшаның орнына дөңгелек — сонда кортеж шығады. Қазақ тілінде бұл терминнің өз сөзі орнықпаған: энциклопедияда да, әдебиетте де «кортеж» деп алынған, ал кодта ол tuple деп жазылады — екеуі бір нәрсе. Ол тізімге ұқсас, бірақ оны өзгерту мүмкін емес:

item[1] = 300 → TypeError — 'tuple' object does not support item assignment

Кортежді шын мәнінде жақша емес, үтір жасайды. Жақша тек топтастырады, оған көз жеткізу оңай:

type((280))   → int      — жай ғана жақшадағы сан
type((280,))  → tuple    — үтір кортеж жасайды
pair = 280, 1 → tuple    — жақшаның мүлде керегі жоқ

Осыдан бәрі сүрінетін ереже шығады: бір элементті кортежді ілулі үтірмен жазады — one = ("нан",). Онсыз бұл жай ғана жақшадағы жол.

Мұндай не үшін керек? Кортеж — бұл біртектес мәндер жиынтығы емес, жазба. ("нан", 280) — чектің қатары: атауы мен бағасы, әр орнының өз мағынасы бар. Төрт бағадан тұратын тізім — мағынасы бірдей төрт сан. «Мағынасы бірдей — тізім, әртүрлі — кортеж» дегені — тілдің ережесі емес, бағдар: тіл әртүрліден тұратын тізімге де, бірдейден тұратын кортежге де рұқсат етеді.

Тарқату

name, price = item

Сол жақта оң жақтағы элемент қанша болса, сонша ат — әрқайсысы өзінікін алады. Бұл item[0] мен item[1] дегеннен жақсы оқылады, нөмірмен қателесетін жер жоқ.

Осыдан үшінші айнымалысыз алмасудың атақты тәсілі шығады:

a, b = b, a

Оң жақта алдымен (b, a) кортежі жиналады, содан кейін ол сол жаққа тарқатылады. Уақытша айнымалы да, шатасу да жоқ.

Кортеждер тізімі — бұл қазірдің өзінде кесте

баға бойынша: [('тұз', 90), ('нан', 280), ('сүт', 620), ('май', 1890)]

Әр элемент — өрістері бар жол, бүкіл тізім — кесте. pandas пайда болғанға дейінгі міндеттердің жартысында дерек осылай көрінеді: жолдар тізімде, өрістер кортежде.

Сабақ картасы

Сабақ картасы: тізім, тілім және кортеж

Өз сөзіңізбен айтыңыз

Қарамай, дауыстап немесе қағазға жауап беріңіз. Жауаптар — сабақтың соңында.

  1. prices[1:3] неге үшеуін емес, екеуін береді?
  2. sorted(prices) prices.sort()-тан несімен өзгеше әрі екіншісі нені қайтарады?
  3. Деректі қашан тізімге емес, кортежге салады?

Жаттығу

Тапсырмаға дейінгі үш қысқа қадам: болжау, толықтыру, жөндеу. Жауаптары — сабақтың соңында, бірақ алдымен өзіңіз жауап беріңіз.

1. Болжаңыз. Бұл жол не басып шығарады?

prices = [260, 620, 1890]
print(prices[0], prices[-1], len(prices), prices[:2])

2. Бос орынды толтырыңыз. ... орнына орташа бағаны санаңыз — циклсіз, циклдер әлі болған жоқ.

prices = [260, 620, 1890, 90]
print("орташа:", ...)

3. Жөндеңіз. Бағдарлама құлайды. Қатені оқып, соңғы бағаны алыңыз.

prices = [260, 620, 1890]
print(prices[3])

Тапсырма

Міндетті. Берілгені:

prices = [260, 620, 1890, 90, 310]
names = ["нан", "сүт", "май", "тұз", "жұмыртқа"]

Басып шығарыңыз: неше позиция бар, бірінші және соңғы баға; чектің сомасы; ең қымбаты мен ең арзаны; орташа баға екі таңбамен; алғашқы үш баға тілім арқылы; өсу ретімен тізім — және оның артынан бастапқысы, оның өзгермегені көрінсін; алғашқы екі атау тілім арқылы. Цикл жазбаңыз: мұның бәрін кірістірілген функциялар істейді.

Күтілетін шығу:

позиция: 5 | біріншісі: 260 | соңғысы: 310
чектің сомасы: 3170
ең қымбаты: 1890 | ең арзаны: 90
орташа баға: 634.00
алғашқы үшеуі: [260, 620, 1890]
өсу ретімен: [90, 260, 310, 620, 1890]
бастапқысы қозғалмаған: [260, 620, 1890, 90, 310]
атаулары: ['нан', 'сүт'] …

Дайын болғаны: шығу жол-жолмен сәйкес келеді; бүкіл жұмыстан кейін prices ішіндегі рет бұрынғыдай — демек, .sort() емес, sorted() алынған; соңғы баға len(prices) - 1 арқылы емес, -1 арқылы алынған.

Өз деректеріңізде. Өз чегіңізді жинаңыз: бағалар тізімі мен атаулар тізімі. Соманы, ең қымбат пен ең арзан бағаны, үтірден кейін екі таңбалы орташа бағаны және өсу ретімен сұрыпталған бағалар тізімін — бастапқы тізімді өзгертпей — басып шығарыңыз.

Қалауыңызша.

  • (атауы, бағасы) кортеждерінің тізімін жасап, оны алдымен баға, содан кейін атау бойынша сұрыптаңыз.
  • prices = prices.sort() не істейтінін тексеріп, нәтижені түсіндіріңіз.
  • prices[::2] тілімін алыңыз — әр екінші элемент. Тілімдегі үшінші санның нені білдіретінін болжап, болжамыңызды тексеріңіз.

Жобада бұл қайда тұрады

Бірінші сабақта біз Дүниежүзілік банктен жылдар бойынша мәндер қатарын алып, оны сол күйінде бастық. Енді оның не болғаны түсінікті: тізім. Әрі қарай жыл мен мәнді байланыстыруды үйренеміз — бұл сөздік, келесі сабақ.

Қарыздар. Кортеждер тізімі бойынша чектің сомасын әзірге санай алмаймыз: ол үшін тізімді аралау керек, ал циклдер — үш сабақтан кейін. Оның үстіне біз әлі атаулар мен бағаларды екі бөлек тізімде, реті сәйкес келеді деп үміттеніп ұстап отырмыз; сөздік бұл үмітті байланысқа ауыстырады.

Жауаптар

Жауаптарды көрсету

Сұрақтарға

  1. Өйткені тілімнің оң шегі кірмейді: 1 мен 2 нөмірлі элементтер алынады. Сонда prices[:3] пен prices[3:] бірге тұтас тізімді қабаттаспай береді.
  2. sorted() жаңа тізім қайтарады, бастапқысын қозғамайды; .sort() бастапқысын орнында сұрыптап, None қайтарады. Сондықтан prices = prices.sort() деректің орнына бос қалдырады.
  3. Мәндер мағынасы жағынан әртүрлі болып, бірге бір жазба құрағанда — мысалы, атауы мен бағасы. Тізімді қосуға да, өшіруге де болатын біртектес мәндер жиынтығына алады.

Жаттығуға

  1. 260 1890 3 [260, 620]. Санақ нөлден, -1 — соңғы элемент, ал [:2] тілімі алғашқы екеуін алады да, екінші индексті қоспайды.
260 1890 3 [260, 620]
  1. sum(prices) / len(prices). Екі функция да тізімді тұтас алады, сондықтан орташа баға бір жолмен саналады.
prices = [260, 620, 1890, 90]
print("орташа:", sum(prices) / len(prices))
орташа: 715.0
  1. IndexError: list index out of range. Тізімде үш элемент бар, демек индекстер 0, 1, 2, ал 3 — шеттен тыс. Соңғысын -1 арқылы алады, сонда тізім өзгерген сайын нөмірді қайта санаудың қажеті болмайды:
prices = [260, 620, 1890]
print(prices[-1])
1890

Дереккөздер

Мәтінде қате не теру қатесі кездессе, бізге айтыңыз

Тапсырманы тексеру

Алдымен VS Code-та шешіп, іске қосыңыз — редактор қатені сол жерде көрсетеді. Дайын шешімді осында қойыңыз. Тексеретін — модель: ол қатені атап көрсетеді, бірақ дайын жауапты бермейді.

Тексеру үшін кіру керек. Кіру

Пікірлер (0)

Әзірге пікір жоқ. Бірінші болыңыз.