Zum Inhalt springen
aviral gupta

// B3.1 · ca. 25 Min. · Einstieg

Funktionen definieren und Werte zurückgeben

Nach dieser Lektion definieren Sie Funktionen mit def, rufen sie mit Argumenten auf, geben Ergebnisse mit return zurück und erklären, warum eine Funktion ohne return None liefert.

Lektion 1 von 5 in B3 Funktionen

Anfang des Moduls

Danach können Sie

  • Eine Funktion mit def und Parametern definieren und mit Argumenten aufrufen
  • Einen Wert mit return zurückgeben und vorhersagen, wann eine Funktion None liefert
  • Variablen lokal in einer Funktion halten und ihr einen einzeiligen Docstring geben
  1. Aufwärmen · Aufgabe 1 von 7

    Aufwärmen aus Modul B2: Was gibt das aus?

    total = 0
    for n in range(1, 4):
        total += n
    print(total)
  2. Vorhersagen · Aufgabe 2 von 7

    Sagen Sie es vorher, bevor Sie weiterlesen: Was gibt das aus?

    def double(n):
        n * 2
    
    print(double(5))
  3. Üben · Aufgabe 3 von 7

    Setzen Sie das Schlüsselwort ein, damit area(3, 4) dem Aufrufer 12 liefert.

    def area(width, height):
        ____ width * height
    width * height
  4. Üben · Aufgabe 4 von 7

    Eine Variable in der Funktion heißt wie eine außerhalb. Was gibt das aus?

    def set_score():
        score = 100
    
    score = 5
    set_score()
    print(score)
  5. Üben · Aufgabe 5 von 7

    Gegeben sind def f(x): return x + 1 und def g(x): print(x). Ordnen Sie jedem Ausdruck zu, was er zurückgibt.

  6. Denksport · Aufgabe 6 von 7

    Knobelaufgabe. return steht in einer for-Schleife. Was gibt das aus?

    def first_even(numbers):
        for n in numbers:
            if n % 2 == 0:
                return n
        return -1
    
    print(first_even([3, 7, 8, 10]), first_even([1, 5]))
  7. Anwenden · Aufgabe 7 von 7

    Mini-Aufgabe. Schreiben Sie eine Funktion fahrenheit(celsius), die die Temperatur in Grad Fahrenheit zurückgibt: celsius * 9 / 5 + 32. Geben Sie ihr einen einzeiligen Docstring. Geben Sie dann das Ergebnis für 100, -40 und 37 aus.

    Prüfen Sie Ihr Ergebnis anhand dieser Liste

Selbst programmieren

Lesen Sie das ausgearbeitete Beispiel und lösen Sie dann die Übungen. Ihr Code läuft in Ihrem Browser oder auf Ihrem Computer und wird nie hochgeladen.

Ausgearbeitetes Beispiel

Ein Kassenbon aus zwei Funktionen

line_total berechnet die Kosten einer Zeile des Kassenbons und gibt sie zurück. print_line gibt eine Zeile aus und ruft line_total auf, um den Betrag zu bekommen. Weil line_total sein Ergebnis zurückgibt, kann das Programm auch zwei Zeilen addieren. Der letzte Aufruf zeigt, was print_line zurückgibt: Es gibt nur aus, das Ergebnis ist also None.

main.py

def line_total(price, quantity):
    """Return the cost of one receipt line."""
    return price * quantity


def print_line(name, price, quantity):
    """Print one receipt line."""
    print(name, quantity, "x", price, "=", line_total(price, quantity))


print_line("apples", 0.5, 6)
print_line("bread", 2.25, 1)
total = line_total(0.5, 6) + line_total(2.25, 1)
print("total:", total)

result = print_line("milk", 1.1, 2)
print("print_line returned", result)

Ausführen mit

python main.py

Ausgabe

apples 6 x 0.5 = 3.0
bread 1 x 2.25 = 2.25
total: 5.25
milk 2 x 1.1 = 2.2
print_line returned None
  • Die beiden def-Blöcke geben nichts aus: Die Rümpfe laufen erst, wenn die Funktionen aufgerufen werden.
  • line_total gibt eine Zahl zurück, also kann line_total(0.5, 6) + line_total(2.25, 1) die beiden Ergebnisse addieren.
  • print_line hat kein return, also ist result None, obwohl der Aufruf eine Zeile ausgegeben hat.
  • Jede Funktion beginnt mit einem einzeiligen Docstring, der sagt, was sie tut.
Ändern und ausführen

Tab rückt ein, Umschalt+Tab rückt aus. Um den Editor mit der Tastatur zu verlassen, drücken Sie Esc und dann Tab.

Beim ersten Ausführen lädt Ihr Browser Python herunter (bis zu 6.5 MB) und speichert es im Cache. Ihr Code bleibt auf Ihrem Gerät.

Übungen

Übung 1 von 2

Hilfsfunktionen für Rechtecke

