Funktionen in Python#

In den vorhergehenden Übungen haben wir eingebaute Funktionen von Python verwendet. Funktionen haben einen Namen und eine definierte Anzahl von Parametern. Einige von ihnen geben ein Ergebnis zurück, andere nicht.

Gängigerweise rufen wir Funktionen so auf: Ergebnis = Funktionsname(Parameter)

Siehe auch

Werfen wir einen Blick auf ein paar Funktionen, zum Beispiel print(text) und pow(x, y).

Wie wir bereits erfahren haben, lassen sich Metadaten und die Dokumentation einer Funktion bzw. eines Objektes im Allgemeinen via ? oder .__doc__ anzeigen:

print.__doc__
'Prints the values to a stream, or to sys.stdout by default.\n\n  sep\n    string inserted between values, default a space.\n  end\n    string appended after the last value, default a newline.\n  file\n    a file-like object (stream); defaults to the current sys.stdout.\n  flush\n    whether to forcibly flush the stream.'

Zudem gibt es zwei weitere Hilfsmittel, um sich Informationen zu Funktionen und Objekten im Allgemeinen anzeigen zu lassen:

  • help: Ruft das Hilfe-System für das angegebene Objekt bzw. des aktuellen interpreters auf

  • dir: Gibt eine Liste aller verfügbaren Methoden eines angegebenen Objektes bzw. des aktuellen Geltungsbereiches aus

help(print)
Help on built-in function print in module builtins:

print(*args, sep=' ', end='\n', file=None, flush=False)
    Prints the values to a stream, or to sys.stdout by default.

    sep
      string inserted between values, default a space.
    end
      string appended after the last value, default a newline.
    file
      a file-like object (stream); defaults to the current sys.stdout.
    flush
      whether to forcibly flush the stream.

Die Funktion print nimmt einen oder mehrere Parameter entgegen und gibt nichts zurück:

result = print('Hello world')
Hello world
result

Die Funktion pow nimmt 2 (oder 3) Parameter entgegen und gibt das berechnete Ergebnis zurück:

help(pow)
Help on built-in function pow in module builtins:

pow(base, exp, mod=None)
    Equivalent to base**exp with 2 arguments or base**exp % mod with 3 arguments

    Some types, such as ints, are able to use a more efficient algorithm when
    invoked using the three argument form.
result = pow(2, 3)
result
8

Benutzerdefinierte Funktionen#

Eigene Funktionen können mit der Anweisung def definiert werden. Nach der def-Anweisung geben Sie den Namen Ihrer Funktion und ihre Parameter in Klammern an. Danach folgt ein Doppelpunkt : und alle folgenden gleichmäßig eingerückten Codezeilen sind Teil dieser Funktion. Eine abschließende return-Anweisung sendet das Ergebnis an die Position im Code zurück, von der aus die Funktion aufgerufen wurde.

# Benutzerdefinierte Funktion
def sum_numbers(a, b):
    # Variable aus Summe der Paramter erzeugen
    result = a + b
    # Variable als Ergebnis der Funktion zurückgeben
    return result

Eine so definierte Funktion kann beliebig oft aufgerufen werden:

sum_numbers(3, 4)
7
sum_numbers(5, 6)
11

Das Ergebnis der Funktion kann dann wieder in einer Variablen gespeichert werden:

c = sum_numbers(4, 5)
print(c)
9

Code durch wiederverwendbare Funktionen optimieren#

Angenommen, wie haben einen komplizierten Algorithmus, mit dem festgestellt werden soll, ob eine Zahl ungerade oder gerade ist. Wir packen diesen Algorithmus in eine Funktion und rufen diese bei Bedarf auf. Änderungen oder Verbesserungen am Algorithmus müssen dann nur noch zentral an einer Stelle im Code vorgenommen werden. Dies verbessert die Lesbarkeit und Wartbarkeit unseres Codes.

def print_odd_or_even(number):
    if number % 2 == 0:
        print(number, "is even")
    else:
        print(number, "is odd")

Nun können wir einfach unsere eigene „print_odd_or_even“-Funktion aufrufen, anstatt immer wieder den gleichen „if-else“-Block zu schreiben:

print_odd_or_even(3)
3 is odd
print_odd_or_even(10)
10 is even

Funktionen dokumentieren#

Der Zweck einer Funktion sowie weitere wichtige Hinweise zur Nutzung sollten kurz und aussagekräftig dokumentiert werden. Dies geschieht über einen sogenannten Doc-String eingeleitet durch """. Der Doc-String folgt direkt nach der ersten zeile der Funktion mit Namen und Parametern und sieht folgendermaßen aus:

def square(number):
    """
    Squares a number by multiplying it with itself and returns the result.
    """

    return number * number

Diese Dokumentation kann dann wie gewohnt angezeigt werden:

print(square.__doc__)
    Squares a number by multiplying it with itself and returns the result.
    

Übung#

Mit dem Wissen aus den vorangegangenen Abschnitten und den Informationen über Module in der Standardbibliothek von Python soll eine Funktion geschrieben werden, um alle Dateien aus dem Ordner my_data zu öffnen und deren Inhalt nacheinander in ein Dictionary einzufügen. Dabei sollen die Dateinamen als Key genutzt werden, also dateiname:inhalt. Dieses Dictionary soll als Ergebnis der Funktion zurückgegeben werden. Lasst euch die Werte des Dictionary danach in der korrekten Reihenfolge anzeigen.

Hilfreich ist hierfür z.b. das Modul os aus der Standardbibliothek für allgemeine Operationen im Betriebssystem, z.b. um Inhalte eines Ordners lesen.

Außerdem ist ein Blick in passende Online-Tutorials immer hilfreich, z.B.: