Zum Inhalt springen

Funktionen bzw. Methoden

Einführung

Funktionen kennst du aus der Mathematik. Man kann sagen: Es handelt sich dabei um Anweisungen, die für bestimmte Eingabewerte entsprechende Rückgabewerte haben1Dass diese Definition nicht standhält, werden wir noch feststellen, für unsere Zwecke reicht sie aber eine Weile ….

f(x) = x^2 beispielsweise gibt für jeden Eingabewert x das Quadrat von x als Rückgabewert zurück, also x^2.

# Beispiel
def addiere(a, b):  # nehme Zahlen a und b an
    return a + b  # gib Summe von a und b zurück

Good to know: Je nach Kontext nennt man Funktionen in der Programmierung auch Methoden. Meinem Empfinden nach geschieht das selten konsistent. Den Begriff Methoden nutzt man eher in der Objektorientierten Programmierung, beim prozeduralen Stil – den wir gerade verfolgen – spricht man von Funktionen. Daher bleiben wir also erst einmal bei dem Begriff “Funktion”.

Zurück zum eigentlichen Thema: Was passiert oben in dem Code? Überlege, recherchiere vorher oder rate:

Funktionen machen das Leben leichter!

Das tolle an Funktionen ist, dass man sie nur einmal anlegen muss und dann immer wieder nutzen kann. Das Beispiel oben ist einfach, vielleicht zu einfach, um eine Funktion dafür zu anlegen? Selbst das ist in mancher Hinsicht sinnvoll, bspw. bei Objektorientierter Programmierung, wenn du Methoden einer Klasse formulierst. Doch so weit müssen wir nicht gehen, das folgende Beispiel sollte ganz schnell deutlich machen, warum es sinnvoll ist:

#Fakultät als rekursive Funktion
def fak(n):
    if n>0:
        return n*fak(n-1)
    else:
        return 1
print(fak(5))

Diese Funktion berechnet die Fakultät einer Zahl, Beispiel: 5! = 5\cdot 4 \cdot 3 \cdot 2 \cdot 1 = 120 Du hast sicher keine Lust, so etwas jedesmal neu einzugeben. Ist die Funktion einmal sauber implementiert, kannst du sie immer wieder verwenden. Du musst einfach nur die Funktion mit einem passenden Parameter aufrufen.

#Berechnet die Summe aller Zahlen von 1 bis n
def sum(n):
    if n>0:
        return n+sum(n-1)
    else:
        return 0

#Berechnet die Summe aller Zahlen von 1 bis n mithilfe des “Kleinen Gauß”
def kl_gauss(n):
    return int((n*(n+1))/2)

#Probiere beide Varianten mal aus
print(sum(13))
print(sum(20))
print(kl_gauss(13))

Was oben nach mathematischer Spielerei aussieht, ist ein sehr mächtiges Konzept. Eine Funktion ist besonders dann hilfreich, wenn sie mithilfe von Parametern auf verschiedene Bedingungen reagieren können muss. Noch ein Beispiel:

def gruss(name):
    print("Hallo "+name+", schön dich zu sehen!")

Fällt dir etwas an dieser Funktion auf? Es fehlt der return-Befehl! Das bedeutet, dass diese Funktion keinen Wert zurückgibt, sondern nur einen print-Befehl ausgibt. In einfachen Fällen ist das kein Problem, doch in der Regel sollte eine Funktion immer einen Wert zurückgeben. Denn dann kannst du damit weiterarbeiten. Beispiel:

def gruss(name):
    return "Hallo "+name+", schön dich zu sehen!"

a = gruss("Soraya") #Der Variable wird der Wert, den gruss("Soraya") zurückgegeben hat, zugewiesen.

print("Der Computer hat sie mit '"+a+"' gegrüßt. Dabei hat er",len(a),"Zeichen genutzt.") #a wird genutzt

print("Der Computer hat sie mit '"+gruss("Soraya")+"' gegrüßt.") #der direkte Abruf ist auch möglich

Parameter und Argumente

Der Eingabewert für Funktionen heißt Parameter, bei Methoden nennt man sie auch Argumente. Die Begriffe werden aber oft synonym verwendet, also Funktionen = Methoden und Parameter = Argumente. Wir machen uns da erst mal keine Gedanken. Wichtig ist jedoch das Folgende.

