Programmierkurs
für Naturwissenschaftler/innen

Funktionen

Was sind Funktionen?

Eine Funktion im Kontext der Programmierung bezieht sich normalerweise auf eine Einheit einer Verrichtung (Routine). Dies mag verwirrend erscheinen, also betrachten wir ein paar konkrete Beispiele.

Während Sie programmieren, bemerken Sie oft, dass Sie ähnliche Aufgaben mehrmals ausführen müssen. Wenn Sie es jedes Mal schreiben, könnten Sie irgendwo einen Fehler machen, und das ganze Programm wird unübersichtlich.

Schauen wir uns ein einfaches Beispiel an.

summation = 1 + 2 + 3
print("Sum of 1 ... 3 is", summation)

Das ist in Ordnung, wenn diese Berechnung nur einmal durchgeführt wird, aber was ist, wenn sie viele Male vorkommt?

summation = 1 + 2 + 3
print("Sum of 3 numbers from 1 is", summation)

summation = 5 + 6 + 7
print("Sum of 3 numbers from 5 is", summation)

summation = 10012 + 10103 + 10014
print("Sum of 3 numbers from 10012 is", summation)

Das ist fast genau das Gleiche, dreimal geschrieben, aber nur mit unterschiedlichen Zahlen.

Das Problem ist, dass

  • Es ist einfach zu viel Arbeit, also umständlich.

  • Wenn es irgendwo einen Fehler gibt, müssen Sie ihn an drei Stellen beheben.

    • In diesem Beispiel ist es schwer zu übersehen, weil man das Ganze sehen kann, aber wenn diese Prozeduren über das ganze Programm verstreut ist, ist es ziemlich schwer, alles richtig zu korrigieren.

  • Es ist fast dasselbe wie im zweiten Problem, aber es ist nicht einfach, alles zu korrigieren, wenn man es später besser umschreiben möchte.

Übrigens: Haben Sie einen Fehler in dem obigen Programm bemerkt? Sehen Sie das obigen Programm noch mal und versuchen Sie, es zu finden. Die Antwort steht am Ende dieser Seite.

Trotz des Fehlers funktioniert dieses Programm, und schlimmer noch, es gibt ein Ergebnis aus, das so aussieht. Solche Fehler sind sehr schwer zu finden.

Um solche Probleme zu vermeiden, sollten ähnliche Verarbeitungen an einer Stelle geschrieben werden. Dafür sollte diese Prozedur als eine einzige Verrichtung, also eine Funktion, implementiert werden.

def sum3(num_from):
    summation = num_from + (num_from + 1) + (num_from + 2)
    print("Sum of 3 numbers from", num_from, "is", summation)


sum3(1)
sum3(5)
sum3(10012)

Hier wird eine Funktion namens sum3 definiert. Diese Funktion nimmt einen einzelnen Wert (num_from). Dies wird als Argument bezeichnet. Die Funktion berechnet num_from + (num_from + 1) + (num_from + 2) und gibt sie aus.

Wenn Sie es so schreiben, ist die Wahrscheinlichkeit, dass Sie einen Fehler machen, geringer. Wenn diese Funktion einen Fehler enthält, ist es wahrscheinlicher, dass der Fehler gefunden wird, da er an allen Stellen auftritt, an denen diese Funktion verwendet wird.

Oder: Wenn Sie z. B. den Text der Nachricht ändern möchten, müssen Sie im Originalprogramm drei Stellen ändern, im neuen Programm aber nur eine.

Wenn Sie ähnliche Dinge mehrfach tun, sollten Sie in Erwägung ziehen, sie in einer Funktion zusammenzufassen.

Wir werden später noch genauer darauf eingehen, aber spielen Sie zunächst mit einer Funktion.

Geben Sie das obige Programm ein und führen Sie es aus. Versuchen Sie sich vorzustellen, was jede Zeile (ungefähr) macht.

Ergebnis

Anmerkung

In der Praxis (und je nach Situation) ist es besser, die Funktion sum3 auf die Berechnung zu konzentrieren.

