Informatika2-2013/Gyakorlat14

A MathWikiből
(Változatok közti eltérés)
 
(egy szerkesztő 4 közbeeső változata nincs mutatva)
138. sor: 138. sor:
 
== Feladatok ==
 
== Feladatok ==
  
=== 1. Pozitív köb ===
+
=== 1. Harmadfokú függvény ===
  
 
Adott egy '''l''' listánk, pl:
 
Adott egy '''l''' listánk, pl:
 
  l = [-1, 3, -4, -2, 5, 6, -1, 1]
 
  l = [-1, 3, -4, -2, 5, 6, -1, 1]
 
Szeretnénk kiválasztani azon elemeit, melyekre a <math>x^3 - 2x^2 - 1</math> függvény pozitív értéket ad.
 
Szeretnénk kiválasztani azon elemeit, melyekre a <math>x^3 - 2x^2 - 1</math> függvény pozitív értéket ad.
 +
 +
Oldjátok meg a most tanult 3 módon: klasszikus módon '''map''' és/vagy '''filter'''-el, listaértelmezéssel és generátorfüggvénnyel.
 +
 +
=== 2. ABC számozva ===
 +
 +
Mostantól használjátok azt a módszert ami a legszimpatikusabb, én a listaértelmezést ajánlom, ezt tartják "pythonosnak".
 +
 +
'abcdefghijklmnopqrstuvwxyz'
 +
 +
Készítsünk egy olyan listát melyben párok vannak, egy pár az ABC egyik betûjébõl és az ABC-ben elfoglalt sorszámából áll. Ehhez kis segítség:
 +
 +
<python>
 +
[(i, i**2) for i in range(5)]
 +
#[(0, 0), (1, 1), (2, 4), (3, 9), (4, 16)]
 +
</python>
 +
 +
=== 3. Két dimenziós függvény ===
 +
 +
Két példa segítségnek:
 +
<python>
 +
[j for i in range(3) for j in range(i, 5)]
 +
#[0, 1, 2, 3, 4, 1, 2, 3, 4, 2, 3, 4]
 +
 +
[(i, j) for i in range(1, 4) for j in range(4, 7)]
 +
#[(1, 4), (1, 5), (1, 6), (2, 4), (2, 5), (2, 6), (3, 4), (3, 5), (3, 6)]
 +
</python>
 +
 +
Határozzátok meg a minimum értékét az <math> x^3 - y^2x + xy </math> függvénynek, a [-5, 5]x[-5, 5] halmaz egész rácspontjain. (Pl: (1,5), (4, 2), de nem (2.5, 4), vagy (6, 3)). Segítség még: van '''min''' függvény, próbáljátok ki.
 +
 +
Ha ez megvan találjátok meg melyik (x, y) pár(ok)hoz tartozik ez az érték.
 +
 +
=== 4. Prímek listája ===
 +
 +
Készítsetek a mai módszerek egyikével prímek egy listáját 50-ig. A megoldás menete (másképpen is lehet, ez csak egy ötlet):
 +
* Készítsetek egy listát amiben a 2 és 50 közötti összetett számok szerepelnek. (Nem könnyû, 2 ciklus kell.)
 +
* Ezek után egyszerûen a range(2, 50) listából válaszzátok ki azokat amik nincsnek az elõzõ listában.
 +
 +
=== 5. Mátrix * oszlopvektor ===
 +
 +
<python>
 +
M = [[1, 5, 8], [6, -2, -1], [-4, 2, 0]]
 +
v = [1, 6, -2]
 +
# eredmeny: [14, 18, 4]
 +
</python>
 +
 +
Ezeket szorozd össze a mai órán tanult módszerek segítségével.
 +
 +
=== 6. Mátrix * Mátrix ===
 +
 +
Írj mátrix szorzást a mai órán tanultak alapján. Pl:
 +
 +
<python>
 +
M1 = [[1, 5, 8], [6, -2, -1], [-4, 2, 0]]
 +
