Differences
This shows you the differences between two versions of the page.
| Both sides previous revision Previous revision Next revision | Previous revision | ||
| lehrkraefte:snr:informatik:python:funktionen [2021/11/02 17:49] – [Funktionen] Olaf Schnürer | lehrkraefte:snr:informatik:python:funktionen [2021/11/04 17:09] (current) – [Funktionen] Olaf Schnürer | ||
|---|---|---|---|
| Line 1: | Line 1: | ||
| + | ====== Funktionen ====== | ||
| + | |||
| + | <WRAP round info> | ||
| + | Mit dem Schlüsselwort '' | ||
| + | Wie man an den Beispielen unten sieht, ist die Syntax ähnlich wie bei Schleifen ('' | ||
| + | Ein Doppelpunkt ist in der " | ||
| + | |||
| + | Funktionen nehmen einen oder mehrere oder auch gar keinen Wert als Input (man spricht auch von den Parametern der Funktion). Als Wert sind integer, string, Boolean etc. erlaubt. | ||
| + | Funktionen können (müssen aber nicht) mit Hilfe des Schlüsselworts '' | ||
| + | |||
| + | Funktionen haben einerseits den Zweck, sonst mehrfach auftauchenden Code zu bündeln; andererseits dienen sie der besseren Struktur/ | ||
| + | </ | ||
| + | |||
| + | |||
| + | <WRAP round todo> | ||
| + | Verstehe die folgenden Programme. | ||
| + | <code python> | ||
| + | # Funktion mit einem Parameter | ||
| + | def quadrat(x): | ||
| + | return x*x | ||
| + | |||
| + | print(quadrat(12)) | ||
| + | </ | ||
| + | |||
| + | < | ||
| + | # Dieses Beispiel zeigt, dass Funktion recht flexibel sind, was Parameter angeht: | ||
| + | # Hier kann der Übergabeparameter sowohl eine Zahl als auch ein String sein. | ||
| + | # (Viele andere Programmiersprachen sind weniger flexibel.) | ||
| + | def quadrat(x): | ||
| + | return 3*x | ||
| + | |||
| + | print(quadrat(14)) | ||
| + | print(quadrat(" | ||
| + | |||
| + | </ | ||
| + | |||
| + | <code python> | ||
| + | # Funktion mit zwei Parametern | ||
| + | def addiere(x, | ||
| + | return x + y | ||
| + | |||
| + | print(addiere(2, | ||
| + | </ | ||
| + | |||
| + | |||
| + | <code python> | ||
| + | # Funktion ohne Parameter | ||
| + | def gib_text_aus(): | ||
| + | print(" | ||
| + | |||
| + | gib_text_aus() | ||
| + | print(gib_text_aus()) | ||
| + | # Gibt eine Funktion wie hier keinen Wert mit " | ||
| + | </ | ||
| + | </ | ||
| + | |||
| + | <WRAP round todo> | ||
| + | Implementiere die [[https:// | ||
| + | </ | ||
| + | |||
| + | <WRAP round todo> | ||
| + | Du kannst einer Funktion auch eine Liste als Parameter übergeben. Schreibe ein Programm, das dies ausnutzt! - Etwa ein Programm, das den Durschnitt einer Liste von Zahlen ausrechnet. | ||
| + | </ | ||
| + | |||
| + | <WRAP round todo> | ||
| + | Jemand hat versucht, ein Programm zu schreiben, dass alle Primzahlen kleiner-gleich '' | ||
| + | Verbessere das Programm (es genügt, vier Zeichen (und eventuell Leerzeichen) zu ergänzen)! | ||
| + | |||
| + | Bemerkung: Sobald die '' | ||
| + | |||
| + | (Hierbei steht '' | ||
| + | |||
| + | <code python> | ||
| + | # Fehlerhaftes Programm! | ||
| + | n = 97 | ||
| + | |||
| + | def ist_prim(x): | ||
| + | for t in range(2, int(sqrt(x))): | ||
| + | if x % t == 0: | ||
| + | return False | ||
| + | return True | ||
| + | |||
| + | l = [] | ||
| + | for i in range(2, n): | ||
| + | if ist_prim(i): | ||
| + | l.append(i) | ||
| + | |||
| + | print(l) | ||
| + | </ | ||
| + | </ | ||
| + | |||
| + | <WRAP round todo> | ||
| + | Funktionen können sich selbst aufrufen! Dies ist oftmals sehr hilfreich (siehe Abschnitt [[lehrkraefte: | ||
| + | |||
| + | Ändere das folgende Programm so, dass es nach endlicher Zeit endet! | ||
| + | |||
| + | Abbruch mit dem roten Achteck in der Menüleiste von Tigerjython. | ||
| + | <code python> | ||
| + | # Nicht endendes Programm (es sei denn, der Strom fällt aus oder der Computer verrottet oder | ||
| + | # - was in Wirklichkeit eintritt - es gibt einen Laufzeitfehler, | ||
| + | def schreibe(n): | ||
| + | print(n * " | ||
| + | schreibe(n+1) | ||
| + | print(n * " | ||
| + | |||
| + | schreibe(1) | ||
| + | print(" | ||
| + | </ | ||
| + | |||
| + | <hidden Hinweis ausklappbar> | ||
| + | Ersetze die Zeile '' | ||
| + | <code python> | ||
| + | if n < 10: | ||
| + | schreibe(n+1) | ||
| + | </ | ||
| + | </ | ||
| + | </ | ||
| + | |||
| + | <WRAP round todo> | ||
| + | ACHTUNG, ICH HATTE LEIDER ZUNÄCHST DAS AUSRUFEZEICHEN IN DER ZWEITEN ZEILE VERGESSEN! | ||
| + | |||
| + | Versuche die folgende Definition der Fakultätsfunktion | ||
| + | |||
| + | {{: | ||
| + | |||
| + | in ein Programm zu übersetzen. | ||
| + | |||
| + | Wenn dir das gelingt, hast du " | ||
| + | |||
| + | Die obige Definition ist übrigens die sogenannte // | ||
| + | </ | ||
| + | |||
| + | |||
| + | |||
| + | ====== Globale und lokale Variablen ====== | ||
| + | |||
| + | <WRAP round todo> | ||
| + | Überrascht dich die Ausgabe des folgenden Programms? | ||
| + | <code python> | ||
| + | def test(): | ||
| + | s = " | ||
| + | print(s) | ||
| + | | ||
| + | s = " | ||
| + | test() | ||
| + | print(s) | ||
| + | </ | ||
| + | </ | ||
| + | |||
| + | <WRAP round info> | ||
| + | Variablen haben Sichtbarkeitsbereiche (englisch //scope//). | ||
| + | Bevor wir Funktionen kennengelernt hatten, war dies unwichtig: Alle Variablen waren sogenannte //globale// Variablen. | ||
| + | |||
| + | Im obigen Beispiel gibt es einerseits die globale Variable '' | ||
| + | Innerhalb der Funktion ist nur die lokale Variable '' | ||
| + | </ | ||
| + | |||
| + | <WRAP round todo> | ||
| + | * Lösche im obigen Programm den Befehl '' | ||
| + | * Füge diesen Befehl dann in der Funktion HINTER '' | ||
| + | </ | ||
| + | |||
| + | <WRAP round info> | ||
| + | Wir lernen daraus: Solange es keine lokale Variable gleichen Namens gibt, ist eine globale Variable wie '' | ||
| + | |||
| + | Manchmal ist es jedoch sinnvoll, eine globale Variable auch innerhalb von Funktionen verändern zu können (wie es ja der Name global eigentlich nahelegt)((in vielen Programmiersprachen ist dies standardmässig möglich)). Dies geschieht, indem man am Funktionsbeginn mit dem Schlüsselwort '' | ||
| + | <code python> | ||
| + | def test(): | ||
| + | print(s) | ||
| + | global s | ||
| + | s = " | ||
| + | print(s) | ||
| + | | ||
| + | s = " | ||
| + | test() | ||
| + | print(s) | ||
| + | </ | ||
| + | In diesem Beispiel bedeutet der Befehl '' | ||
| + | </ | ||
| + | |||
| + | <WRAP round info> | ||
| + | Vermutlich ist es intuitiv klar, | ||
| + | der Vollständigkeit halber sei aber erwähnt, dass lokale Variablen ausserhalb ihres Sichtbarkeitsbereichst nicht zugänglich sind in dem Sinne, dass ihr Wert nicht abrufbar ist: | ||
| + | <code python> | ||
| + | def test(): | ||
| + | s = " | ||
| + | print(s) | ||
| + | | ||
| + | test() | ||
| + | if s == " | ||
| + | print(" | ||
| + | # s = " | ||
| + | # print(s) | ||
| + | </ | ||
| + | Wenn man hier aber die '' | ||
| + | </ | ||
| + | |||
| + | |||
| + | |||
| + | |||
| + | |||
| + | |||
| + | |||
| + | |||
| + | ===== Einige Lösungsvorschläge ===== | ||
| + | <hidden Fakultät> | ||
| + | <code python> | ||
| + | def fakultaet(x): | ||
| + | wert = 1 | ||
| + | for i in range(1, x + 1): | ||
| + | wert = wert * i | ||
| + | return(wert) | ||
| + | |||
| + | print(fakultaet(5)) | ||
| + | |||
| + | for k in range(10): | ||
| + | print(" | ||
| + | </ | ||
| + | </ | ||
| + | |||
| + | |||
| + | |||
| + | ===== Link zur Kursseite ===== | ||
| + | |||
| + | [[lehrkraefte: | ||