Vervollständigen Sie zwei Funktionen in main.py. area(width, height) gibt Breite mal Höhe zurück, perimeter(width, height) den Umfang des Rechtecks: zwei Breiten plus zwei Höhen. Beide müssen die Zahl zurückgeben, nicht ausgeben. Die Tests importieren sie mit from main import area, perimeter.

Tab rückt ein, Umschalt+Tab rückt aus. Um den Editor mit der Tastatur zu verlassen, drücken Sie Esc und dann Tab.

Beim ersten Ausführen lädt Ihr Browser Python herunter (bis zu 6.5 MB) und speichert es im Cache. Ihr Code bleibt auf Ihrem Gerät.

Hinweise
  1. Hinweis 1

    Ersetzen Sie return 0 durch die Rechnung; die Parameter width und height enthalten schon die Zahlen aus dem Aufruf.

  2. Hinweis 2

    Der Umfang addiert alle vier Seiten: width + height + width + height.

  3. Hinweis 3

    return width * height und return 2 * width + 2 * height.

Eine Lösung zeigen

Ein möglicher Lösungsweg. Ihrer kann anders aussehen und trotzdem alle Prüfungen bestehen.

def area(width, height):
    """Return the area of a rectangle."""
    return width * height


def perimeter(width, height):
    """Return the perimeter of a rectangle."""
    return 2 * width + 2 * height


print(area(3, 4), perimeter(3, 4))
Auf dem eigenen Computer ausführen

Installieren Sie Python 3.14 oder neuer. Speichern Sie diese Dateien in einem Ordner, öffnen Sie dort ein Terminal und führen Sie die Befehle unten aus.

main.py

def area(width, height):
    """Return the area of a rectangle."""
    return 0  # replace with the real calculation


def perimeter(width, height):
    """Return the perimeter of a rectangle."""
    return 0  # replace with the real calculation


print(area(3, 4), perimeter(3, 4))

test_main.py

from main import area, perimeter


def test_area():
    """area(3, 4) ist 12"""
    got = area(3, 4)
    assert got == 12, f"area(3, 4) lieferte {got!r}, erwartet: 12"


def test_area_other_sizes():
    """area stimmt auch für 5 x 5 und 2.5 x 2"""
    got = area(5, 5), area(2.5, 2)
    assert got == (25, 5.0), f"area(5, 5) und area(2.5, 2) lieferten {got!r}, erwartet: (25, 5.0)"


def test_perimeter():
    """perimeter(3, 4) ist 14"""
    got = perimeter(3, 4)
    assert got == 14, f"perimeter(3, 4) lieferte {got!r}, erwartet: 14"


def test_perimeter_square():
    """perimeter(5, 5) ist 20"""
    got = perimeter(5, 5)
    assert got == 20, f"perimeter(5, 5) lieferte {got!r}, erwartet: 20"

Unter macOS und Linux tippen Sie python3, wo in diesen Befehlen python steht, wie in der ersten Lektion.

Programm ausführen:

python main.py

Prüfungen ausführen (learnrun.py muss im selben Ordner liegen):

python learnrun.py test
learnrun.py herunterladen

Übung 2 von 2

Notenbuchstaben

grade(score) soll für eine Punktzahl von 0 bis 100 einen Buchstaben zurückgeben: "A" ab 90, "B" ab 80, "C" ab 70 und "F" unter 70. Der Starter gibt aus, statt zurückzugeben, also liefert jeder Aufruf None. Korrigieren Sie das mit einer if-, elif- und else-Kette, die den Buchstaben zurückgibt.

Tab rückt ein, Umschalt+Tab rückt aus. Um den Editor mit der Tastatur zu verlassen, drücken Sie Esc und dann Tab.

Beim ersten Ausführen lädt Ihr Browser Python herunter (bis zu 6.5 MB) und speichert es im Cache. Ihr Code bleibt auf Ihrem Gerät.

Hinweise
  1. Hinweis 1

    Ersetzen Sie print("F") durch eine Kette von Prüfungen. Jeder Zweig endet mit return und einem Buchstaben.

  2. Hinweis 2

    Beginnen Sie mit der besten Note: if score >= 90: return "A". Dann elif score >= 80 und so weiter.

  3. Hinweis 3

    Der else-Zweig gibt "F" zurück, so bekommt jede Punktzahl einen Buchstaben, und kein Aufruf liefert None.

Eine Lösung zeigen

Ein möglicher Lösungsweg. Ihrer kann anders aussehen und trotzdem alle Prüfungen bestehen.

def grade(score):
    """Return the letter grade for a score from 0 to 100."""
    if score >= 90:
        return "A"
    elif score >= 80:
        return "B"
    elif score >= 70:
        return "C"
    else:
        return "F"


print(grade(85))
Auf dem eigenen Computer ausführen

Installieren Sie Python 3.14 oder neuer. Speichern Sie diese Dateien in einem Ordner, öffnen Sie dort ein Terminal und führen Sie die Befehle unten aus.

main.py