M2 = [[4, -3, -3], [5, 2, -1], [0, 5, -1]]
 +
# eredmeny: [[29, 47, -16], [14, -27, -15], [-6, 16, 10]]
 +
</python>

A lap jelenlegi, 2013. május 14., 10:15-kori változata

Tartalomjegyzék

Gyakorlat anyaga

A függvényközpontú programozás klasszikus elemei a Pythonban

A lambda kifejezések névtelen függvények, alakjuk:

lambda paraméterek: kifejezés

ahol a paraméterek egy esetleg üres lista, a kifejezés pedig egy elágazást, ciklust, return vagy yield utasítást nem tartalmazó (de esetleg feltételes) kifejezés lehet. Előnyük, hogy csak kifejezések, ezért más kifejezésekben is szerepelhetnek, és ha nem szükséges, nem kell nevet adni nekik. Csak nagyon egyszerű (félsoros) függvényekre használjuk!

lambda x: x ** 2
lambda x: "pozitív" if x > 0 else "nem pozitív"
lambda x, y: x + y

A ciklusok elkerülésére három egyszerű ,,klasszikus függvény szolgál:

  • megfeleltetés -- egy függvény egy bejárható (iterable) objektum minden elemére hat: map()
map(lambda x: x ** 2, [1, 2, 3, 4])  # [1, 4, 9, 16]
map(lambda x, y: x + y, [1, 2, 3, 4], [0, 10, 100, 1000]) 
                                # [1, 12, 103, 1004]
  • szűrés -- egy bejárható objektumnak csak azokat az elemeit tartjuk meg, amelyre egy függvény True értéket ad: filter()
filter(lambda x: x > 0, [-1, 2, -3, 4])  # [2, 4]


Listaértelmezések (list comprehensions) és generátorkifejezések

Megfeleltetés és szűrés másként

A fenti három függvény helyettesítésére szolgál a lista elemeinek a matematikában szokásos halmazmegadási módjára emlékeztető leírása, amelyben ciklus-szerű és feltétel-szerű nyelvi elem is szerepelhet. Alakjuk azonnal érthető:

[kifejezés for elem in bejárható_objektum]
[kifejezés for elem in bejárható_objektum if feltétel]
[kifejezés for elem1 in bejárható_objektum1 if feltétel1
           for elem2 in bejárható_objektum2 if feltétel2
           for elemN in bejárható_objektumN if feltételN]

Az utóbbi listaértelmezés a következő kóddal ekvivalens:

for elem1 in bejárható_objektum1:
    if not (feltétel1):
        continue
    for elem2 in bejárható_objektum2:
        if not (feltétel2):
            continue
        for elemN in bejárható_objektumN:
            if not (feltételN):
                continue
            kifejezés

Megadjuk a megfeleltetés és szűrés fenti első két példája e szintaktika szerinti változatát:

[x ** 2 for x in [1, 2, 3, 4]]  # [1, 4, 9, 16]
[x for x in [-1, 2, -3, 4] if x > 0]
Generátorkifejezések

A listaértelmezésekhez hasonló szintaktikával (szögletes helyett kerek zárójelekkel) generátorkifejezés is konstruálható. Ez tehát a next() függvény meghívásakor számítja ki a következő elemet. Szintaktikája:

(kifejezés for elem in bejárható_objektum)
(kifejezés for elem in bejárható_objektum if feltétel)
(kifejezés for elem in bejárható_objektum1 if feltétel1
           for elem in bejárható_objektum2 if feltétel2
           for elem in bejárható_objektumN if feltételN)

A alábbi generátorkifejezés mindig a következő négyzetszámot adja:

>>> y = (x**2 for x in range(10))
>>> print y
<generator object <genexpr> at 0xb740bb6c>
>>> y.next()
0
>>> y.next()
1
>>> y.next()
4
>>> y.next()
9
.......
>>> y.next()
64
>>> y.next()
81
>>> y.next()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
StopIteration

