Másolás

Macska Pure Evil felirattal

A megtestesült gonosz (ukadapta.com)

A régi szép időkben megtanultuk az elemi programozási tételeket. Közös bennük, hogy egy sorozathoz (nálunk ez ugyebár mindig lista volt) egy konkrét értéket rendelnek.

Hát akkor itt vannak a nagyfiúk: egy sorozathoz egy másik sorozatot rendelnek. Ha jó kedvük van. Ha rossz kedvük van, akkor többhöz rendelnek egyet. Durvák ezek, én mondom, tesó…

Az első összetett programozási tétel a másolás tétele:

  • Veszünk egy listát,
  • végigjárjuk az elemeit,
  • és minden elemet valamilyen formában átalakítunk,
  • az átalakított elemeket új listába gyűjtjük.

Hát ennyi. Persze van róla videó is:

Mondatszerű leírással, azaz pszeudokódban:


sorozat = valamilyen lista, range, vagy más bejárható objektum
másolat = üres lista, vagy miegymás

ciklus a sorozat minden elem-ére
    #az épp aktuális elemen lefuttatunk egy függvényt:
    átalakított_elem = valamilyen_függvény(elem) 
    másolat-hoz hozzáfűz(átalakított_elem)
ciklus vége

Mindez Pythonban:


def függvény(bemenet):
    #itt valamit varázsolunk
    #mondjuk hozzáadunk kettőt
    #vagy nagybetűssé alakítjuk
    return visszatérési_érték

sorozat = [1, 2, 3]
másik = [] #üres lista, létrehozhattuk volna így is: másik = list()

for elem in sorozat:
    másik.append(függvény(elem))

Lista lemásolása egy az egyben, háromféleképpen:


első = [1, 2, 3]
másik = első[:]
harmadik = list(első)
negyedik = első.copy()

Megjegyeznénk, hogy ezek úgynevezett sekély másolatok (shallow copy). És hogy az mi a pék, azt nem most beszéljük meg.

A map() függvény

arra jó, hogy egy bejárható objektum minden egyes tagján lefuttat egy függvényt. A függvény lehet beépített és saját is. A következő két program eredménye teljesen azonos.


egyik = [-1, 2, -3]
másik = list() #lehetett volna másik = [] is

for elem in egyik:
    másik.append(abs(elem))


egyik = [-1, 2, -3]
másik = list(map(abs, egyik))

Feladatok:

F0033a: Vágd be a másolás tételét!

F0033b: Adott egy lista az elmúlt hónap napi átlaghőmérsékleteivel. Meleg nap az, ahol 20℃ feletti a hőmérséklet. Írj másik listát, amelyben a “rendes” hőmérsékletek esetén az eredeti adat, “meleg” napok esetén egy felkiáltójel szerepel! Az eredeti listát véletlenszerű, 15 és 25 közötti számokkal feltöltve hozd létre. (Megoldás itt.)

F0033c: Adott az előző, hőmérsékleteket tartalmazó lista. Hozz létre egy listát, amely a hónap első napjánál egy 0-t, egyébként pedig +, -, illetve = jelet tartalmaz, aszerint, hogy az adott nap hőmérséklete az előzőnél nagyobb, kisebb, vagy azzal megegyező! (Megoldás itt.)

F0033d: Adott egy 2D lista, benne egy tanuló különböző tárgyakból vett átlageredményeivel, így: [[‘Irodalom’,  3.2], [‘Angol nyelv’, 4.6], [‘Matematika’, 3.8], [‘Informatika’, 1.4]]. Írj belőle bizonyítványt, ilyet:

Irodalom: közepes
Angol nyelv: jeles
Matematika: jó
Informatika: elégtelen

Három részre érdemes szétbontanod a feladatot:

  • egy függvényre, ami az első az átlag alapján szöveges értékelést ad (pl: 2 → elégséges)
  • egy másik függvényre, ami a listából egy másikat ír, amelyikben a tantárgy mellett már a szöveges érték szerepel
  • és aztán írd ki ezt az új listát

(Megoldás itt.)