In diesem Beispiel führt die Funktion sum3 eine Berechnung durch und druckt sogar das Ergebnis aus, wodurch die Funktion sum3 mehrere Rollen erhält.

In der Regel (obwohl es viele Ausnahmen gibt) ist es oft einfacher, eine Funktion zu verbessern, wenn sie einer einzigen Aufgabe gewidmet ist.

Die (normalen) Funktionen, wie z. B. sin, im Zusammenhang mit der Programmierung oft als mathematische Funktionen bezeichnet werden. Darauf wird später auf dieser Seite eingegangen.

Erstellen einer Funktion

Jetzt zeige ich, wie man eine Funktion schreibt. Wie Sie vielleicht schon erraten haben, wird sie wie folgt geschrieben werden.

Funktionsdefinition

Um eine Funktion mit dem Namen functionname zu definieren, schreiben Sie das Folgende.

def functionname(arg1, arg2, ...):
    # Schreiben Sie hier den Vorgang.

Die erste def ist so geschrieben.

functionname ist der Name der Funktion. Die Namenskonventionen sind dieselben wie bei den Variablen. Sie können die Funktion benennen, wie Sie wollen, aber in der Regel ist es eine gute Idee, ihr einen klaren, eindeutigen Namen zu geben. Es ist nicht möglich, denselben Namen wie eine bereits verwendete Variable zu verwenden1. (Wenn Sie versuchen, eine Funktion mit demselben Namen wie eine bereits vorhandene Variable zu definieren, überschreibt die Funktion die Variable, so dass sie nicht nebeneinander existieren können.)

arg1, arg2, … sind Variablen, die als Argumente bezeichnet werden. Sie können sie nennen, wie Sie wollen. Diese Variablen können nur innerhalb dieser Funktion verwendet werden. Dies wird später im Abschnitt Scope noch genauer betrachten. Die Anzahl der Argumente ist frei wählbar. Wenn Sie kein Argument brauchen, sollten Sie nur die Klammern () schreiben. Zum Beispiel:

def some_function_without_arguments():
    # Eine Funktion, die keine Argumente benötigt


def some_function_with_one_argument(arg):
    # Eine Funktion, die ein Argument benötigt


def some_function_with_two_arguments(arg1, arg2):
    # Eine Funktion mit zwei Argumenten

Fügen Sie dann : am Ende der Zeile def hinzu.

Der Inhalt, der beim Aufruf der Funktion ausgeführt werden soll, wird in den Zeilen nach der Zeile von def geschrieben. Dabei wird ein führendes Leerzeichen an den Anfang der Zeilen gesetzt. Dieser Zwischenraum am Anfang der Zeilen wird als Indent bzw. Einzug bezeichnet.

Wie bereits gesehen, sind zum Beispiel im folgenden Fall die nächsten beiden Zeilen von def der Inhalt (Definition) der Funktion sum3.

def sum3(num_from):
    summation = num_from + (num_from + 1) + (num_from + 2)
    print("Sum of 3 numbers from", num_from, "is", summation)


sum3(1)
sum3(5)
sum3(10012)

Die letzten drei Zeilen sind der Teil außerhalb der Definition von sum3, in dem die Funktion tatsächlich verwendet wird.

Die visuelle Darstellung dieser Struktur sieht wie folgt aus. Vergewissern Sie sich, wo der Hauptteil der Funktion ist und wo außerhalb der Funktion.

def sum3(num_from):
summation = num_from + (num_from + 1) + (num_from + 2)
print("Sum of 3 numbers from", num_from, "is", summation)


sum3(1)
sum3(5)
sum3(10012)

Die Anzahl der Leerzeichen, die für die Einzüge verwendet werden, kann beliebig sein, aber in Python sind es normalerweise vier. Die Anzahl der Leerzeichen kann während der Definition nicht geändert werden (Leere Zeilen können jedoch eingefügt werden). Nachfolgend sind einige Beispiele aufgeführt.

# Falsche Schreibweise
# (Einzugsbreite nicht konstant)
def sum3(num_from):
    summation = num_from + (num_from + 1) + (num_from + 2)
      print("Sum of 3 numbers from", num_from, "is", summation)