A következő két program ekvivalens, az egyikben generátorkifejezéssel, a másodikban yield segítségével adunk meg olyan függvényt, mely az első n négyzetszámot generáló függvényt ad vissza.

>>> def kovetkezo_negyzet(n):
...     for x in range(n):
...         yield x ** 2
... 
>>> y = kovetkezo_negyzet(3)
>>> print y
<generator object kovetkezo_negyzet at 0xb740ba7c>
>>> y.next()
0
>>> y.next()
1
>>> y.next()
4
>>> y.next()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
StopIteration

A második változat generátorkifejezéssel:

>>> def kovetkezo_negyzet(n):
...     return (x ** 2 for x in range(n)) 
... 
>>> y = kovetkezo_negyzet(3)
>>> print y
<generator object <genexpr> at 0xb740baa4>
>>> y.next()
0
>>> y.next()
1
>>> y.next()
4
>>> y.next()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
StopIteration


Feladatok

1. Harmadfokú függvény

Adott egy l listánk, pl:

l = [-1, 3, -4, -2, 5, 6, -1, 1]

Szeretnénk kiválasztani azon elemeit, melyekre a x3 − 2x2 − 1 függvény pozitív értéket ad.

Oldjátok meg a most tanult 3 módon: klasszikus módon map és/vagy filter-el, listaértelmezéssel és generátorfüggvénnyel.

2. ABC számozva

Mostantól használjátok azt a módszert ami a legszimpatikusabb, én a listaértelmezést ajánlom, ezt tartják "pythonosnak".

'abcdefghijklmnopqrstuvwxyz'

Készítsünk egy olyan listát melyben párok vannak, egy pár az ABC egyik betûjébõl és az ABC-ben elfoglalt sorszámából áll. Ehhez kis segítség:

[(i, i**2) for i in range(5)]
#[(0, 0), (1, 1), (2, 4), (3, 9), (4, 16)]

3. Két dimenziós függvény

Két példa segítségnek:

[j for i in range(3) for j in range(i, 5)]
#[0, 1, 2, 3, 4, 1, 2, 3, 4, 2, 3, 4]
 
[(i, j) for i in range(1, 4) for j in range(4, 7)]
#[(1, 4), (1, 5), (1, 6), (2, 4), (2, 5), (2, 6), (3, 4), (3, 5), (3, 6)]

Határozzátok meg a minimum értékét az x3y2x + xy függvénynek, a [-5, 5]x[-5, 5] halmaz egész rácspontjain. (Pl: (1,5), (4, 2), de nem (2.5, 4), vagy (6, 3)). Segítség még: van min függvény, próbáljátok ki.

Ha ez megvan találjátok meg melyik (x, y) pár(ok)hoz tartozik ez az érték.

4. Prímek listája

Készítsetek a mai módszerek egyikével prímek egy listáját 50-ig. A megoldás menete (másképpen is lehet, ez csak egy ötlet):

  • Készítsetek egy listát amiben a 2 és 50 közötti összetett számok szerepelnek. (Nem könnyû, 2 ciklus kell.)
  • Ezek után egyszerûen a range(2, 50) listából válaszzátok ki azokat amik nincsnek az elõzõ listában.

5. Mátrix * oszlopvektor

M = [[1, 5, 8], [6, -2, -1], [-4, 2, 0]]
v = [1, 6, -2]
# eredmeny: [14, 18, 4]

Ezeket szorozd össze a mai órán tanult módszerek segítségével.

6. Mátrix * Mátrix

Írj mátrix szorzást a mai órán tanultak alapján. Pl:

M1 = [[1, 5, 8], [6, -2, -1], [-4, 2, 0]]
M2 = [[4, -3, -3], [5, 2, -1], [0, 5, -1]]
# eredmeny: [[29, 47, -16], [14, -27, -15], [-6, 16, 10]]
Személyes eszközök