függvények ismétlése lista fogalma, használata Game of Life program (listák használatának gyakorlása) listák másolása (alap szintű, teljes körű) Reversi 2
Emlékeztető a függvények lényegében mini-programok, melyek egy nagyobb feladat egy-egy részfeladatát végezik el ezekből a mini-programokból bonyolult programokat építhetünk a függvények nagyon hasznosak ahhoz, hogy bonyolultabb programoknak áttekinthetőbb szerkezetet adjunk 2
Emlékeztető egy függvénynek van neve lehetnek bemeneti paraméterei (argumentumai) lehet visszatérési értéke a függvényt úgy használjuk, hogy meghívjuk leírjuk a nevét megadjuk a bemeneti paraméterek értékét felhasználjuk a visszatérési értékét 3
Emlékeztető egy függvénynek lehetnek lokális változói, amik csak a függvényen belül ismertek érdekességek: különböző függvényeknek lehetnek azonos nevű lokális változói (ezeket a program különböző változóként kezeli) függvény bemeneti paramétere lehet egy másik függvény neve a függvény definíciója hivatkozhat magára a függvényre (rekurzió) 4
Emlékeztető klasz dolgokat készítettünk! 5
Lista a lista egy összetett adattípus egy lista elemek sorozatából áll, ahol az elemek bármilyen típusú adatok lehetnek (akár listák is!) például: = ["János", 16, True] ['János', 16, True] 6
létrehozása 1. az elemeket szögletes zárójelek között, vesszővel elválasztva felsoroljuk (lásd előbbi példát) 2. a list() függvénnyel, melynek argumentuma olyan dolog, melynek elemei felsorolhatók 3. [ kifejezés for elem in objektum ] = ["János", 16, True] ['János', 16, True] = list(range(5)) [0, 1, 2, 3, 4] = list("helló!") ['H', 'e', 'l', 'l', 'ó', '!'] = [x**2 for x in range(5)] [0, 1, 4, 9, 16] 7
Műveletek listákkal a karakterláncokhoz hasonlóan listákat összeadhatunk és számmal szorozhatunk alkalmazhatjuk a len() függvényt alkalmazhatjuk az in és a not in operátorokat >>> [0] + [1, 2, 3] + [4, 5, 6] [0, 1, 2, 3, 4, 5, 6] >>> ['A']*5 ['A', 'A', 'A', 'A', 'A'] = [0, 1, 2, 3, 4] >>> len(l) 5 >>> 1 in L True >>> 10 in L False >>> 10 not in L True 8
Műveletek listákkal append() elem hozzáadása a lista végéhez extend() másik lista hozzáfűzése a lista végéhez insert() elem beszúrása a lista tetszőleges helyére = [1, 2, 3].append(4) [1, 2, 3, 4].extend([5, 6]) [1, 2, 3, 4, 5, 6].insert(0, 0) [0, 1, 2, 3, 4, 5, 6].insert(3, 'közepe') [0, 1, 2, 'közepe', 3, 4, 5, 6] 9
Műveletek listákkal pop() adott indexű elem eltávolítása a listából remove() eltávolítja az argumentum-ként adott elemet a listából (az első előfordulást keresi) index() visszaadja azt a pozíciót, ahol először elődordul egy adott elem a listában = [1, 2, 3, 4, 5].pop(2) 3 [1, 2, 4, 5] >>>.remove(2) [1, 4, 5].index(4) 1 10
Műveletek listákkal count() visszaadja, hogy egy adott elem hányszor fordul elő a listában reverse() megfordítja a lista elemeinek sorrendjét sort() növekvő (vagy csökkenő) sorba rendezi a lista elemeit = [1, 2, 3, 4, 5, 5].count(5) 2.count(6) 0.reverse() [5, 5, 4, 3, 2, 1] = [1, 3, 5, 2, 4].sort() [1, 2, 3, 4, 5].sort(reverse=True) [5, 4, 3, 2, 1] 11
Listaelem elérése és lista szeletelése a karakterláncokhoz hasonlóan egy lista egy adott elemére az elem indexének [ ]-be írásával hivatkozhatunk ha az x. és y. elemek közötti elemekre akarunk hivatkozni, akkor [x:y]-t írunk = [0, 1, 2, 3, 4, 5] [0] 0 [3] 3 [-1] 5 [-2] 4 [1:4] [1, 2, 3] [2:] [2, 3, 4, 5] [:-2] [0, 1, 2, 3] 12
Többdimenziós lista ha a lista elemei is listák, akkor többdimenziós listákat kapunk: 0 = [1, 2, 3] 1 = [4, 5, 6] 2 = [7, 8, 9] 3 = ['*', 0, '#'] = [L0, L1, L2, L3] [[1, 2, 3], [4, 5, 6], [7, 8, 9], ['*', 0, '#']] [1][2] 6 [-1][1] 0 13
Game of Life (életjáték) A Game Of Life egy celluláris automata működését illusztrálja: egy 2D rácson sejtek helyezkednek el, melyek egyszerű szabályok alapján szaporodnak vagy halnak meg. Az automata futtatásával élettel telik meg a játéktér. További információ és illusztráció: https://bitstorm.org/gameoflife/ Próbáld ki! 14
Game of Life (életjáték) A sejtek állapotát (él / nem él) egy 2D listában tárolhatjuk, melynek minden eleme 1 (él) vagy 0 (nem él) lehet. A szabályok a következők: ha egy sejt él, akkor a következő iterációban: életben marad, ha az élő szomszédainak száma 2 vagy 3 egyébként meghal ha egy sejt nem él, akkor a következő iterációban: újjászületik, ha az élő szomszédainak száma 3 egyébként halott marad. 15
Game of Life (életjáték) Induljunk ki a megadott lifegame-1.py programból, mely megrajzolja a játékteret, és amivel sejteket tutunk elhelyezni vagy törölni! Egészítsük ki ezt a programot az állapot tárolásával és újraszámolásával! A következő függvényeket írjuk meg: init_state() állapot inicializálása next_state() új állapot számolása draw_next_state() új állapot kirajzolása És hívjuk meg ezeket megfelelően a jobb vagy a bal egérgomb lenyomásakor! 16
másolása Próbáld ki! Mit tapasztalsz? 1 = ['alma', 'körte', 'szilva'] 1 ['alma', 'körte', 'szilva'] 2 = L1 2 ['alma', 'körte', 'szilva'] 2[0] = 'barack' 2 ['barack', 'körte', 'szilva'] 1 ['barack', 'körte', 'szilva'] Vesd össze ezzel! >>> A = 12 >>> A 12 >>> B = A >>> B 12 >>> B = 14 >>> B 14 >>> A 12 17
másolása 1 = ['alma', 'körte', 'szilva'] 1 ['alma', 'körte', 'szilva'] 2 = L1 2 ['alma', 'körte', 'szilva'] 2[0] = 'barack' 2 ['barack', 'körte', 'szilva'] 1 ['barack', 'körte', 'szilva'] L1 L2 alma barack körte szilva 18
Alapszintű másolás (shallow copy) Próbáld ki! Mit tapasztalsz? 1 ['barack', 'körte', 'szilva'] >>> import copy 3 = copy.copy(l1) 3 ['barack', 'körte', 'szilva'] 3.append('alma') 3 ['barack', 'körte', 'szilva', 'alma'] 1 ['barack', 'körte', 'szilva'] 19
Alapszintű másolás (shallow copy) Próbáld ki! Mit tapasztalsz? 0 = [1, 2, 3] 1 = ['alma', 'körte', L0] 1 ['alma', 'körte', [1, 2, 3]] 2 = copy.copy(l1) 2 ['alma', 'körte', [1, 2, 3]] 2[2].remove(3) 2 ['alma', 'körte', [1, 2]] 1 ['alma', 'körte', [1, 2]] 20
Alapszintű másolás (shallow copy) 0 = [1, 2, 3] 1 = ['alma', 'körte', L0] 1 ['alma', 'körte', [1, 2, 3]] 2 = copy.copy(l1) 2 ['alma', 'körte', [1, 2, 3]] 2[2].remove(3) 2 ['alma', 'körte', [1, 2]] 1 ['alma', 'körte', [1, 2]] L1 alma körte L0 1 2 3 L2 alma körte 21
Teljes körű másolás (deep copy) Próbáld ki! Mit tapasztalsz? 0 = [1, 2, 3] 1 = ['alma', 'körte', L0] 1 ['alma', 'körte', [1, 2, 3]] 2 = copy.deepcopy(l1) 2 ['alma', 'körte', [1, 2, 3]] 2[2].remove(3) 2 ['alma', 'körte', [1, 2]] 1 ['alma', 'körte', [1, 2, 3]] 22
Teljes körű másolás (deep copy) 0 = [1, 2, 3] 1 = ['alma', 'körte', L0] 1 ['alma', 'körte', [1, 2, 3]] 2 = copy.deepcopy(l1) 2 ['alma', 'körte', [1, 2, 3]] 2[2].remove(3) 2 ['alma', 'körte', [1, 2]] 1 ['alma', 'körte', [1, 2, 3]] L1 L2 alma körte alma körte L0 1 2 3 1 2 3 23
Összefoglalás egy lista elemek sorozatából áll, ahol az elemek bármilyen típusú adatok lehetnek (akár listák is!) listát létrhozhatunk úgy, hogy [ ]-ek között felsoroljuk az elemeit, vagy a list() függvénnyel 24
Összefoglalás műveletek listákkal: listák összeadása, len(), in, not in append(), extend(), insert(), pop(), remove() index(), count(), reverse(), sort() lista elem elérése és listák szeletelése: L[x], L[x:y] listák másolása: alapszintű másolás: copy.copy() teljes körű másolás: copy.deepcopy() 25
Reversi játék 2. verzió Egészítsük ki a korábbi Reversi játékot úgy, hogy a program magától fordítsa meg a korongokat, mikor lehelyezünk egy korongot! Ehhez tároljuk a tábla állapotát egy 2D listában (pl. kék korong esetén a mező állapota legyen 1, piros korong esetén -1, üres mező állapota pedig legyen 0)! A tárolt állapot alapján számoljuk ki, mely mezők állapotát kell változtatni egy korong lehelyezésekor! 26
Készítette: Buttyán Levente Levente.Buttyan@gmail.com CoderDojo Szentendre 2017 27