Változtatható, nem változtatható adatszerkezetek

Már megismerkedtünk a stringekkel és listákkal, mint összetettebb adatszerkezetek. Most lássunk egy újat, a tuple-t:

In [1]:
t = (1, 5, 6, 2, 1)
print t[2]
6
In [2]:
for e in t:
    print e
1
5
6
2
1
In [3]:
t[1] = 4
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-3-141c76cb54a2> in <module>()
----> 1 t[1] = 4

TypeError: 'tuple' object does not support item assignment

Amint látjátok teljesen úgy mûködnek, mint a listák, azzal az egy kivétellel, hogy nem változtathatók az elemei. Ha létrehoztunk valahogy egy tuple-t, akkor már csak úgy változtathatjuk meg az elemeit, ha újra létrehozzuk, hasonlóan, mint a stringek:

In [4]:
s = "kutya"
print s[2]
s = "macska"
t
In [5]:
for e in s:
    print e
m
a
c
s
k
a
In [6]:
s[2] = "n"
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-6-f73e294c4312> in <module>()
----> 1 s[2] = "n"

TypeError: 'str' object does not support item assignment

Szótárak

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:

In [7]:
d = {"kutya": 5}

Értékként bármilyen adattípus szerepelhet, nem kell megváltoztathatatlannak lennie:

In [8]:
d["macska"] = [1, 5]

Amint látjátok szótárba új elemet egyszerûen úgy vehetünk fel, ha egy új kulcshoz hozzárendelünk egy értéket:

In [9]:
print d
{'macska': [1, 5], 'kutya': 5}

Egy szótáron belül több féle kulcs is lehet:

In [10]:
d[5] = 7
d[(1, 5)] = "macska"
print d
d[(1, 5)] = "sajt"
print d
{(1, 5): 'macska', 5: 7, 'macska': [1, 5], 'kutya': 5}
{(1, 5): 'sajt', 5: 7, 'macska': [1, 5], 'kutya': 5}

A szótár kulcsai bejárhatók egy for ciklussal:

In [11]:
for kulcs in d:
    print kulcs, d[kulcs]
(1, 5) sajt
5 7
macska [1, 5]
kutya 5

A szótárak elemein nincs rendezés, így az elemek 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 (pl egész számok egy intervallumon). Ezeket a leképezett értékeket használja utána, hogy gyorsan elérhesse az elemeket. Ebbe mélyebben nem megyünk bele, de érdekességként a hash értékeket lekérhetjük a hash függvénnyel:

In [12]:
print hash((1, 5))
print hash(5)
print hash("macska")
print hash("macskb")
print hash("kutya")
1305282225
5
529859110
529859109
-103877465

Lokális és globális változók

Tekintsük az alábbi kódot, mit ír ki eredményül?

In [13]:
x = 6

def fv1():
    x = 0
    
print x

fv1()

print x
6
6

A fv1-ben használt x változó nem ugyanaz, mint a kód legelején használt. Amikor egy függvényen belül vagyunk, akkor minden külsõ változót csak értékként tudunk elérni, de megváltoztatni csak úgy nem tudunk, helyette ilyenkor egy lokális változót hozunk létre ugyanazzal a névvel, mely csak ebben a függvényben él.

In [14]:
x = 6

def fv1():
    print x

fv1()
6

Megmondhatjuk a függvénynek, hogy mi a külsõ globális változót szeretnénk használni a global kulcsszóval:

In [15]:
x = 6

def fv1():
    global x
    x = 0

print x

fv1()

print x
6
0

Tehát a változók, melyeket a függvényekben hozunk létre csak lokálisak és kívül, vagy más függvényekben nem fognak látszani:

In [16]:
def fv1():
    y = 6
    
def fv2():
    print y
    
fv1()
fv2()
---------------------------------------------------------------------------
NameError                                 Traceback (most recent call last)
<ipython-input-16-cf97bed027ae> in <module>()
      6 
      7 fv1()
----> 8 fv2()

<ipython-input-16-cf97bed027ae> in fv2()
      3 
      4 def fv2():
----> 5     print y
      6 
      7 fv1()

NameError: global name 'y' is not defined

Gyakorlás

In [ ]: