jsMath

Sage prog2

Sage programozása2

Listák másolása, átadása, hivatkozás rájuk:

Az alábbiakban megnézünk pár olyan példát, amely nem úgy működik, ahogyan azt elsőre gondolnánk. A paradoxon feloldása az, hogy a listát egy olyan objektumként kell elképzelni, ami csak kiíratáskor mutatja meg a tartalmát, minden értékadás esetén azonban csak egy hivatkozás történik az objektumra.

Például: Listák másolásánál figyeljünk rá, hogy = esetén csak a referencia (egy hivatkozás a listánkra) adódik át, és nem a lista másolódik le.

a=[1,2,3] 
       
b=a 
       
       
[1, 2, 3]
       
[1, 2, 3]
a[2] = 10000 
       
       
[1, 2, 10000]
       
[1, 2, 10000]

Ez nem történik meg, ha az alábbi módon másoljuk:

b=a[:] 
       
       
[1, 2, 10000]
       
[1, 2, 10000]
a[1]=9999 
       
       
[1, 9999, 10000]
       
[1, 2, 10000]

Az is megoldás, ha a[:] helyett list(a) parancsot írunk.

 

Nem várt eredményt kaphatunk minden olyan esetben, ahol több helyen használjuk fel ugyanazt a listát:

w=[1,2] 
       
q=[w,w,w] 
       
       
[[1, 2], [1, 2], [1, 2]]
q[0][1] = 10 
       
       
[[1, 10], [1, 10], [1, 10]]
       
[1, 10]

Ha w független példányait szeretnénk eltárolni q-ba, akkor  q=[w[:],w[:],w[:]] értékadást használjuk.

 

Ha a listát saját magába tesszük, akkor végtelen listát hozhatunk létre:

l=[1,2] 
       
l[0]=l 
       
       
[[...], 2]
l[0] 
       
[[...], 2]

Itt is a megoldás az l[:] használata:

l=[1,2] 
       
l[0]=l[:] 
       
       
[[1, 2], 2]

Listát átadhatunk egy függvénynek, amelynek joga van módosítani rajta:

s=[1,2,3] 
       
def atir(x): x[0]="alma" 
       
       
[1, 2, 3]
atir(s) 
       
       
['alma', 2, 3]

Megjegyzés: ha atir(s[:]) módon hívjuk meg a függvényt, akkor s első eleme nem változik. Ekkor ugyanis készít s-ből egy másolatot, és azzal hívja meg az atir függvényt.

 

Listák módosítása:

Előfordulhat, hogy egy lista részét akarjuk csak módosítani.

a=[1,2,3] 
       

Első két elem átírása:

a[0:2] = [66,77] a 
       
[66, 77, 3]

Első elem törlése:

a[0:1] = [] a 
       
[77, 3]

Bármely részt kicserélhetjük, a kicserélendő rész helyett berakhatunk kevesebb és több elemet tartalmazó listát is.

a[0:1] = [555,666,666] a 
       
[555, 666, 666, 3]
a[-1:] = [100,200,300] a 
       
[555, 666, 666, 100, 200, 300]

Van lehetőség beszúrásra. Ennek a címzése kicsit furcsa lehet elsőre. Ha az a[i]. elem után szeretnénk beszúrni (azaz az a[i+1] előtt), akkor az a[i+1:i+1] résznek adjunk új értéket.

a[2:2] = [4] a 
       
[555, 666, 4, 666, 100, 200, 300]

Használhatjuk a beépített listakezelő függvényeket is:

lista.append( elem ) -> beszúrja a végre a megadott elemet

lista.count( elem ) -> megszámolja hányszor van meg az elem a listában

lista.index( elem ) -> megadja az elem első előfordulását

lista.remove( elem ) - > eltávolítja az elem első előfordulását

lista.reverse() -> megfordítja a listát

lista.sort() -> sorba rendezi a listát

a.append(3) a 
       
[555, 666, 4, 666, 100, 200, 300, 3]
a.sort() a 
       
[3, 4, 100, 200, 300, 555, 666, 666]
a.count(666) 
       
2
a.remove(200) a 
       
[3, 4, 100, 300, 555, 666, 666]
a.remove(555) 
       
a.index(100) 
       
2

Tuple: nem csak listában tárolhatunk elemeket, hanem tuple-ben is. Ezeket úgy kezeljük, mint a listákat, csak később az elemeiken nem lehet módosítani. Bizonyos függvények tuple-t fogadnak el bemenetként. Nagyon ritkán fogjuk használni.

b = (1,2,3,4) 
       
b[1] 
       
2
b[1]=10 
       
Traceback (click to the left of this block for traceback)
...
TypeError: 'tuple' object does not support item assignment

A zárójelet ki sem kell írnunk:

b = 1,2,3,4,5 
       
       
(1, 2, 3, 4, 5)

Emlékszünk még a

q,w = w,q

értékadásra, amely során megcserélődtek az elemek? Ott is turple volt az egyenlőség mindkét oldalán. Megtehetjük listákkal is, bármilyen kombinációban:

q,w = [2,3] 
       
print q,w 
       
2 3
[q,w] = (w,q) print q,w 
       
3 2
(q,w) = [w,q] print q,w 
       
2 3
[q,w] = [w,q] print q,w 
       
3 2

Halmazok:

a=set( [2,3,10,3,1] ) 
       
       
set([1, 2, 3, 10])
1 in a 
       
True
for i in a: print i 
       
1
2
3
10
a.add(6) a 
       
set([1, 2, 3, 10, 6])

Konvertálás egyes típusok között:

Eddig volt lista (angolul list), halmaz (angolul set), turple (az angol neve után tuple), szöveg (angolul string, rövidítve str), egész (angolul integer, rövidítve int) és lebegőpontos egész (azaz tizedes tört, angolul float). Ezek között a konvertálás igen egyszerű:

int(3.2) 
       
3
float(3) 
       
3.0
int([1,2]) 
       
Traceback (click to the left of this block for traceback)
...
TypeError: int() argument must be a string or a number, not 'list'
int("23") 
       
23
str(1+1) 
       
'2'
str([1,2,3]) 
       
'[1, 2, 3]'
list( (2,3,4) ) 
       
[2, 3, 4]
tuple( [2,3,4] ) 
       
(2, 3, 4)
list(set( [2,1,1,10] )) 
       
[1, 2, 10]