# Falsche Schreibweise
# (keine Einzüge)
def sum3(num_from):
summation = num_from + (num_from + 1) + (num_from + 2)
print("Sum of 3 numbers from", num_from, "is", summation)
# Richtig, aber sollte vermieden werden
# (Einzugsbreite nicht 4)
def sum3(num_from):
  summation = num_from + (num_from + 1) + (num_from + 2)
  print("Sum of 3 numbers from", num_from, "is", summation)
# Richtig, aber sollte vermieden werden
# (Einzugsbreite nicht 4)
def sum3(num_from):
        summation = num_from + (num_from + 1) + (num_from + 2)
        print("Sum of 3 numbers from", num_from, "is", summation)
# Richtig
# (Leere Zeilen können eingefügt werden)
def sum3(num_from):
    summation = num_from + (num_from + 1) + (num_from + 2)

    print("Sum of 3 numbers from", num_from, "is", summation)

Rückgabewert

Wenn Sie einen Rückgabewert zurückgeben möchten, verwenden Sie return.

Eine Funktion, die drei Zahlen aus num_from addiert und das Ergebnis zurückgibt (ohne die Antwort auszudrucken), könnte zum Beispiel wie folgt geschrieben werden:

def calc_sum3(num_from):
    summation = num_from + (num_from + 1) + (num_from + 2)
    return summation

In diesem Fall könnte sie wie folgt geschrieben werden.

def calc_sum3(num_from):
    return num_from + (num_from + 1) + (num_from + 2)

Wenn Sie den Rückgabewert nicht benötigen, schreiben Sie einfach nur Anweisungen (ohne return).

def say_hello():
    print("Hello, world")

Variablen innerhalb einer Funktion

Variablen, die innerhalb einer Funktion definiert sind, können nur innerhalb dieser Funktion verwendet werden. (Diese werden als lokale Variablen bezeichnet.)

Im folgenden Beispiel ist die summation eine Variable, die nur innerhalb dieser Funktion verwendet werden kann.

def sum3(num_from):
    summation = num_from + (num_from + 1) + (num_from + 2)
    print("Sum of 3 numbers from", num_from, "is", summation)

Dies wird im Abschnitt Scope ausführlicher behandelt.

Teilzusammenfassung

Im folgenden Programm:

def sum3(num_from):
    summation = num_from + (num_from + 1) + (num_from + 2)
    print("Sum of 3 numbers from", num_from, "is", summation)
  • num_from ist einen Argument

  • summation ist eine lokale Variable, die innerhalb der Funktion definiert wurde

Diese Variablen können nur innerhalb dieser Funktion verwendet werden.

Verwendung von Funktionen

Die Definition einer Funktion allein bewirkt noch nichts (so wie a = 10 offensichtlich nichts bewirkt). Daher müssen Sie die Funktion irgendwo verwenden (aufrufen).

Aber das sollte eigentlich selbsterklärend sein. Wenn Sie das oben definierte say_hello() verwenden wollen, müssen Sie nur folgendes schreiben.

say_hello()

Um den Rückgabewert zu verwenden, können Sie ihn entweder direkt nutzen oder in eine Variable einfügen.

sum3 = calc_sum3(10)
print(sum3)

In diesem Fall können Sie auch wie folgt schreiben:

print(calc_sum3(10))

Wenn es als komplettes Programm geschrieben werden, würde es beispielsweise wie folgt aussehen:

def calc_sum3(num_from):
    summation = num_from + (num_from + 1) + (num_from + 2)
    return summation


sum3 = calc_sum3(10)
print(sum3)

Schreiben Sie eine Funktion, die $x$ als Argument nimmt, $x^2 - 2$ berechnet und den Wert zurückgibt. Berechnen Sie mit Hilfe dieser Funktion die Werte dieser Funktion bei $x = 0, 1$ und $2$ und zeigen Sie sie an.

Ergebnis

Ort der Funktionsdefinition

In Python müssen Funktionsdefinitionen geschrieben werden, bevor sie zum ersten Mal verwendet (ausgeführt) werden. Das heißt,

