M = [[1, 2], [3, 4]]
Tömb egy elemét így érhetjük el:
M[0][1]
M = [[[1, 2], [3, 4]], [[5, 6], [7, 8]], [[0, 9], [0, 0]]] # 3x2x2-es tömb
M[2][0][1]
Írjunk olyan függvényt, mely kiír egy 2D tömböt táblázatszerűen ilyesmi formában:
1 2
3 4
def tomb_kiir(M):
for i in range(len(M)):
for j in range(len(M[i])):
print M[i][j], "\t", # TAB karakter
print
tomb_kiir([[1,2,3],[4,5,6],[7,8,9]])
tomb_kiir([[1,2,3, 3.5],[4,5,6, 6.5],[7,8,9, 9.5]])
Törzsvásárlói kedvezményt szeretnénk adni a vásárlóinknak. Adott a nevük (egyedi, string) és az eddigi vásárlásaik végösszege (egyenként). Minden ügyfélhez egy lista tartozik, melynek első eleme a személy neve, a második egy lista a vásárlások összegéről, például:
["Anett", [54, 23, 12, 56, 12, 71]]
A kedvezményt a következő módon adnánk:
Összes vásárlás > 200: 10%
Összes vásárlás > 500: 15%
Összes vásárlás > 1000: 20%
Írjuk meg a függvényt, mely megkapja a vásárlók listáját (elemei, mint a fenti "Anett" lista) és visszaad egy listát melyben 2 elemű listák vannak, az első elem a vásárló neve, a második a kedvezménye. Pl:
["Anett", 10]
Hogyan fogjunk neki? Bontsuk részfeladatokra!
Kétféle képpen lehet haladni (design):
# top-down
def kedvezmeny(vasarlok):
kedvezmenyek = []
for vasarlo in vasarlok:
kedvezmenyek.append(kedvezmeny_szamol(vasarlo))
return kedvezmenyek
def kedvezmeny_szamol(vasarlo):
nev = vasarlo[0]
osszeg = 0
for vasarlas in vasarlo[1]:
osszeg += vasarlas
return [nev, osszegbol_kedvezmeny(osszeg)]
def osszegbol_kedvezmeny(osszeg):
if osszeg > 1000:
return 20
if osszeg > 500:
return 15
if osszeg > 200:
return 10
return 0
kedvezmeny([["Anett", [54, 23, 12, 56, 12, 71]],
["Bela", [11, 3, 12, 1, 12, 55]],
["Hagrid", [111, 545, 343, 56, 12, 66]],
["Not_a_wizard", [54, 222, 65, 56, 43, 71]]])
Már megismerkedtünk a karakterláncokkal (sztringekkel) és listákkal, mint összetettebb adatszerkezetekkel. A szám-n-es vagy tuple megadása kerek zárójelek közt vesszőkkel elválasztva, vagy a tuple()
függvénnyel adható meg:
t = (1, 5, 6, 2, 1)
print t[2]
type(t)
l = [1, 2, 3]
t = tuple(l)
print t
for e in t:
print e
t[1] = 4
Bizonyos helyzetekben a zárójel el is hagyható:
x = 2, 3, 4
print x
x, y = 2, 3
print x
print y
1-hosszú tuple
nem összetévesztendő a sima zárójellel, ennek érdekében az utolsó (és egyben első) elem után vesszőt rakunk.
print type((1))
print type((1,))
A tuple-k úgy működnek, mint a listák egy kivétellel. A listák elemei változtathatók (mutable), a tuple elemei nem változtathatók (immutable). Egy tuple elemei csak úgy változtathatók meg, ha újra létrehozzuk, hasonlóan a string-ekhez:
s = ("l", "e", "l", "e", "t")
print s[2]
s = ("l", "e", "h", "e", "t")
for e in s:
print e,
s[2] = "l"
A szótárakat képzelhetjük úgy, mint kulcs-érték párok tárolóit. Egy szótár kulcsa bármilyen megváltoztathatatlan adatszerkezet lehet, akár egyszerű, mint egy egész vagy valós szám, akár egy tuple, vagy egy string.
Létrehozhatjuk kapcsos zárójellel { }
vagy a dict()
függvénnyel.
d = {"kutya": 5}
type(d)
Értékként bármilyen adattípus szerepelhet, nem kell megváltoztathatatlannak lennie:
d = {}
d["macska"] = [1, 5]
Szótárba új elemet úgy vehetünk fel, ha egy új kulcshoz hozzárendelünk egy értéket:
print d
Egy szótáron belül többféle kulcs is lehet:
d = dict()
d[5] = 7
d[(1, 5)] = "macska"
print d
d[(1, 5)] = "sajt"
d["macska"] = 3.14
print d
A szótár kulcsai bejárhatók egy for
ciklussal:
for kulcs in d:
print kulcs, ":", d[kulcs]
A szótárak elemeinek sorrendje véletlenszerűnek tűnhet. A háttérben a szótárak tárolási mechanizmusa áll.
A szótárak úgynevezett hash függvényt alkalmaznak, hogy a kulcsokat leképezzék egy véges halmazra. Ezeket a hash-értékeket használja az elemek gyors eléréséhez. A részletek ismertetése nélkül néhány hash érték, ami lekérhető a hash()
függvénnyel:
print hash((1, 5))
print hash(5), hash(0), hash(False), hash(True)
print hash((5,))
print hash("kutya")
print hash("kutyb")
print hash("mutya")
print hash("kutya, macska, kutya, macska, akármi, valami")
Több beépített python függvény és algoritmus is (mint például a dict
) használja a hash
függvényt.
Sőt ez nem csak a python-ban használatos, hanem a számítástechnika és kriptográfia más területein is fontos (mind alkalmazásban, mind elméletben) Haladó adatszerkezetek és algoritmuselemzési technikák, Friedl Katalin.
Mit csinál egy hash (több féle is van):
Ezen felül extra elvárások lehetnek (kriptográfiai hash):
dict
)Bejárható (iterable) az olyan adattípus, mely egyesével vissza tudja adni az összes értékét. Bejárásra a for
ciklus használható (ezt már előbb láttuk).
Több hasznos beépített függnény van ami bejárható objektumokra alkalmazható.
# ismétlés
print "kutya "*3
print (1, 2, 3)*3
print [1, 2, 3]*3
# konkatenálás
(1, 2) + (2, 4, 6)
# mind igaz-e (logikai többváltozós "és")
print all((False, True, True, True))
print all((0, 1, 1, 1))
# bármelyik igaz-e (logikai többváltozós "vagy")
any((0, 1, 1, 1))
# "transzponlás"
zip([1, 2, 3], [11, 12, 13], ["a", "b", "c"])
# összeg (számokra van, sztringekre ez nem)
sum((1, 2, 3))