~~NOTOC~~ ====== Funktionen ====== ... oder Miniprogramme oder: Wie man grössere Programme übersichtlich gestaltet. ===== Erklärungen ===== def begruessung(): print("Hallo!") print("Ich bin eine Funktion.") def saluto(s): print("Buongiorno " + s + "!") def salutation(name, sprache): if sprache == 1: print("Bonjour " + name + " !") else: print("Buongiorno " + name + "!") begruessung() saluto("Pinocchio") saluto("Papagena") salutation("Pinocchio", 2) salutation("Jacques", 1) Zur Terminologie: * Die Variable ''s'' in der Definition der Funktion ''saluto'' ist ein sogenannter **Parameter**. * Beim Aufruf ''saluto("Pinocchio")'' dieser Funktion ist der String ''"Pinocchio"'' das **Argument** (der übergebene Wert). Wiederholung: Dreieck zeichnen. Will nun 5 Dreiecke an verschiedenen Positionen (und Starwinkeln) auf Bildschirm zeichnen. Schülerin hatte Idee, einen Befehl ''dreieck'' zu bauen. Dies am Computer programmiert (mit ''setposition''). Frage nach ''penup'', ''pendown'' kam auf. Dann Befehl ''stift(farbe, dicke)'' programmiert (so habe gleich Parameter bzw. Argumente im Aufruf). ==== Aufgabe 1: Funktionen (mit Turtlegrafik) ==== Erinnerung zur Turtle-Grafik: Das Grundgerüst eines Turtle-Programms sieht wie folgt aus. from turtle import * % Hier Programmcode % einfügen. exitonclick() Öffne ein neues Python-Programm. * Schreibe eine Funktion ''dreieck''. Wenn man diese Funktion aufruft, soll die Turtle ein gleichseitiges Dreieck der Seitenlänge 100 zeichnen. * Teste deine Funktion, indem du die Funktion aufrufst. Hinweis: Klammern nicht vergessen beim Aufruf! * Schreibe eine Funktion ''triangolo'' mit einem Parameter ''a''. Wenn man diese Funktion aufruft, soll die Turtle ein gleichseitiges Dreieck der Seitenlänge ''a'' zeichnen. * Teste mit einem Funktionsaufruf, ob die Funktion ''triangolo'' das Gewünschte tut. * Schreibe eine Funktion ''vieleck'' mit **zwei** Parameter ''a'' und ''n''. Wenn man diese Funktion aufruft, soll die Turtle ein reguläres $n$-Eck der Seitenlänge ''a'' zeichnen. * Teste, ob die Funktion ''vieleck'' das Gewünschte tut. * Rufe nun deine drei Funktionen mehrfach hintereinander auf, eventuell mit Wechsel der Stiftdicke (z. B. ''pensize(10)'') oder Wechsel der Zeichenfarbe (z. B. ''pencolor("blue")''). * Bonus: Du kannst auch eine while-Schleife verwenden, um beispielsweise mehrere ineinanderliegende 6-Ecke verschiedener Grössen zu zeichnen. ===== Funktionen mit Rückgabewert (= return value) ===== ===== Erklärungen ===== Mit dem Schlüsselwort ''return'' erreicht man, dass eine Funktion einen Wert retourniert. Beachte: Sobald in der Definition einer Funktion ein Return-Befehl erreicht wird, wird die Ausführung der Funktion beendet. def wurzel(n): return n ** 0.5 def betrag(x): if x >= 0: return x else: return -x def ist_durch_drei_teilbar(n): return n % 3 == 0 def arithmetisches_mittel(a, b): return (a + b) / 2 print(wurzel(2)) print(wurzel(3)) print(betrag(3)) print(betrag(-5)) print(ist_durch_drei_teilbar(111)) print(ist_durch_drei_teilbar(112)) print(arithmetisches_mittel(10, 100)) ===== Aufgabe 2: Funktionen mit Rückgabewert selbst schreiben ===== Öffne ein neues Python-Programm (Name etwa ''aufgabe-funktionen-mit-rueckgabewert.py''). * Schreibe eine Funktion ''zwei_hoch'', die 2 in die gewünschte Potenz erhebt. Z. B. soll der Funktionsaufruf ''zwei_hoch(10)'' die Zahl $2^{10}=1024$ liefern. * Teste deine Funktion, etwa per ''print(zwei_hoch(10))''. Bonus: Gib mit einer Schleife die ersten 10 Zweierpotenzen $2^0, 2^1, \dots, 2^{10}$ aus. * Schreibe eine weitere Funktion ''geometrisches_mittel'', die das geometrische Mittel $\sqrt{a \cdot b}$ zweier nicht-negativer Zahlen berechnet. Z. B. soll der Funktionsaufruf ''geometrisches_mittel(4, 9)'' die Zahl $6$ liefern. * Teste deine Funktion. * Schreibe eine weitere Funktion ''minimum'', die das Minimum (= die kleinere) zweier Zahlen berechnet. Z. B. soll der Funktionsaufruf ''minimum(-3, -5)'' die Zahl $-5$ liefern. * Teste deine Funktion. ===== Aufgabe 3: Programm-Leseverständnis ===== Lies die Definition der Funktion ''was_berechnet_diese Funktion'' und finde (möglichst ohne Computereinsatz) heraus, was sie berechnet! Einnerung: ''//'' und ''%'' berechnen Wert (= Ganzzahlquotient) und Rest der ganzzahligen Division. def was_berechnet_diese_funktion(n): s = 0 while n > 0: s = s + n % 10 n = n // 10 return s ====== Bonus-Aufgaben ====== Wer mehr Lust auf Primzahlen als auf Turtle-Grafik hat, bearbeite zuerst Aufgabe 5. ===== Aufgabe 4: Tastaturgesteuerte Turtle - eine Art Zeichenprogramm ===== Lass das folgende Programm laufen und steuere die Turtle mit den vier Pfeiltasten und den Tasten "p" und "q". Die Turtle sagt dir, dann, was du zu tun hast! Bonus: Erweitere das Programm selbständig: Etwa Farbwechsel, Ändern der Liniendicke, Anheben des Zeichenstifts etc. bei entsprechenden Tastendrücken. from turtle import * title("Turtle-Zeichenprogamm: Verwende die Pfeiltasten, p, q und Escape") showturtle() def vorwaerts(): forward(50) def links(): left(60) def rechts(): write('Bitte Code ändern, so dass die Turtle um 60 Grad nach rechts abbiegt.') def rueckwaerts(): backward(50) def quadrat(): write('Bitte Code ändern, so dass ein Quadrat gezeichnet wird.') def polygon(): n = int(textinput("Polygon", "Anzahl der Ecken: ")) a = int(textinput("Polygon", "Länge der Seiten: ")) write('Bitte Code ändern, so dass ein regelmässiges n-Eck der Seitenlänge a gezeichnet wird.') # Nach den textinput-Befehlen muss man den "listener" wieder aktivieren. listen() onkey(vorwaerts, "Up") # Drücken der Nach-oben-Pfeiltaste führt # zum Aufruf der Funktion "vorwaerts". # (Sobald das Programm im "listen"-Modus ist.) onkey(links, "Left") onkey(rechts, "Right") onkey(rueckwaerts, "Down") onkey(quadrat, "q") onkey(polygon, "p") onkey(exit, "Escape") listen() # Aktiviert den listener-Modus: # Tastendrücke führen zum Ausführen # der entsprechenden Funktion. mainloop() # eine Art Endlosschleife, die auf Tastatureingaben wartet. ===== Aufgabe 5: Primzahlen erkennen und Primzahlliste ausgeben ===== (wie immer: neues Python-Programm öffnen) * Schreibe eine Funktion ''ist_prim'' mit einem Parameter ''n'', die ''True'' oder ''False'' liefert abhängig davon, ob das Argument eine Primzahl ist. Z. B. soll ''ist_prim(5)'' den Wert ''True'' liefern. * Teste deine Funktion mit **allen** Zahlen zwischen 1 und 10. (Beachte: 1 ist keine Primzahl). * Nutze diese Funktion, um eine Liste aller Primzahlen bis 1000 auszugeben. Falls du die Primzahlen nebeneinander (statt untereinander) ausgeben möchtest: Verwende print(..., end=", ") Dies sorgt dafür, dass nach der Ausgabe ein Kommazeichen und ein Leerzeichen folgt und **nicht** in eine neue Zeile gewechselt wird. ==== Lösungsvorschlag ==== from turtle import * def dreieck(): i = 0 while i < 3: forward(100) left(120) i = i + 1 def triangolo(a): i = 0 while i < 3: forward(a) left(120) i = i + 1 def vieleck(a, n): i = 0 while i < n: forward(a) left(360/n) i = i + 1 dreieck() triangolo(123) triangolo(200) vieleck(77, 5) vieleck(27, 11) exitonclick() ===== W3Schools-Material zu Funktionen ===== Erklärungen: https://www.w3schools.com/python/python_functions.asp. Übungen dazu: https://www.w3schools.com/python/exercise.asp?filename=exercise_functions1 ===== Link zur Kursseite ===== [[lehrkraefte:snr:informatik:glf23|Zur Kursseite]]