Sei func() eine Funktion in Python, dann gilt:

  • func(param) hat den festen Parameter param, dieser muss eingegeben werden.
  • func(*opt) hat den optionalen Parameter opt, dieser kann eingegeben werden.
  • func(standard=”Mustermensch”) hat den Standardparameter standard. Die Funktion übernimmt den Standardwert, wenn nichts eingetragen wird.
  • func(**kwargs) benutzt man, wenn man nicht weiß, wie viele Argumente mitgegeben werden. Der Fall ist etwas komplizierter.

Übungen

Übung 1: Grundlagen im Quiz

Lies dich gut ein, recherchiere, probiere aus und beantworte anschließend die folgenden Fragen.

  1. Analysiere den Codeblock und beantworte anschließend die Fragen.
def steckbrief(name, alter, groesse, haarfarbe):
    return name+" ist "+str(alter)+" Jahre alt und "+str(groesse)+" cm groß. Seine Haarfarbe ist "+haarfarbe+"."

eren = steckbrief("Eren",15,165,"schwarz")
armin = steckbrief("Armin",14,150,"blond")

print(eren)
print(armin)

Übung 2: Funktionen abrufen

In dieser Übung verwenden wir ein Modul namens “turtle”. Dieses Modul ermöglicht uns, Vorgänge zu visualisieren.

  1. Probiere den Code unten aus. Verändere die Werte, um herauszufinden, wie es funktioniert.
import turtle

s = turtle.getscreen()
t = turtle.Turtle()

t.right(90)
t.forward(100)
t.left(90)
t.backward(100)
t.goto(70, 70)

t.home()

turtle.done()
  1. Probiere den Code unten aus. Verändere die Werte, um herauszufinden, wie es funktioniert. Kommentiere hinter den Zeilen, was der Code bewirkt.
import turtle

s = turtle.getscreen()
t = turtle.Turtle()

t.pen(pencolor="purple", fillcolor="orange", pensize=10, speed=9)
t.begin_fill()
t.circle(90)
t.end_fill()

turtle.done()

Übung 3: Funktionen aus anderen Funktionen zusammenstellen

  1. Probiere den Code unten aus. Verändere die Werte, um herauszufinden, wie es funktioniert.
import turtle
r = 90
s = turtle.getscreen()
t = turtle.Turtle()
while r > 10:
    t.circle(r)
    r -= 10
turtle.done()

Wir können aus dem Code oben eine eigene Funktion zusammenstellen. Die alle Schritte zusammenfasst und nur bestimmte Werte ändert. Analysiere den Code unten und kommentiere die Zeilen, was passiert?

def schleifen(radius, runden):
    r = radius
    # s = turtle.getscreen()
    k = runden
    t = turtle.Turtle()
    if runden <= 0:
        exit()
    while k > 0:
        t.circle(r)
        r -= 10
        k -= 1
    turtle.done()

schleifen(80, 5)

Mini-Projekt: Mandalas und Blumenwiesen mit Turtle

Dieses Projekt soll Kleingruppen mit 3 Personen absolviert werden. In jeder Gruppe soll mind. 1 Mädchen bzw. Junge sein. Die Abgabe erfolgt gemeinsam. Ihr habt 3 Doppelstunden in der Schule Zeit. Es empfiehlt sich, die Aufgabe nach der 2. Doppelstunde zuhause abzuschließen. Tipp: In der Nextcloud könnt ihr auch Ordner untereinander freigeben und so Code teilen.

  1. Lies dich auf der Seite https://docs.python.org/3/library/turtle.html#introduction ein. Du solltest eine grobe Idee davon haben, wie turtle funktioniert. Hier ist noch ein Videotutorial, das du gerne zuhause schauen kannst: https://youtu.be/p7CiFhiTdvY
  2. Besprich mit deiner Gruppe, wer welche Teile übernimmt. Am Ende solltet ihr den Code zusammenführen. Dabei ist es nicht von Belang, ob ihr Dopplungen habt oder die Aufgabe ideal aufgeteilt habt. Wichtig ist, dass alle ganz genau Bescheid wissen, wie der Code funktioniert. Sorgt dafür, indem ihr auch den Code gegenseitig erklärt.
  3. Bereitet eine kurze Präsentation bzw. Demo eures Code vor. Ihr habt 6 Minuten Zeit, jede:r spricht ca. 2 Minuten.

Vorgaben

  • Der Code soll hinreichend komplexe Bilder zeichnen. Der Titel lautet zwar “Mandalas und Blumenwiesen“. Ihr könnt aber beliebige Bilder erstellen.
  • Verwendet mindestens eine for- oder while-Schleife.
  • Mindestens eine Funktion soll verwendet werden, um bspw. ein Objekt zu zeichnen.