def grade(score):
    """Return the letter grade for a score from 0 to 100."""
    # 90 and up: "A", 80 and up: "B", 70 and up: "C", below 70: "F".
    print("F")


print(grade(85))

test_main.py

from main import grade


def test_returns_the_letter():
    """grade(95) liefert A"""
    got = grade(95)
    assert got == "A", f"grade(95) lieferte {got!r}, erwartet: 'A' (gibt die Funktion den Buchstaben zurück oder nur aus?)"


def test_boundaries():
    """90, 80 und 70 sind A, B und C"""
    got = grade(90), grade(80), grade(70)
    assert got == ("A", "B", "C"), f"grade(90), grade(80) und grade(70) lieferten {got!r}, erwartet: ('A', 'B', 'C')"


def test_fail():
    """69 und 0 sind F"""
    got = grade(69), grade(0)
    assert got == ("F", "F"), f"grade(69) und grade(0) lieferten {got!r}, erwartet: ('F', 'F')"

Unter macOS und Linux tippen Sie python3, wo in diesen Befehlen python steht, wie in der ersten Lektion.

Programm ausführen:

python main.py

Prüfungen ausführen (learnrun.py muss im selben Ordner liegen):

python learnrun.py test
learnrun.py herunterladen

Häufige Fehler

Eine Funktion aufrufen, bevor ihr def gelaufen ist

print(square(4))

def square(n):
    return n * n

Was Python ausgibt

NameError: name 'square' is not defined

Warum, und die Lösung

Python führt eine Datei von oben aus. Bei square(4) ist das def darunter noch nicht gelaufen, der Name square existiert also nicht. Stellen Sie jedes def über den Code, der es aufruft; meist stehen alle Funktionen oben in der Datei.

Ein Argument weglassen

def greet(name):
    print("Hello,", name)

greet()

Was Python ausgibt

TypeError: greet() missing 1 required positional argument: 'name'

Warum, und die Lösung

greet hat einen Parameter, also braucht jeder Aufruf ein Argument: greet("Ada"). Die Meldung nennt den Parameter, der keinen Wert bekommen hat. Die nächste Lektion zeigt, wie ein Standardwert ein Argument optional macht.

Ausgeben statt zurückgeben

def double(n):
    print(n * 2)

result = double(5) + 1

Was Python ausgibt

TypeError: unsupported operand type(s) for +: 'NoneType' and 'int'

Warum, und die Lösung

double zeigt 10 an, gibt aber nichts zurück; double(5) ist also None, und None + 1 ist ein Fehler. NoneType ist der Typ von None. Schreiben Sie return n * 2 und geben Sie das Ergebnis dort aus, wo Sie die Funktion aufrufen.

Python im Browser: Pyodide 314.0.7, MPL-2.0. Lizenz und Quellcode

Abschlussquiz

5 Fragen, ohne Hinweise. Ab 80 % ist die Lektion abgeschlossen.

Erledigen Sie zuerst alle Aufgaben oben, um das Abschlussquiz freizuschalten.

Problem melden

Etwas ist falsch oder unklar? Beschreiben Sie es kurz, dann wird es geprüft und korrigiert.

#

Mindestens 20 Zeichen.

Nur, wenn Sie eine Antwort wünschen.

Kernideen

def benennt einen Codeblock, ein Aufruf führt ihn aus

def area(width, height): erzeugt eine Funktion namens area mit zwei Parametern. Die eingerückten Zeilen darunter sind der Rumpf. Die def-Zeile führt den Rumpf nicht aus: Sie bindet nur den Namen an eine Funktion. Der Rumpf läuft bei jedem Aufruf mit Klammern, area(3, 4). Die Werte im Aufruf, 3 und 4, sind die Argumente; sie werden der Reihe nach den Parametern zugewiesen. Der Name allein, area ohne Klammern, ist nur das Funktionsobjekt und ruft nichts auf.

return gibt einen Wert zurück

return width * height beendet die Funktion und übergibt den Wert an den Aufrufer, sodass area(3, 4) gespeichert, ausgegeben oder in einer Summe verwendet werden kann. print zeigt nur Text an; der Aufrufer bekommt davon nichts. Eine Funktion, die ohne return oder mit einem leeren return endet, liefert None. Deshalb scheitert double(5) + 1, wenn double ausgibt statt zurückzugeben: Python rechnet None + 1. return beendet auch eine Schleife in der Funktion sofort.

Lokale Variablen und Docstrings

Variablen, die in einer Funktion zugewiesen werden, Parameter eingeschlossen, sind lokal: Sie existieren nur während dieses Aufrufs und ändern keine gleichnamige Variable außerhalb. Lesen kann eine Funktion eine Variable von außen trotzdem; sie sieht den Wert zum Zeitpunkt des Aufrufs. Ist die erste Zeile des Rumpfs ein String, ist das der Docstring, gespeichert in area.__doc__. Seine erste Zeile ist eine kurze Zusammenfassung, beginnt mit einem Großbuchstaben und endet mit einem Punkt.

Quellen

Zuletzt geprüft am 29. September 2026