Es sei die Funktion mit dem Kopf def foo(bar):
? Was ist hier <ins>kein</ins> korrekter Funktionsaufruf?
Funktionen
MERKE
Eine Funktion ist im Prinzip nicht anderes als âmehrere Einzelanweisungen, die du zu einem eigenen Befehl zusammenfasstâ. Den Befehl kannst du dann immer wieder verwenden. Eine Funktion hat folgende Form:def funktionsname(parameter): befehle return ergebnis
Beachte:
- Es gehöhrt nur der eingerĂŒckte Block zur Funktion.
- Die Funktion erhÀlt als Eingabe einen Parameter. Mit dem kannst du innerhalb der Funktion arbeiten wie mit jeder anderen Variable auch.
- Mit dem Wort return wird definiert, welches Ergebnis die Funktion âausspuckenâ soll. Ein
return
beendet die Funktion.
MERKE
Eine Funktion wird erst ausgefĂŒhrt, wenn sie aufgerufen wird! Ein Funktionsaufruf hat die Formvariable = funktionsname(wert)
Dabei wird fĂŒr den Parameter ein konkreter Wert eingesetzt. Es wird also die Funktion auf einen bestimmten Wert angewandt.
Beispiel: a = f(5) Lies das so: âa ist f von 5â oder anders gesagt âSpeichere > in a den Wert, der bei f rauskommt, wenn man 5 einsetzt.â
Was ist der RĂŒckgabewert der unten gezeigten Funktion fĂŒr den Funktionsaufruf foo(False, 10)
?
def foo(a, b):
if a:
return b
return b + 5
Welchen Wert hat bar
nach ausfĂŒhren des unten stehenden Codeschnippsels?
def foo(var)
print("Hello " + var)
bar = foo("John")
Aufgabe 1
Versuch eine Funktion zu schreiben, die den Brennwert von Lebensmitteln von Kilo-Joule in Kilo-Kalorien umrechnet.
Gib dieser den Namen convert_kJ_to_kcal
.
Das VerhÀltnis von Kilo-Joule zu Kilo-Kalorien lautet wie folgt:
Aufgabe 2
Schreibe eine Funktion hours_to_mins
, die Stunden in Minuten umrechnet.
Rufe die Funktion dann zwei, drei mal mit verschiedenen Werten auf!
Dabei soll jeweils so was ausgegeben werden wie z.B. â22 Stunden haben 1320 Minutenâ.
Aufgabe 3
Lust auf eine Runde Billard?
Schreibe eine Funktion ballnumber_to_color
, die die Nummer einer
Billardkugel ĂŒbergeben bekommt und dann die Farbe der Kugel (siehe Bild
unten) zurĂŒckgibt. Wir beschrĂ€nken uns jetzt mal auf die Kugeln 1-3.
Tipp: Du brauchst ein if-Statement und mehrere return-Statements.
Teste deine Funktion mit den Aufrufen
print("Die Farbe von Kugel 1 ist " + ballnumber_to_color(1))
print("Die Farbe von Kugel 2 ist " + ballnumber_to_color(2))
print("Die Farbe von Kugel 3 ist " + ballnumber_to_color(3))
Funktionen mit mehreren Parametern
MERKE
Eine Funktion kann auch mehr als einen Eingabewert haben. Man kann daher fĂŒr eine Funktion beliebig viele Parameter > definieren, einfach so:def funktionsname(parameter1, parameter2): ...
Achtung:
- Es muss dann bei jedem Funktionsaufruf fĂŒr jeden Parameter ein Wert ĂŒbergeben werden.
- Der erste Wert wird fĂŒr den ersten Parameter eingesetzt, der zweite fĂŒr den zweiten usw.
- Werte fĂŒr verschiedene Parameter können unterschiedliche Datentypen haben.
Beispiel:
a = f(5, 42)
Lies das so: âa ist f von 5 und 42â oder anders gesagt âSpeichere in a den Wert, der bei f rauskommt, wenn man 5 fĂŒr den ersten Parameter und 42 fĂŒr den zweiten Parameter einsetzt.â
Aufgabe 4
FĂŒge der Funktion convertkJ_to_kcal einen Parametershould_round
hinzu, der entweder True
oder False
sein kann und angibt, ob das Ergebnis
gerundet werden soll.
Der Code innerhalb der Funktion ist schon angepasst. Du musst nur den _Kopf der Funktion, also ihre erste Zeile und den Funktionsaufruf ergÀnzen.
Tipp: Eine Zahl runden kannst du mit der Funktion round(zu_rundende_zahl)
.
Ăbung: Maximum Skills
Aufgabe 5
Im letzten Kapitel hast du schon die vordefinierte Funktion max
kennengelernt, die das Maximum von zwei Zahlen bestimmt,
zum Beipsiel a = max(3,4)
.
Schreibe jetzt eine eigene Funktion my_max, die genau das gleiche tut. So
etwas Ăhnliches hast du schon im vorherigen Kapitel gemacht, diesmal
geben wir allerdings keine Hinweistexte mehr aus. Die Funktion soll
einfach eine Zahl zurĂŒckgeben.
Teste die Funktion, indem du sie mit den Werten 1, 10, 10, 1 und 5, 5
aufrufst.
Ăbung: Maximum Skills mit input
Aufgabe 6 \
Ăndere deine Code von gerade eben so, dass die Funktion nur einmal aufgerufen wird und bei diesem Funktionsaufruf keine festen Werte verwendet, sondern die zwei Zahlen mittels input() ĂŒber das Terminal eingegeben werden. Achte auf die Datentypen!
Funktionen ohne Parameter und return
MERKE
Nicht jede Funktion liefert zwangslÀufig ein Ergebnis. Manche zeigen z.B. auch nur Dinge am Bildschirm an und berechnen nichts. Entsprechend gibt es auch Funktionen ohne return-Statement.Beispiel:
def greet(name): print("Halli hallo, " + name)
WĂŒrde man nun trotzdem versuchen, das Ergebnis dieser Funktion
weiterzuverarbeiten, erhielte man ⊠nichts, oder in Python ausgedrĂŒckt:
None
Entsprechend macht so etwas wie ergebnis = greet("Laura")
hier keinen
Sinn. Die Funktion liefert ja kein Ergebnis!
MERKE
Es braucht auch nicht jede Funktion eine Eingabe. Manche kommen ohne Parameter aus. Die Klammern hinter dem Funktionsnamen bleiben dann sowohl bei der Definition der Funktion als auch bei Aufrufen einfach leer.Beispiel
def greet_all(): print("Hallo, Anna") print("Hallo, Ben") print("Hallo, Caro") print("Hallo, David")
Vielleicht fragst du dich, wofĂŒr so eine Funktion ohne Ein- und RĂŒckgabewert gut sein soll. SchlieĂlich hĂ€tte man die Befehle oben auch einfach âganz normalâ ins Programm schreiben können.
Der groĂe Vorteil davon: Man spart Code! Anstatt die einzelnen Befehle immer wieder zu schreiben, kann man als âAbkĂŒrzungâ einfach die Funktion aufrufen. AuĂerdem kann man ein Programm ĂŒbersichtlich aufteilen. (Modularisierung)
Aufgabe 7
So, jetzt aber zu deiner Aufgabe:
Schreibe eine Funktion get_movies
ohne Parameter und RĂŒckgabewert, die
einfach nur 4-5 Namen von Kinofilmen (Nimm einfach die, die dir gerade
einfallen.) jeweils mit einem print-Statement anzeigt.
Lokale vs. Globale Variablen
MERKE Eine Funktion ist eine geschlossen Einheit (Blackbox) mit Eingabe (Parameter) und RĂŒckgabewert (return-Wert). In diese kann man âvon auĂenâ, d.h. mit Befehlen auĂerhalb der Funktion nicht hineinschauen. Insbesondere kann man nicht auf Werte von Parametern oder Variablen, die innerhalb der Funktion angelegt werden, zugreifen:.
def funktion(parameter): ... funktion(âŠ) print(parameter) # das hier geht nicht! Kein Zugriff von auĂen auf Parameter!
Die Variablen/Parameter innerhalb der Funktion gibt es also nur an einem bestimmten Ort (nÀmlich in der Funktion.) Man spricht daher von Lokalen Variablen.
MERKE
Anders herum funktioniert das aber schon: Eine Funktion kann âaus sich herausâ in das âĂ€uĂereâ Programm schauen und Variablen sowie andere Funktionen von dort benutzen:spam = "Katze" def funktion(): print(spam) # hier innen kann man auf spam auĂen zugreifen funktion(âŠ) print(spam) # und hier sowieso
Man spricht von Globalen Variablen
Aufgabe 8
VerÀndere den Code so, dass greeting keine globale Variable mehr ist,
sondern ein weiterer Parameter (und damit eine lokale Variable) der
Funktion greet.
Denk dabei dran: Erst beim Funktionsaufruf werden fĂŒr alle Parameter
(âPlatzhalterâ) konkrete Werte ĂŒbergeben.
greeting = "Hello "
def greet(name):
print(greeting + name)
greet("Hans")
Textbasiertes Spiel
Du machst das richtig gut! Mal sehen, ob in dir ein kleiner Nerd stecktâŠ
Es ist Zeit fĂŒr ein gröĂeres Projekt:
Textadventures
Textadventure ist ein Genre von Computerspielen, das seit den 70ern populĂ€r ist. In einem Textadventure sieht der Spieler eine Textbeschreibung der Spielwelt und seiner aktuellen Situation und benutzt dann Texteingaben, um Aktionen durchzufĂŒhren, RĂ€tsel zu lösen und im Spiel zu ĂŒberleben.
Start und Ziel des Spiels
Implementiere ein Textadventure fĂŒr folgendes Szenario: Der Spieler startet in einem dunklen Wald und soll die Prinzessin aus den Klauen eines Drachen retten, der sie in einer Burg festhĂ€lt. Dazu braucht der Spieler das Schwert Excalibur (Das bekommt man von der Herrin am See.) und eine RĂŒstung. Es gibt also drei verschiedene SchauplĂ€tze. Welche Aktionen der Spieler am jeweiligen Ort zur Auswahl hat, hĂ€ngt von der aktuellen Situation ab und davon, ob er das Schwert Excalibur bei sich hat oder nicht.
Spielweise
In Textadventures navigiert man mit dem gehe Befehl. Zum Beispiel:
gehe osten
Man kann auch mit GegenstÀnden interagieren: Um beispielsweise den Drachen zu töten, tippt man:
toete drachen
Solche âBefehleâ, die der Nutzer dann zur VerfĂŒgung hat, legst natĂŒrlich du bei Entwicklung des Spiels im Programmcode selbst fest.
Beispiel:
Du bist in einem dunklen Wald. Ein Weg fĂŒhrt nach Westen und
Osten.
> gehe osten
Du stehst vor einer mÀchtigen Burg. Aus einem Fenster im
höchsten Turm der Burg winkt eine Prinzessin verzweifelt zu dir.
Ein Drache bewacht den Eingang der Burg.
> toete drache
Ohne Schwert hast du keine Chance gegen den Drachen. Er frisst
Dich auf, und Du bist tot.
Aufgabe 9
Implementiere eine Funktion fĂŒr jeden Ort des Spiels (Wald, Burg, See). Um
den Spieler an einen Ort âgehenâ zu lassen, wird dann einfach die
entsprechende Funktion aufgerufen.
Jede âOrtsfunktionâ soll
- den Parameter
has_sword bekommen
, der anzeigt, ob der Nutzer beim erreichen des Ortes ein Schwert dabei hat. - eine Beschreibung des Orts ausgeben.
- eine Aktion basierend auf der Eingabe des Spielers durchfĂŒhren. Z.B.
if command == "gehe osten": castle(...)
- wenn der Benutzer einen ungĂŒltigen Befehl eingibt mit Das verstehe ich nicht. antworten.
Wie wechsle ich den Ort?
Indem innerhalb der bisherigen Funktion die Funktion des nÀchsten Ortes aufgerufen wird.
Z.B. innerhalb der Funktion forest
wird castle
aufgerufen
Wie erhÀlt/verliert der Nutzer das Schwert?
Indem beim nĂ€chsten Ortswechsel ein anderer Wert fĂŒr has_sword
ĂŒbergeben wird:
- Variante: Nutzer verliert das Schwert am aktuellen Ort. Dann nÀchster Ortswechsel z.B. castle(False)
- Variante: Nutzer bekommt das Schwert am aktuellen Ort. Dann nÀchster Ortswechsel z.B.
castle(True)
- Variante: Es passiert nichts mit dem Schwert am aktuellen Ort. Dann nÀchster Ortswechsel z.B.
castle(has_sword)
D.h. die Variable wird unverÀndert weitergegeben.
Wie binde ich das Schwert ins Spiel ein?
Du kannst mit if
prĂŒfen, ob der Nutzer gerade ein Schwert hat. Der Rest ist deiner KreativitĂ€t ĂŒberlassen. Beispiel: Trifft die Figur ohne Schwert auf den Drachen, dann stirbt sie und das Spiel ist aus.
Zusatzaufgabe
Aufgabe 10
Du bist schon fertig? Dann ĂŒberleg dir noch ein paar zusĂ€tzliche Features fĂŒr dein Textadventure.
Vorschlage 1: Beispielsweise kannst du dem Spieler eine Art SpielmenĂŒ anbieten, wenn er das Spiel starten, in dem er den Schwierigkeitsgrad des Spiels auswĂ€hlen kann.
Vorschlag 2: Du kannst dem Spieler auch noch einen Prompt bauen in dem er in jedem Schritt auswÀhlen kann was er als nÀchstes machen könnte:
Designvorschlag
Was möchtest du als nÀchstes tun?
[1] nach Osten gehen
[2] nach Westen gehe
[3] Schwert aufgeben
>
Der Spieler kann dann direkt hinter dem > die Zahl der aktion eingeben.