Schau dir dieses Beispiel an, teste die Funktion mit unterschiedlichen Werten für die Farbe und die Radien der Kreise:

from turtle import * # * steht für alles, so können wir die Funktionen direkt nutzen

t1 = Turtle()

def mandala(color1='blue', color2='red', speed='fastest'):
    t1.speed(speed)
    for i in range(18):  # 360/30 = 12
        t1.color(color1)
        t1.forward(50)
        t1.left(20)
        t1.circle(50)
        t1.color(color2)
        t1.circle(80)

mandala()

done()

Partner-Projekt: Verschlüsselung

Auf dieser Website wird die Verschlüsselung mit dem Caesar-Code anhand von Funktionen vermittelt.

  1. Absolviere den Kurs und schreibe eine Funktion, die jedes eingegeben Wort mithilfe des Cäsar Codes verschlüsselt.
  2. Verbessere deine Verschlüsselung, in dem für je 7 Stellen (Buchstaben oder Satzzeichen) unterschiedliche Schlüssel verwendest. Der Schlüssel ist damit eine siebenstellige Zahl, die zufällig erzeugt wird und dir dann mitgeteilt wird.
  3. Finde heraus, wie man einen Text in eine Datei schreiben kann.
  4. Schreibe zusätzliche eine Funktion, die mit einem gegeben Schlüssel einen Text (aus einer Datei) entschlüsselt.

Übung 4: Funktionen (ineinander abrufen)

  1. Analysiere den Code unten.
    • Ändere ihn anschließend so, dass
      • die Grußformel geändert wird und
      • die Reaktionen auf die Eingabe anders sind.
import random

def nameAbfrage():
    return input("Wie heißt du?")

def zahlenRaten(start,ende):
    name = nameAbfrage()
    print("Hallo",name+"!","Lass uns spielen!")
    n = random.randint(start,ende)
    print("Ich habe mir eine Zahl zwischen",start,"und",ende,"ausgedacht!\n")
    eingabe = int(input("Rate mal!"))
    versuche = 1
    while eingabe != n:
        if eingabe < n:
            eingabe = int(input("Meine Zahl ist größer!\n Rate noch mal ..."))
        elif eingabe > n:
            eingabe = int(input("Meine Zahl ist kleiner!\n Rate noch mal ..."))
        versuche += 1
    else:
        if versuche == 1:
            print("Wow! Direkt erraten, kannst du zaubern?")
        else:
            print(n, " ist richtig! Du hast",versuche,"Versuche benötigt.")


zahlenRaten(4,56)

*Übung 5: Eigene Funktionen anlegen

  1. Erstelle eine Funktion für einen Steckbrief. Die Funktion soll folgende Kriterien erfüllen:
    • Name der Funktion: steckbrief()
    • Parameter: mind. Name, Alter, Größe, Haarfarbe
    • Die Ausgabe soll in Form eines Steckbriefes erfolgen.
  2. Erstelle eine Funktion, die 15 Zufallszahlen zwischen zwei Zahlen a und b in dieser Form ausgibt:
    34,12,3,75,21, … Beim Aufrufen der Funktion sollen die Grenzen immer wieder neu festgelegt werden können. (Tipp: Du benötigst das Modul random, recherchiere die passende Methode zum Erstellen von Zufallszahlen.)
    1. *Variante: Ungerade Zahlen sollen übersprungen werden.
  3. Erstelle eine Funktion, die zufällig Namen aus einer Liste ausgibt.
Tipp dazu anzeigen
## Wähle zufällig EINEN Namen aus einer Liste aus
namen = ["Olga","Tom","Tim","Anna","Ali","Beyza","Arya"] #Liste mit Namen

#Funktion: Zieht zufällig einen Namen aus einer Liste
def zieheName():
    i = random.randint(0,len(namen)-1) #wähle Index zwischen 0 und Länge des Arrays minus 1 aus
    return namen[i] #gib Namen mit Index i zurück

n1 = zieheName() # Übergebe Rückgabewert der Funktion an Variable n1
print(n1) #gib n1 in Konsole aus
  1. Erstelle zwei eigene Funktionen und nutze die erste Funktion innerhalb der zweiten.

2 Kommentare

    • Hans Hans

      In der Tat ,Maxi

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert