24.02.2014 Aufrufe

4 in 1 - Medieninformatik - Hochschule RheinMain

4 in 1 - Medieninformatik - Hochschule RheinMain

4 in 1 - Medieninformatik - Hochschule RheinMain

MEHR ANZEIGEN
WENIGER ANZEIGEN

Sie wollen auch ein ePaper? Erhöhen Sie die Reichweite Ihrer Titel.

YUMPU macht aus Druck-PDFs automatisch weboptimierte ePaper, die Google liebt.

Programmieren <strong>in</strong> Python<br />

Funktionen<br />

Programmieren <strong>in</strong> Python<br />

Funktionen<br />

Vorgabewerte – Besonderheiten<br />

1 def suche(seq,ele,start=0,ende=len(seq)):<br />

Gültigkeit<br />

2 for pos <strong>in</strong> range(start, ende):<br />

• Parametername während der<br />

3 ...<br />

Def<strong>in</strong>ition der Vorgabewerte noch nicht 4 Traceback (most recent call last):<br />

nutzbar<br />

5 File "", l<strong>in</strong>e 1, <strong>in</strong> <br />

• Umgehen durch Markieren mit None<br />

und dynamische Berechnung<br />

Lebenszyklus<br />

• Vorgabewert wird nur e<strong>in</strong>mal<br />

ausgewertet, bei der<br />

Funktionsdef<strong>in</strong>ition<br />

• Überraschungen bei änderbaren<br />

Vorgabewerten<br />

• Änderungen bleiben über Aufrufe<br />

h<strong>in</strong>weg enthalten<br />

• Vermeiden durch Markieren mit None<br />

und dynamische Berechnung<br />

6 NameError: name ’seq’ is not def<strong>in</strong>ed<br />

1 >>> def oh(l, a=[]):<br />

2 a.append("ende")<br />

3 return l+a<br />

4 >>> oh([1,2],[3,4])<br />

5 [1, 2, 3, 4, ’ende’]<br />

6 >>> oh([1,2],[3,4,5])<br />

7 [1, 2, 3, 4, 5, ’ende’]<br />

8 >>> oh([1,2])<br />

9 [1, 2, ’ende’]<br />

10 >>> oh([1,2])<br />

11 [1, 2, ’ende’, ’ende’]<br />

12 >>> oh([1,2])<br />

13 [1, 2, ’ende’, ’ende’, ’ende’]<br />

Prof. Dr. Peter Barth (HS-Rhe<strong>in</strong>Ma<strong>in</strong>) Programmieren 3 29. Januar 2013 181 / 326<br />

Parameterübergabe mit Schlüsselwort<br />

Ziel<br />

• Viele Vorgabewerte verwenden, aber<br />

e<strong>in</strong>ige Parameter anders<br />

• Zwang Angabe aller früheren<br />

Parameter auflösen<br />

Schlüsselwortparameter<br />

• Parameter über Namen zuweisen<br />

• Name des Parameters als l<strong>in</strong>ke Seite<br />

e<strong>in</strong>er Zuweisung im Aufruf<br />

• Reihenfolge der Parameter beliebig<br />

• Für alle Argumente außer den<br />

Schlüsselwortparametern Vorgabe<br />

• Parameter ohne Vorgabewert müssen<br />

als Positions- oder Schlüsselwortparameter<br />

übergeben werden<br />

1 def suche(seq, ele, start=0, ende=None):<br />

2 if ende is None:<br />

3 ende = len(seq)<br />

4 for pos <strong>in</strong> range(start, ende):<br />

5 if seq[pos] == ele:<br />

6 return pos<br />

1 >>> lis = [1, 2, 3, 4, 5, 6]<br />

2 >>> suche(lis, 2, start=0, ende=len(lis))<br />

3 1<br />

4 >>> suche(lis, 2, 0, len(lis))<br />

5 1<br />

6 >>> suche(lis, 2, ende=len(lis))<br />

7 1<br />

8 >>> suche(lis, 2, start=1, ende=len(lis))<br />

9 1<br />

10 >>> suche(lis, ende=len(lis), ele=2)<br />

11 1<br />

12 >>> suche(lis, 2, ende=1)<br />