def say_hello():
    print("Hello, world")


say_hello()

ist ein richtiges Programm, aber

say_hello()    # Fehler! (Python weiß noch nicht, was say_hello() ist)


def say_hello():
    print("Hello, world")

ist falsch.

Anmerkung

Dieser Abschnitt ist etwas fortgeschrittener und kann vorerst übersprungen werden.

Ein etwas verwirrendes Beispiel ist der folgende Fall.

# Wird dies richtig funktionieren?

def say_hello_and_name(name):
    say_hello()    # Noch nicht definiert, aber...
    print("Hello,", name)

def say_hello():
    print("Hello, world")


say_hello_and_name("Einstein")

In diesem Fall werden say_hello_and_name() und say_hello() zum ersten Mal verwendet (nicht erscheinen), wenn say_hello_and_name("Einstein") ausgeführt wird. Es genügt, dass say_hello() und say_hello_and_name() zum Zeitpunkt der Ausführung dieser Anweisung definiert sind. Daher funktioniert das obige Beispiel korrekt. Mit anderen Worten: In diesem Beispiel können say_hello_and_name() und say_hello() in beliebiger Reihenfolge definiert werden.

Vorteile des Schreibens als Funktion

Einer der Vorteile des Schreibens einer Reihe von Anweisungen als eine Funktion besteht darin, dass es einfach ist, die Funktion zu verbessern.

Nehmen wir zum Beispiel an, dass eine Funktion namens sum10() wie folgt geschrieben wurde. (\ am Ende einer Zeile bedeutet, dass die Zeile in der nächsten Zeile fortgesetzt wird.)

def sum10(num_from):
    summation = num_from + (num_from + 1) + (num_from + 2) \
              + (num_from + 3) + (num_from + 4) + (num_from + 5) \
              + (num_from + 6) + (num_from + 7) + (num_from + 8) \
              + (num_from + 9)

    return summation


print(sum10(10))
print(sum10(100))

Bei genauerem Hinsehen werden Sie jedoch feststellen, dass sie sich wie folgt formulieren lässt:

def sum10(num_from):
    summation = 10 * num_from + 45
    return summation


print(sum10(10))
print(sum10(100))

Der wichtigste Punkt ist, dass sum10() verbessert wurde, ohne einen anderen Teil des Programms zu ändern. Das obige Beispiel mag nicht sehr aussagekräftig erscheinen, da es nur als Beispiel diente, aber es ist eine häufige Situation.

Um sie jedoch zu verbessern, ohne etwas anderes als die Funktion zu ändern, müssen das Argument und der Rückgabewert gleich bleiben. Darauf folgt:

Bevor Sie eine Funktion schreiben, sollten Sie sich die Argumente und den Rückgabewert genau überlegen.

Dies ist jedoch nur ein Ideal. Die Entscheidung, welche Argumente und Rückgabewert zu verwenden sind, ist weitgehend eine Frage der Erfahrung. Wenn Sie eine Funktion verbessern, werden Sie oft auch die Argumente ändern wollen. Am Anfang sollten Sie nicht zu viel darüber nachdenken, sondern sie einfach unbeschwert ändern und sich allmählich daran gewöhnen.

Konventionen

Um deutlich zu machen, dass es sich um eine Funktion (und nicht um eine Variable) handelt, wird sie manchmal als func() mit Klammern nach dem Funktionsnamen geschrieben.

Anstatt beispielsweise zu sagen Im obigen Beispiel haben wir eine Funktion namens sum10 erstellt , könnten wir einfach sagen Im obigen Beispiel haben wir sum10() erstellt . Beachten Sie, dass dies die Argumente auslässt, es bedeutet nicht, dass es sich um eine Funktion handelt, die keine Argumente benötigt.

Mathematische Funktionen

Bisher haben wir besprochen, wie Sie selbst neue Funktionen erstellen können. In diesem Abschnitt werden einige der Funktionen vorgestellt, die in Python von Anfang an zur Verfügung stehen.

