Kategória: Python gyerekeknek.
Idáig három adattípussal találkoztunk: szöveg, szám, logikai. Most megismerkedünk másik néggyel.
Lista
Elmélet
A lista alapvető fontosságú adatszerkezet, a Scratch-ben is benne van. Listát szögletes zárójelekbe írva ([…]) tudunk megadni:
fruits = ['alma', 'körte', 'szilva', 'barack'] print(fruits) # ['alma', 'körte', 'szilva', 'barack']
Scratch-ben a legegyszerűbb közvetlenül beírni az elemeket:
A korábban megismert for ciklussal is végig tudunk lépni a lista elemein:
for fruit in fruits: print(fruit)
A len() utasítással meg tudjuk nézni a lista hosszát:
print(len(fruits)) # 4
Ennek a Scratch megfelelője:
A lista adott sorszámú elemét szintén szögletes zárójellel tudjuk lekérdezni:
print(fruits[2]) # szilva
A már megszokott módon, a sorszámozás 0-tól indul. Scratch-ben a sorszámozás 1-től történik, így a fentinek megfelelő utasítás:
Ugyancsak a fenti módon megcímezve meg is tudunk változtatni egy elemet:
fruits[1] = 'narancs' print(fruits) # ['alma', 'narancs', 'szilva', 'barack']
Scratch-ben ugyanez:
Az append() művelettel tudunk hozzátenni elemet:
fruits.append('mandarin') print(fruits) # ['alma', 'narancs', 'barack', 'mandarin']
Az in művelettel le tudjuk kérdezni, hogy egy elem benne van-e a listában:
if 'barack' in fruits: print('A barack benne van a gyümölcsök listájában.') else: print('A barack nincs benne a gyümölcsök listájában.')
Scratch-ben:
Törölni tudunk elem és index alapján is:
fruits.remove('barack') print(fruits) # ['alma', 'narancs', 'szilva', 'mandarin'] fruits.pop(0) print(fruits) # ['narancs', 'szilva', 'mandarin']
Scratch-ben először le kell kérdezni az adott elem sorszámát (ez Pythonban is így van, de ott automatikusan történik):
Törlés sorszám alapján Scratch-ben:
Egy másik listát az extend() művelettel tudunk hozzáadni:
fruits.extend(['szilva', 'meggy', 'cseresznye']) print(fruits) # ['narancs', 'szilva', 'mandarin', 'szilva', 'meggy', 'cseresznye']
Ennek megfelelő művelet nincs a Scratch-ben, ott egy ciklus segítségével kell egyesével hozzáadni az elemeket.
A sort() művelettel tudjuk az elemeket rendezni:
fruits.sort() print(fruits) # ['cseresznye', 'mandarin', 'meggy', 'narancs', 'szilva', 'szilva']
Scratch-ben sem tudunk rendezni; a rendezést ott nekünk kell megvalósítanunk.
A clear() művelettel tudjuk törölni az elemeket:
fruits.clear() print(fruits) # []
Scratch-ben:
Feladat
A kvíz játékot készítsük el ciklus és lista segítségével! Ne legyen benne kódismétlés!
points = 0 questions = [ 'Mi Magyarország fővárosa? ', 'Hány fokon forr a víz? ', 'Melyik az az állat, amelyiknek nagy füle és hosszú ormánya van? ', 'Hogy mondjuk angolul azt, hogy alma? ', 'Mi volt Petőfi vezetéknevű költőnk keresztneve? ', ] answers = [ 'Budapest', '100', 'elefánt', 'apple', 'Sándor', ] for i in range(len(questions)): answer = input(questions[i]) if answer == answers[i]: print('Helyes!') points = points + 1 else: print('A válasz helytelen; a helyes válasz ' + answers[i] + ' lett volna.') print() percentage = str(100 * points / len(questions)) + '%' print('Az eredmény: ' + percentage)
Önálló feladat
A különböző nehézségű feladatok érjenek eltérő pontszámot!
Teszt
1. feladat
Mit csinál az alábbi kód?
fruits = ['alma', 'körte', 'szilva', 'barack'] print(fruits[len(fruits)])
A Kiírja, hogy barack
B Kiírja, hogy szilva
C Nem ír ki semmit
D Hibát ír ki
2. feladat
Mit csinál az alábbi kód?
fruits = ['alma', 'körte', 'szilva', 'barack'] print(fruits[1:3])
A Kiírja ezt: ['alma', 'körte', 'szilva']
B Kiírja ezt: ['alma', 'körte']
C Kiírja ezt: ['körte', 'szilva', 'barack']
D Kiírja ezt: ['körte', 'szilva']
3. feladat
Mit csinál az alábbi kód?
fruits = ['alma', 'körte', 'szilva', 'barack'] fruits.add('meggy') print(fruits)
A Kiírja ezt: ['alma', 'körte', 'szilva', 'barack', 'meggy']
B Kiírja ezt: ['alma', 'körte', 'szilva', 'barack']
C Nem ír ki semmit
D Hibát ír ki
Tuple
Speciális listaként felfoghatjuk az ún. tuple adatszerkezetet. Ez lényegében egy olyan lista, amit nem lehet megváltoztatni. A lekérdező műveletek tehát működnek, de a megváltoztatók (pl. elem hozzáadása, törlése, rendezése stb.) nem.
Az adatokat itt kerek zárójelben kell megadnunk:
fruits = ('alma', 'körte', 'szilva', 'barack')
A sorszám alapján történő lekérdezés ugyanaz, mint az igazi listáknál:
print(fruits[2]) # szilva
Viszont a módosítási kísérlet hibát eredményez:
fruits[1] = 'narancs' # TypeError
A fenti példában az elemek mind szavak voltak. Lehetett volna más is, pl. szám, vagy akár másik lista. A típusok vegyíthetőek is. Lista esetén nem célszerű vegyíteni, a tuple viszont alapvetően arra lett kitalálva, hogy vegyítsük.
Teszt
Mit csinál az alábbi kód?
fruits = ('alma', 'körte', 'szilva', 'barack') fruits.append('meggy') print(fruits)
A Kiírja ezt: ('alma', 'körte', 'szilva', 'barack', 'meggy')
B Kiírja ezt: ('alma', 'körte', 'szilva', 'barack')
C Nem ír ki semmit
D Hibát ír ki
Halmaz
Elmélet
A halmaz hasonló a listához, viszont van néhány lényeges eltérés:
- A halmazban egy elem csak egyszer szerepelhet, míg a listában akárhányszor.
- A halmazban az elemek sorrendje nem adott, így a szögletes zárójeles lekérdező műveletek sem működnek. (De a for ciklus igen.)
Halmaz a Scratch-ben nincs.
A halmazt kapcsos zárójelekkel ({…}) adhatjuk meg:
fruits1 = {'alma', 'körte', 'szilva', 'barack', 'alma'} fruits2 = {'meggy', 'szilva', 'alma', 'cseresznye'} print(fruits1) # {'körte', 'szilva', 'barack', 'alma'} print(fruits2) # {'meggy', 'szilva', 'alma', 'cseresznye'}
Vegyük észre az alábbiakat:
- A fruits1 halmazba két almát tettünk, de a listában már csak egy van.
- A kiírás sorrendje eltér a megadás sorrendjétől.
Elemeket hozzáadni ill. törölni érték szerint az add() ill. remove() eljárásokkal tudunk:
fruits1.add('meggy') fruits1.remove('szilva') print(fruits1) # {'alma', 'körte', 'barack', 'meggy'}
A halmaz elemszámát a len() eljárással tudjuk lekérdezni:
print(len(fruits1)) # 4
A szokásos halmazműveleteket (unió, metszet, különbség, szimmetrikus különbség) végre tudjuk hajtani:
fruits1 = {'alma', 'körte', 'szilva', 'barack', 'alma'} fruits2 = {'meggy', 'szilva', 'alma', 'cseresznye'} fruits_union = fruits1.union(fruits2) fruits_intersection = fruits1.intersection(fruits2) fruits_difference = fruits1.difference(fruits2) fruits_symmetric_difference = fruits1.symmetric_difference(fruits2) print(fruits_union) # {'barack', 'cseresznye', 'meggy', 'körte', 'alma', 'szilva'} print(fruits_intersection) # {'szilva', 'alma'} print(fruits_difference) # {'barack', 'körte'} print(fruits_symmetric_difference) # {'barack', 'cseresznye', 'meggy', 'körte'}
Fontos megjegyezni, hogy a műveletek az eredeti halmazt nem módosítják, hanem létrehoznak egy újat.
Feladat
Készítsünk egy olyan programot, amely bekéri a 7 törpe neveit. Addig kéri, amíg mindet helyesen be nem írtuk. A feladatot halmazokkal oldjuk meg!
dwarfs = {"Tudor", "Vidor", "Morgó", "Szundi", "Szende", "Hapci", "Kuka"} input_dwarfs = set() while True: dwarf = input('Törpe neve: ') if dwarf in dwarfs: if dwarf in input_dwarfs: print('Helyes, de már benne van.') else: print('Helyes') else: print('Helytelen!') input_dwarfs.add(dwarf) print('Eddig beírt törpék: ' + str(input_dwarfs)) intersection = dwarfs.intersection(input_dwarfs) print('Ebből helyesen beírtak: ' + str(intersection)) if intersection == dwarfs: print('Gratulálok, sikeresen beírtad mind!') break
Önálló feladat
Kérje be a hét napjait. Számolja a pontokat a következőképpen: minden helyes válasz 5 pont, a helytelen -2, és ha olyat írt be, ami már benne volt, akkor -1. A végén írja ki a pontszámot.
Extra: ha azt írja be, hogy "help", akkor kiír egy segítséget, de 5 pontot levon.
Teszt
1. feladat
Mit írhat ki az alábbi kód?
fruits = {'alma', 'körte', 'alma', 'barack', 'alma'} print(fruits)
A {'alma', 'körte', 'alma', 'barack', 'alma'}
B {'alma', 'körte', 'barack'}
C {'alma':3, 'körte':1, 'barack':1}
D Hibát ír ki
2. feladat
Mit írhat ki az alábbi kód?
fruits1 = {'alma', 'körte', 'szilva'} fruits2 = {'meggy', 'szilva', 'alma'} fruits1.union(fruits2) print(fruits1)
A {'szilva', 'körte', 'alma'}
B {'szilva', 'körte', 'alma', 'meggy'}
C {'szilva', 'körte', 'alma', 'meggy', 'szilva', 'alma'}
D Egyik sem
Szótár
Elmélet
A szótárban kulcs-érték párok találhatóak. Angolul a szótár dictionary, emiatt az elnevezése a Pythonban dict. Scratch-ben ilyen adatszerkezet nincs. Kapcsos zárójelek segítségével adjuk meg az elemeket, amelyek kettősponttal elválasztott kulcs-érték párok, vesszővel felsorolva, pl:
dictionary = { 'alma': 'apple', 'szilva': 'plum', 'körte': 'pear', 'barack': 'peach', }
Érdemes megfigyelni azt, hogy az utolsó elem után is van vessző. Ez nem kötelező, viszont egy hasznos lehetőség a Pythonban.
Lekérdezni szögletes zárójellel tudunk, ahol itt nem a sorszámot adjuk meg, hanem a kulcsot:
print(dictionary['alma']) # apple
Hasonló módon tudunk új elemet felvenni, ill. egy létezőt megváltoztatni:
dictionary['cseresznye'] = 'cherry'
A kulcs is és az érték is tetszőleges adatszerkezet lehet.
Feladat
Készítsük el a kvíz szótáras változatát! Ezáltal tetszőlegesen kibővíthetjük a kérdéseket.
points = 0 question_answer_dict = { 'Mi Magyarország fővárosa? ': 'Budapest', 'Hány fokon forr a víz? ': '100', 'Melyik az az állat, amelyiknek nagy füle és hosszú ormánya van? ': 'elefánt', 'Hogy mondjuk angolul azt, hogy alma? ': 'apple', 'Mi volt Petőfi vezetéknevű költőnk keresztneve? ': 'Sándor', } for question in question_answer_dict: answer = input(question) correct_answer = question_answer_dict[question] if answer == correct_answer: print('Helyes!') points = points + 1 else: print(f'A válasz helytelen; a helyes válasz {correct_answer} lett volna.') print() percentage = str(100 * points / len(question_answer_dict)) + '%' print('Az eredmény: ' + percentage)
Önálló feladat
A megoldás ne szöveg, hanem szám legyen, és az eltéréseket számolja.
Teszt
1. feladat
Hibás vagy helyes az alábbi kód?
fruits = { 'hazai': {'alma', 'körte', 'szilva', 'meggy', }, 'déli': {'banán', 'narancs', 'mandarin', }, }
A Helyes.
B Hibás, mert az érték nem lehet halmaz.
C Hibás, mert az értékként megadott két halmaz nem egyforma hosszú.
D Hibás, mert felesleges vesszők vannak benne.
2. feladat
Mit ír ki az alábbi kód?
dictionary = { 'alma': 'apple', 'szilva': 'plum', 'körte': 'pear', 'barack': 'peach', } print(dictionary['apple'])
A alma
B apple
C semmit
D hibát