13 >>><br />

Prof. Dr. Peter Barth (HS-Rhe<strong>in</strong>Ma<strong>in</strong>) Programmieren 3 29. Januar 2013 182 / 326<br />

Programmieren <strong>in</strong> Python<br />

Funktionen<br />

Programmieren <strong>in</strong> Python<br />

Funktionen<br />

Argumente sammeln mit * und **<br />

Weitere Positionsparameter *<br />

• E<strong>in</strong>e Variable am Ende kann mit e<strong>in</strong>em<br />

Stern * versehen werden<br />

• In dieser Variable werden dann alle<br />

weiteren Positionsparameter<br />

gesammelt als Tupel gesammelt<br />

• Realisiert beliebig viele Parameter, wie<br />

zum Beispiel pr<strong>in</strong>t<br />

Weitere Schlüsselwortparameter **<br />

• E<strong>in</strong>e Variable ganz am Ende kann mit<br />

zwei Sternen ** versehen werden<br />

11 SyntaxError: non-keyword arg after<br />

• Dar<strong>in</strong> werden alle weiteren<br />

12 keyword arg<br />

Schlüsselwortparameter als Dictionary<br />

gesammelt<br />

• Die Schlüssel s<strong>in</strong>d die<br />

Variablennamen als Str<strong>in</strong>gs<br />

1 def params(x, y, *pos, **key):<br />

2 pr<strong>in</strong>t x, y, pos, key<br />

1 >>> params(1, 2)<br />

2 1 2 () {}<br />

3 >>> params(1, 2, 3, 4, 5)<br />

4 1 2 (3, 4, 5) {}<br />

5 >>> params(1, 2, 3, 4, drei=3, vier=4)<br />

6 1 2 (3, 4) {’drei’: 3, ’vier’: 4}<br />

7 >>> params(1, 2, 3, 4, vier=4, fuenf=5)<br />

8 1 2 (3, 4) {’fuenf’: 5, ’vier’: 4}<br />

9 >>> params(1, 2, 3, fuenf=5, 4, vier=4)<br />

10 File "", l<strong>in</strong>e 1<br />

Prof. Dr. Peter Barth (HS-Rhe<strong>in</strong>Ma<strong>in</strong>) Programmieren 3 29. Januar 2013 183 / 326<br />

Funktionen <strong>in</strong> Funktionen und die LEGB-Regel<br />

Funktionsdef<strong>in</strong>itionen während<br />

Funktionsausführung<br />

• S<strong>in</strong>d erlaubt und s<strong>in</strong>nvoll<br />

• Umfassen aktuellen Namensraum und<br />

halten ihn fest (Enclos<strong>in</strong>g)<br />

• Von <strong>in</strong>nen nach außen<br />

LEGB-Regel<br />

• LGB-Regel erweitert<br />

• Zwischen Lokal und Global<br />

• Man sucht im umschließenden<br />

Namensraum, <strong>in</strong> dem die Funktion<br />

def<strong>in</strong>iert wurde<br />

• Dies ist entweder der globale<br />

Namensraum oder e<strong>in</strong> anderer<br />

Funktionsaufruf als Namensraum<br />

g 1 2 3<br />

e 6 5 3<br />

l 4 5 3<br />

e<strong>in</strong>geBaut<br />

1 x, y, z = 1, 2, 3<br />

2 def f():<br />

3 x, y = 4, 5<br />

4 def g():<br />

5 x = 6<br />

Global<br />

E<strong>in</strong>gekapselt<br />

Lokal<br />

6 pr<strong>in</strong>t "e", x, y, z # 6, 5, 3<br />

7 g()<br />

8 pr<strong>in</strong>t "l", x, y, z # 4, 5, 3<br />

9 pr<strong>in</strong>t "g", x, y, z # 1, 2, 3<br />

10 f()<br />

Prof. Dr. Peter Barth (HS-Rhe<strong>in</strong>Ma<strong>in</strong>) Programmieren 3 29. Januar 2013 184 / 326

Hurra! Ihre Datei wurde hochgeladen und ist bereit für die Veröffentlichung.

Erfolgreich gespeichert!

Leider ist etwas schief gelaufen!