Die print(), die Sie schon verwendet haben, ist eine der Funktionen, die von Anfang an in Python enthalten sind. Es gibt noch viele weitere, aber wir werden hier nur auf mathematische Funktionen eingehen.

Python bietet eine Vielzahl von mathematischen Funktionen. Wie bei den mathematischen Konstanten muss jedoch import math am Anfang des Programms geschrieben werden. Sobald diese geschrieben ist, können die folgenden Funktionen (und die unter mathematischen Konstanten beschriebenen Konstanten) verwendet werden.

Für e-Funktion verwenden Sie math.exp(x). Vergessen Sie nicht, math. hinzuzufügen.

import math

a = math.exp(0.5)
print(a)

wird $\mathrm{e}^{1/2}$ berechnen und anzeigen.

Analog dazu verwenden Sie math.sin(x) für Sinus-Funktion. Beachten Sie, dass die Argumente der trigonometrischen Funktionen im Bogenmaß (Radian) angegeben werden. Wie bereits erwähnt, können Sie für $\pi$ die vordefinierte Konstante math.pi verwenden.

import math

a = math.sin(math.pi / 3)    # sin 60°
print(a)

Die Quadratwurzel ist math.sqrt(x). Der Logarithmus zur Basis e ist math.log(), und der Logarithmus zur Basis 10 ist math.log10().

Der Betrag von $x$ kann mit abs(x) (ohne math. !) oder math.fabs(x) ermittelt werden (f steht für float). Normalerweise spielt es keine Rolle, welche Methode verwendet wird2.

Eine vollständige Liste der mathematischen Funktionen finden Sie in math — Mathematical functions (Python Documentation).

Antworten auf das Quiz

summation = 10012 + 10103 + 10014

sollte

summation = 10012 + 10013 + 10014

geschrieben werden (die zweite Zahl ist 10013, nicht 10103). Natürlich ist an beidem mathematisch nichts auszusetzen, aber es ist nicht das, was der/die Programmierer/in beabsichtigt hat.

Auch diese Art von funktioniert und sieht richtig aus, ist aber falsch -Fehler ist sehr schwer zu finden. Es ist sehr wichtig, solcher Fehler möglichst zu vermeiden (und so zu schreiben, dass es schwer ist, Fehler zu machen, bzw. dass sie leicht zu finden sind, wenn man sie doch macht).

Zusammenfassung

In diesem Abschnitt haben Sie etwas über Funktionen gelernt.

  • Die Definition einer Funktion wird wie folgt geschrieben.

    def functionname(arg1, arg2, ...):
        # Schreiben Sie hier den Prozess
    • arg1, arg2, … werden als Argumente bezeichnet und können nur innerhalb dieser Funktion verwendet werden. (Sie können sie nennen, wie Sie wollen.)

    • Der Inhalt der Funktion wird mit Indent (Einzug) geschrieben.

    • Mit return können Sie den Rückgabewert zurückgeben.

    • Variablen, die innerhalb einer Funktion definiert sind, können nur innerhalb dieser Funktion verwendet werden.

  • Außerdem gibt es eine Reihe von Funktionen, die von Python bereitgestellt werden.

  • Es gibt viele Dinge, die man beim Schreiben von Funktionen beachten muss, und ich habe schon viel darüber geschrieben, aber schreiben und probieren Sie Programme, ohne zu viel nachzudenken, bis Sie sich daran gewöhnt haben. Wenn Sie sich etwas wohler fühlen, sollten Sie diese Seite noch einmal lesen und darüber nachdenken, was Sie beim Schreiben einer Funktion beachten müssen.


1

Diese Beschreibung ist etwas ungenau, aber wir werden hier nicht weiter darauf eingehen.

2

Streng genommen gibt abs(x) das Ergebnis als Ganzzahl zurück, wenn das Argument vom Typ Ganzzahl ist, und das Ergebnis als Gleitkommazahl, wenn das Argument vom Typ Gleitkommazahl ist, während math.fabs(x) gibt das Ergebnis im Gleitkommazahl-Typ zurück, egal ob das Argument ein Ganzzahl- oder Gleitkommazahl-Typ ist.