F0033e: Írj függvényt, amely az átadott szóból madárnyelves (mavadávárnyevelveves) szót ad vissza! Az algoritmus lényege: ha magánhangzó, akkor kiírod a hangzót, egy v-t, megint a hangzót. (Megoldás itt.)

F0033f: Adott egy fájl, amelyik egy diák féléves jegyeit tartalmazza, ilyen:

Irodalom: 4, 5, 5, 4, 5, 3, 2, 1
Angol nyelv: 3, 3, 4, 5, 3, 4, 3
Matematika: 3, 4, 5, 3, 4, 2, 2, 2
Informatika: 1, 2, 1, 2, 1, 1

Írj belőle a d feladatban lévőhöz hasonló bizonyítványt! Írd ki az eredményt képernyőre és fájlba! (Megoldás itt.)

Múltkor a változók láthatóságával foglalkoztunk. Legközelebb a szétválogatás tétele következik.

Reklámok

Másolás” bejegyzéshez ozzászólás

  1. Kedves raerek!

    Azon gondolkodtam, hogy a ‘c’ feladatnál direkt nem csináltál függvényt a feladatmegoldós videóban, azért mert nem is lehet? Megpróbáltam, de valami nagyon nem stimmel, az lehet a hiba, hogy a függvényben bemenetnek listát akartam megadni listaelemek helyett?

    import random

    def hőmérséklet_változás(hőmérsékletek):
    for i in range(len(hőmérsékletek)):
    if i == 0:
    return 0
    elif hőmérsékletek[i] > hőmérsékletek[i-1]:
    return ‘+’
    elif hőmérsékletek[i] < hőmérsékletek[i-1]:
    return '-'
    else:
    return '='

    hőmérsékletek = list()

    for _ in range(30):
    hőmérsékletek.append(random.randint(15, 25))

    mappelt_lista = list(map(hőmérséklet_változás, hőmérsékletek))

    print(hőmérsékletek)
    print(mappelt_lista)

    Kedvelés

    • Hogyne lehetne:) Mindig lehet. A gond a megoldásodban az, hogy a map-pet nem jól használod. A map ugye egy lista minden elemén lefuttat egy olyan függvényt (innen jön a lényeg), ami csak egy értékkel operál. A függvnyek fogalma nincs róla, hogy őt most egy lista elemein fogják hívni, számára minden érték egyedi, és fogala sincs róla, hogy volt előző érték, amihez hasonlítgatnia kell a mostanit.

      Emiatt itt a map nem használható.

      A megoldás az, hogy a függvénynek átadod a hőmérsékletes listát, belül előállítod azt, ami nálad mappelt_lista néven fut, és a függvény végén return mappelt_lista van. A függvény hívása meg például: print(hőmérséklet_változás(hőmérsékletek)).

      Kedvelés

      • Kedves raerek!

        Köszönöm a válaszodat!

        Jól értem, hogy “mappelés” tehát olyan esetben nem használható, amikor a meghívott függvényben a bejárható objektum(lista) másik elemére/elemeire van hivatkozás, ugye? Vagyis vizuálisan leírva mondhatjuk azt, hogy amikor a map() egy lista adott elemén éppen futtatja a függvényt, akkor a függvénynek “nem engedi látni” a lista többi elemét?

        Kedvelés

      • Azért erre válaszolok, mert a wordpress nem enged a tiedre:(
        Igen, így van. A map-ból hívott függvénynek fogalma nincs róla, hogy őt épp elgy lista minden egyes elemére hívják, az ő szempontjából semmi köze egymáshoz a különböző hívások paraméterteinek.

        Kedvelés

Vélemény, hozzászólás?

Adatok megadása vagy bejelentkezés valamelyik ikonnal:

WordPress.com Logo

Hozzászólhat a WordPress.com felhasználói fiók használatával. Kilépés / Módosítás )

Twitter kép

Hozzászólhat a Twitter felhasználói fiók használatával. Kilépés / Módosítás )

Facebook kép

Hozzászólhat a Facebook felhasználói fiók használatával. Kilépés / Módosítás )

Google+ kép

Hozzászólhat a Google+ felhasználói fiók használatával. Kilépés / Módosítás )

Kapcsolódás: %s