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:glf22:python:funktionen [2022/11/17 19:23] – [Weitere Bemerkungen zu Funktionen (einiges wurde bereits in den Videos erklärt)] Olaf Schnürer | lehrkraefte:snr:informatik:glf22:python:funktionen [2022/11/29 11:10] (current) – [Bonus-Aufgabe: Funktionen zum Zeichnen einer Spirale und zum "unsichtbaren" Bewegen der Turtle] Olaf Schnürer | ||
|---|---|---|---|
| Line 1: | Line 1: | ||
| + | ~~NOTOC~~ | ||
| + | |||
| + | ====== Funktionen ====== | ||
| + | |||
| + | ... oder: Wie man grössere Programme übersichtlich gestaltet. | ||
| + | |||
| + | <WRAP center round info> | ||
| + | (teilweise Vorschau auf die Videos) | ||
| + | |||
| + | Das Aufteilen eines grösseren Vorhabens in Teilvorhaben, | ||
| + | |||
| + | Beispiel: Beim Bau eines Hauses übernehmen verschiedene Handwerker als Spezialisten diverse Aufgaben. | ||
| + | |||
| + | In der Informatik wird dies oft durch **Funktionen** bewerkstelligt. Funktionen sind " | ||
| + | |||
| + | Wir haben schon viele Funktionen kennengelernt und verwendet, z. B. '' | ||
| + | |||
| + | Funktionen werden aufgerufen (**Funktionsaufruf**), | ||
| + | |||
| + | **Die runden Klammern sind beim Funktionsaufreu stets hinzuschreiben, | ||
| + | |||
| + | Beispiele: | ||
| + | * '' | ||
| + | * '' | ||
| + | |||
| + | Funktionen haben einerseits den Zweck, sonst mehrfach auftauchenden Code zu bündeln; andererseits erlauben sie es, Programme sinnvoll zu strukturieren und so lesbarer zu machen (vgl. die Videos). | ||
| + | </ | ||
| + | |||
| + | Nun wirst du lernen, wie du selbst Funktionen definieren kannst! | ||
| + | ===== Funktionen ohne Rückgabewert definieren (teils mit Turtle-Grafik) ===== | ||
| + | |||
| + | <WRAP center round todo> | ||
| + | Schau dir das folgende Video zu Funktionen an und löse die darin enthaltenen drei Aufgaben! | ||
| + | |||
| + | [[https:// | ||
| + | |||
| + | ---- | ||
| + | |||
| + | Endzustand der Programme aus dem Video (mit kleinen sprachlichen Verbesserungen): | ||
| + | |||
| + | <hidden Programm mit Funktionen zur Begrüssung> | ||
| + | <code python funktionen-begruessung.py> | ||
| + | def begruessung(): | ||
| + | print(" | ||
| + | print(" | ||
| + | |||
| + | def saluto(s): | ||
| + | print(" | ||
| + | |||
| + | def salutation(name, | ||
| + | if sprache == 1: | ||
| + | print(" | ||
| + | else: | ||
| + | print(" | ||
| + | |||
| + | begruessung() | ||
| + | |||
| + | saluto(" | ||
| + | saluto(" | ||
| + | |||
| + | salutation(" | ||
| + | salutation(" | ||
| + | </ | ||
| + | </ | ||
| + | |||
| + | <hidden Programm mit Funktionen zum Zeichnen mit der Turtle> | ||
| + | <code python funktionen-turtle.py> | ||
| + | from turtle import * | ||
| + | |||
| + | def dreieck(): | ||
| + | for index in range(3): | ||
| + | forward(100) | ||
| + | left(120) | ||
| + | |||
| + | def triangolo(a): | ||
| + | for index in range(3): | ||
| + | forward(a) | ||
| + | left(120) | ||
| + | |||
| + | def vieleck(a, n): | ||
| + | for index in range(n): | ||
| + | forward(a) | ||
| + | left(360/n) | ||
| + | |||
| + | dreieck() | ||
| + | |||
| + | triangolo(123) | ||
| + | triangolo(200) | ||
| + | |||
| + | vieleck(77, 5) | ||
| + | vieleck(27, 11) | ||
| + | |||
| + | exitonclick() | ||
| + | </ | ||
| + | </ | ||
| + | </ | ||
| + | |||
| + | ===== Funktionen mit Rückgabewert definieren ===== | ||
| + | |||
| + | <WRAP center round todo> | ||
| + | Schau dir das folgende Video zu Funktionen an und löse die darin enthaltenen Aufgaben! | ||
| + | |||
| + | [[https:// | ||
| + | |||
| + | <hidden Endzustand des Programms aus dem Video> | ||
| + | <code python funktionen-mit-rueckgabewerten.py> | ||
| + | def f(x): | ||
| + | return x ** 2 + 42 * x - 7 | ||
| + | |||
| + | def zweihoch(n): | ||
| + | return 2 ** n | ||
| + | |||
| + | def ist_teiler_von(t, | ||
| + | return z % t == 0 | ||
| + | |||
| + | def hoch(basis, exponent): | ||
| + | return basis ** exponent | ||
| + | |||
| + | def summe_zweierpotenzen(n): | ||
| + | summe = 0 | ||
| + | for index in range(n + 1): | ||
| + | summe = summe + zweihoch(index) | ||
| + | return summe | ||
| + | |||
| + | def summe_quadratzahlen(n): | ||
| + | summe = 0 | ||
| + | for index in range(n + 1): | ||
| + | summe = summe + index ** 2 | ||
| + | return summe | ||
| + | |||
| + | print(summe_quadratzahlen(5)) | ||
| + | print(summe_zweierpotenzen(4)) | ||
| + | print(hoch(3, | ||
| + | print(hoch(2, | ||
| + | print(ist_teiler_von(7, | ||
| + | print(ist_teiler_von(5, | ||
| + | print(ist_teiler_von(13, | ||
| + | print(f(2)) | ||
| + | print(f(11)) | ||
| + | print(zweihoch(10)) | ||
| + | print(zweihoch(8)) | ||
| + | </ | ||
| + | </ | ||
| + | </ | ||
| + | |||
| + | ===== Definition von Funktionen (wurde in den Videos bereits erklärt) ===== | ||
| + | |||
| + | <WRAP round info> | ||
| + | Eine Funktionsdefinition sieht in Python wie folgt aus: | ||
| + | <code python> | ||
| + | def <Name der Funktion> | ||
| + | # Hier steht, | ||
| + | # um vier Leerschläge eingerückt, | ||
| + | # was die Funktion tut. | ||
| + | # | ||
| + | # Falls ein Rückgabewert zurückgegeben werden soll: | ||
| + | return < | ||
| + | </ | ||
| + | |||
| + | In Worten: | ||
| + | * Die Funktionsdefinition wird mit einer Kopfzeile eingeleitet: | ||
| + | * Sie beginnt mit dem Schlüsselwort '' | ||
| + | * Danach kommt der Name der Funktion, der im Wesentlichen frei gewählt werden kann. | ||
| + | * Danach kommt ein Paar von Klammern, zwischen denen nichts steht oder ein Parameter (Name frei wählbar) oder mehrere durch Kommas getrennte Parameter. | ||
| + | * Danach kommt ein Doppelpunkt '':'' | ||
| + | * Nun folgt in den nächsten Zeilen **eingerückt** der eigentliche Code der Funktion ("body of the function" | ||
| + | * Optional, wenn ein Rückgabewert zurückgeliefert werden soll((so, wie man das erwartet, wenn man an den Funktionsbegriff in der Mathematik denkt)): Verwende das Schlüsselwort '' | ||
| + | |||
| + | Die Syntax ist also ähnlich wie bei '' | ||
| + | </ | ||
| + | |||
| + | ===== Aufgaben ===== | ||
| + | |||
| + | ==== Aufgabe: Liste der ersten Primzahlen; Funktion mit Rückgabewert ==== | ||
| + | |||
| + | <WRAP center round todo> | ||
| + | Öffne eine neues Python-Programm. | ||
| + | |||
| + | (1) Schreibe eine Funktion((Eigentlich heisst die Funktion nur '' | ||
| + | |||
| + | <hidden Hinweis> | ||
| + | Initialisiere am Anfang der Funktionsdefinition eine (Hilfs-)Variable '' | ||
| + | </ | ||
| + | |||
| + | ---- | ||
| + | |||
| + | (2) Nutze deine Funktion '' | ||
| + | |||
| + | Hinweis: Damit nicht jede Primzahl in einer neuen Zeile steht: Der Befehl '' | ||
| + | |||
| + | Bemerkung: Diese Methode, eine Liste von Primzahlen, ist nicht besonders effizient. Schneller geht es etwa mit dem Sieb des Eratosthenes. | ||
| + | </ | ||
| + | |||
| + | ==== Aufgabe: Mäander (Ornamentik); | ||
| + | |||
| + | <WRAP center round todo> | ||
| + | Ziel der Aufgabe ist, den kreisförmigen Mäander effizient zu zeichnen. | ||
| + | |||
| + | {{: | ||
| + | |||
| + | Da die rote Figur mehrfach vorkommt, ist es sinnvoll, diese Figur von einer Funktion zeichnen zu lassen. | ||
| + | |||
| + | * (1) Definiere eine Funktion '' | ||
| + | |||
| + | Hinweis: Die Bilder wurden mit '' | ||
| + | |||
| + | * (2) Verwende deine Funktion und eine for-Schleife, | ||
| + | |||
| + | {{: | ||
| + | |||
| + | * (3) Ändere dein Programm so, dass der obige kreisförmige Mäander entsteht, der aus '' | ||
| + | |||
| + | <hidden Bonusaufgaben (bitte ausklappen)> | ||
| + | Zeichne den folgenden rechteckigen Mänder mit Hilfe einer zusätzlichen Funktion '' | ||
| + | |||
| + | {{: | ||
| + | |||
| + | Zeichne ähnliche Muster! Zur Inspiration: | ||
| + | * [[https:// | ||
| + | * [[https:// | ||
| + | * [[https:// | ||
| + | </ | ||
| + | </ | ||
| + | |||
| + | ===== Direktes Positionieren der Turtle ===== | ||
| + | |||
| + | <WRAP center round info> | ||
| + | Die wichtigsten Zustandsparameter der Turtle sind ihre Position und ihre Blickrichtung (weniger wichtig sind Farbe und Stiftdicke etc.). | ||
| + | * Ihre Position wird durch $x$- und $y$-Koordinate angegeben. | ||
| + | * Ihre Blickrichtung wird durch einen Winkel in Grad angegeben: $0^\circ$: nach rechts; $90^\circ$: nach oben, $180^\circ$: | ||
| + | |||
| + | Das zugrunde liegende Koordinatensystem liegt zentriert im Standard-Turtle-Fenster: | ||
| + | * x-Koordinaten zwischen -473 und +473 und | ||
| + | * y-Koordinaten zwischen -398 und +398. ((jedenfalls auf meinem Laptop; wenn ich die Dokumentation richtig verstehe, nimmt das Standard-Turtle-Fenster 50 % der Bildschirmbreite und 75 % der Bildschirmhöhe ein)) | ||
| + | |||
| + | Man kann die Turtle direkt in einen gewissen Zustand versetzen: | ||
| + | * '' | ||
| + | * '' | ||
| + | * '' | ||
| + | </ | ||
| + | |||
| + | ===== W3Schools-Material zu Funktionen ===== | ||
| + | |||
| + | Alles vor dem roten Kasten sollte bekannt sein auf der Seite https:// | ||
| + | |||
| + | Exercises dazu (die ersten vier Fragen solltest du beantworten können): https:// | ||
| + | |||
| + | |||
| + | |||
| + | ===== Weitere Bemerkungen zu Funktionen (einiges wurde bereits in den Videos erklärt) ===== | ||
| + | |||
| + | <WRAP center round info> | ||
| + | Zum besseren Verständnis ist es sinnvoll, Funktionen in vier Arten einzuteilen, | ||
| + | * **Parameter** besitzen oder nicht (also **Argumente** beim Funktionsaufruf angegeben werden müssen oder nicht); | ||
| + | * einen **Rückgabewert** zurückgeben oder nicht. | ||
| + | |||
| + | In der folgenden Tabelle ist für jeder dieser vier Arten ein Beispiel angegeben und darunter ein Aufruf der Funktion. | ||
| + | <WRAP round box 60%> | ||
| + | |Funktionen ^ ohne Parameter ^ mit Parameter(n) ^ | ||
| + | ^ ohne Rückgabewert | '' | ||
| + | ^ | '' | ||
| + | ^ mit Rückgabewert | '' | ||
| + | ^ | '' | ||
| + | </ | ||
| + | </ | ||
| + | |||
| + | <WRAP center round important 100%> | ||
| + | Grob gesagt kann man Aufrufe und Definitionen von Funktionen daran erkennen, dass nach ihnen ein Paar runder Klammern (mit oder ohne Argumente bzw. Parameter dazwischen) auftaucht! | ||
| + | |||
| + | Beachte: Sogenannte **Schlüsselworte** wie '' | ||
| + | </ | ||
| + | |||
| + | <WRAP center round info> | ||
| + | Bisher nicht in diesem Kurs erklärt: | ||
| + | Variablen haben in Python **Geltungsbereiche**, | ||
| + | |||
| + | Dies erlaubt, denselben Variablennamen mehrfach zu verwenden (etwa eine Variable namens '' | ||
| + | |||
| + | Wenn man als Programmieranfänger auf Nummer sicher gehen will, verwende man jeden Variablennamen nur einmal. | ||
| + | </ | ||
| + | |||
| + | ===== Bonus-Aufgabe: | ||
| + | |||
| + | <WRAP center round todo> | ||
| + | {{: | ||
| + | |||
| + | Ergänze das folgende Programm um die Definition zweier Funktionen (um so das obige Bild zu zeichnen): | ||
| + | * Eine Funktion '' | ||
| + | * Eine Funktion '' | ||
| + | |||
| + | <code python vorlage-funktionen-spirale-und-bewege.py> | ||
| + | from turtle import * | ||
| + | |||
| + | def spirale(n, a, veraenderung, | ||
| + | # | ||
| + | # Ergänze hier den " | ||
| + | # also den Code, der eine Spirale abhängig | ||
| + | # von den obigen Parametern zeichnet. | ||
| + | # | ||
| + | |||
| + | # Ergänze hier die Definition der Funktion " | ||
| + | # Hinweis: Verwende die Funktion " | ||
| + | |||
| + | speed(0) | ||
| + | |||
| + | bewege_unsichtbar(200, | ||
| + | spirale(40, 10, 5, 90) | ||
| + | |||
| + | bewege_unsichtbar(-200, | ||
| + | spirale(30, 10, 5, 360/6) | ||
| + | |||
| + | bewege_unsichtbar(-200, | ||
| + | spirale(80, 1, 2, 61) | ||
| + | |||
| + | bewege_unsichtbar(200, | ||
| + | spirale(150, | ||
| + | |||
| + | exitonclick() | ||
| + | </ | ||
| + | |||
| + | <hidden Lösungsvorschlag> | ||
| + | <code python funktionen-spirale-und-bewege.py> | ||
| + | from turtle import * | ||
| + | |||
| + | def spirale(n, a, veraenderung, | ||
| + | for index in range(n): | ||
| + | forward(a + index * veraenderung) | ||
| + | left(winkel) | ||
| + | |||
| + | def bewege_unsichtbar(x, | ||
| + | penup() | ||
| + | setpos(x, y) | ||
| + | pendown() | ||
| + | |||
| + | speed(0) | ||
| + | |||
| + | bewege_unsichtbar(200, | ||
| + | spirale(40, 10, 5, 90) | ||
| + | |||
| + | bewege_unsichtbar(-200, | ||
| + | spirale(30, 10, 5, 360/6) | ||
| + | |||
| + | bewege_unsichtbar(-200, | ||
| + | spirale(80, 1, 2, 61) | ||
| + | |||
| + | bewege_unsichtbar(200, | ||
| + | spirale(150, | ||
| + | |||
| + | exitonclick() | ||
| + | </ | ||
| + | </ | ||
| + | </ | ||
| + | |||
| + | |||
| + | |||
| + | ===== Link zur Kursseite ===== | ||
| + | |||
| + | [[lehrkraefte: | ||
| + | |||