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.
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.
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.
|
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.
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.
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:
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
, könnten wir einfach sagen
sum10
erstelltIm obigen Beispiel haben wir
.
Beachten Sie, dass dies die Argumente auslässt, es bedeutet nicht,
dass es sich um eine Funktion handelt, die keine Argumente benötigt.sum10()
erstellt
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.
Diese Beschreibung ist etwas ungenau, aber wir werden hier nicht weiter darauf eingehen.
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.