Course
Python Functions Tutorial
Funktionen sind ein wesentlicher Bestandteil der Programmiersprache Python: Vielleicht hast du schon einige der vielen fantastischen Funktionen kennengelernt und genutzt, die in Python eingebaut sind oder aus dem Ökosystem der Bibliothek stammen. Als Data Scientist wirst du jedoch ständig eigene Funktionen schreiben müssen, um Probleme zu lösen, die dir deine Daten stellen.
Um den Beispielcode in diesem Lernprogramm ganz einfach selbst auszuführen, kannst du eine kostenlose DataLab-Arbeitsmappe erstellen, auf der Python vorinstalliert ist und die alle Codebeispiele enthält. Wenn du mehr Übung im Schreiben von Python-Funktionen brauchst, schau dir diese praktische DataCamp-Übung an oder probiere unseren Python Data Science Toolbox-Kurs aus!
Funktionen in Python
In der Programmierung verwendest du Funktionen, um eine Reihe von Anweisungen zu bündeln, die du wiederholt verwenden möchtest oder die aufgrund ihrer Komplexität besser in einem Unterprogramm untergebracht und bei Bedarf aufgerufen werden sollten. Das bedeutet, dass eine Funktion ein Stück Code ist, das geschrieben wurde, um eine bestimmte Aufgabe auszuführen. Um diese spezielle Aufgabe zu erfüllen, kann die Funktion mehrere Eingaben benötigen, muss es aber nicht. Wenn die Aufgabe ausgeführt wird, kann die Funktion einen oder mehrere Werte zurückgeben oder nicht.
In Python gibt es drei Arten von Funktionen:
- Eingebaute Funktionen wie
help()
, um um Hilfe zu bitten,min()
, um den Mindestwert zu ermitteln,print()
, um ein Objekt auf dem Terminal auszudrucken,... Eine Übersicht mit weiteren dieser Funktionen findest du hier. - Benutzerdefinierte Funktionen (User-Defined Functions, UDFs), d.h. Funktionen, die von den Benutzern erstellt werden, um ihnen zu helfen; und
- Anonyme Funktionen, die auch Lambda-Funktionen genannt werden, weil sie nicht mit dem Standardschlüsselwort
def
deklariert werden.
Funktionen vs. Methoden
Eine Methode bezieht sich auf eine Funktion, die Teil einer Klasse ist. Du greifst auf sie mit einer Instanz oder einem Objekt der Klasse zu. Eine Funktion hat diese Einschränkung nicht: Sie verweist einfach auf eine eigenständige Funktion. Das bedeutet, dass alle Methoden Funktionen sind, aber nicht alle Funktionen sind Methoden.
In diesem Beispiel definierst du zuerst eine Funktion plus()
und dann eine Klasse Summation
mit einer Methode sum()
:
Wenn du nun die Methode sum()
aufrufen willst, die Teil der Klasse Summation
ist, musst du zunächst eine Instanz oder ein Objekt dieser Klasse definieren. Definieren wir also ein solches Objekt:
Denke daran, dass diese Instanziierung nicht notwendig ist, wenn du die Funktion plus()
aufrufen willst! Du könntest plus(1,2)
ohne Probleme im DataCamp Light Code Chunk ausführen!
Parameter vs. Argumente
Parameter sind die Namen, die bei der Definition einer Funktion oder einer Methode verwendet werden und auf die Argumente abgebildet werden. Mit anderen Worten: Argumente sind die Dinge, die einem Funktions- oder Methodenaufruf übergeben werden, während sich der Funktions- oder Methodencode auf die Argumente durch ihre Parameternamen bezieht.
Betrachte das folgende Beispiel und schaue auf den obigen DataCamp Light Chunk zurück: Du übergibst zwei Argumente an die Methode sum()
der Klasse Summation
, obwohl du zuvor drei Parameter definiert hast, nämlich self
, a
und b
.
Was ist mit self
passiert?
Das erste Argument jeder Klassenmethode ist immer ein Verweis auf die aktuelle Instanz der Klasse, die in diesem Fall Summation
ist. Konventionell wird dieses Argument self
genannt.
Das alles bedeutet, dass du in diesem Fall den Verweis auf self
nicht übergibst, denn self
ist der Parametername für ein implizit übergebenes Argument, das sich auf die Instanz bezieht, durch die eine Methode aufgerufen wird. Sie wird implizit in die Argumentliste eingefügt.
So definierst du eine Funktion: Benutzerdefinierte Funktionen (UDFs)
Die vier Schritte zur Definition einer Funktion in Python sind die folgenden:
- Verwende das Schlüsselwort
def
, um die Funktion zu deklarieren und gib anschließend den Funktionsnamen an. - Füge der Funktion Parameter hinzu: Sie sollten innerhalb der Klammern der Funktion stehen. Beende deine Zeile mit einem Doppelpunkt.
- Füge Anweisungen hinzu, die die Funktionen ausführen sollen.
- Beende deine Funktion mit einer Return-Anweisung, wenn die Funktion etwas ausgeben soll. Ohne die Return-Anweisung gibt deine Funktion ein Objekt
None
zurück.
Natürlich werden deine Funktionen im Laufe der Zeit immer komplexer: Du kannst for-Schleifen, Flusskontrolle und vieles mehr hinzufügen, um sie noch feiner zu gestalten:
def hello():
name = str(input("Enter your name: "))
if name:
print ("Hello " + str(name))
else:
print("Hello World")
return
hello()
In der obigen Funktion forderst du den Benutzer auf, einen Namen anzugeben. Wenn kein Name angegeben wird, gibt die Funktion "Hello World" aus. Andernfalls erhält der Nutzer eine personalisierte "Hallo"-Antwort.
Denke auch daran, dass du einen oder mehrere Funktionsparameter für deine UDF definieren kannst. Mehr darüber erfährst du, wenn du den Abschnitt Funktionsargumente behandelst. Außerdem kannst du einen oder mehrere Werte als Ergebnis deiner Funktion zurückgeben oder nicht.
Python von Grund auf lernen
Die return
Erklärung
Da du etwas in deiner UDF hello()
ausdruckst, musst du es nicht unbedingt zurückgeben. Es gibt keinen Unterschied zwischen der obigen Funktion und dieser hier:
Wenn du jedoch mit dem Ergebnis deiner Funktion weiterarbeiten und einige Operationen damit ausprobieren möchtest, musst du die Anweisung return
verwenden, um tatsächlich einen Wert zurückzugeben, z. B. einen String, eine ganze Zahl, .... Betrachte das folgende Szenario, in dem hello()
einen String "hello"
zurückgibt, während die Funktion hello_noreturn()
None
zurückgibt:
Bei der zweiten Funktion bekommst du einen Fehler, weil du keine Operationen mit None
durchführen kannst. Du bekommst eine TypeError
, die besagt, dass du die Multiplikationsoperation für NoneType
(das None
, das das Ergebnis von hello_noreturn()
ist) und int
(2
) nicht durchführen kannst.
Tip-Funktionen werden sofort beendet, wenn sie auf eine return
Anweisung stoßen, auch wenn das bedeutet, dass sie keinen Wert zurückgeben:
Ein weiterer erwähnenswerter Aspekt bei der Arbeit mit der return
Anweisung ist die Tatsache, dass du damit mehrere Werte zurückgeben kannst. Dazu verwendest du Tupel.
Denke daran, dass diese Datenstruktur der einer Liste sehr ähnlich ist: Sie kann mehrere Werte enthalten. Tupel sind jedoch unveränderlich, was bedeutet, dass du die darin gespeicherten Beträge nicht ändern kannst! Du konstruierst sie mit Hilfe der doppelten Klammern ()
. Du kannst Tupel mit Hilfe des Kommas und des Zuweisungsoperators in mehrere Variablen entpacken.
Schau dir das folgende Beispiel an, um zu verstehen, wie deine Funktion mehrere Werte zurückgeben kann:
Beachte, dass die Anweisung return
return sum, a
das gleiche Ergebnis wie return (sum, a)
hätte: Erstere packt sum
und a
tatsächlich in ein Tupel unter der Haube!
Wie man eine Funktion aufruft
In den vorherigen Abschnitten hast du bereits viele Beispiele gesehen, wie du eine Funktion aufrufen kannst. Der Aufruf einer Funktion bedeutet, dass du die von dir definierte Funktion ausführst - entweder direkt in der Python-Eingabeaufforderung oder über eine andere Funktion (wie du im Abschnitt "Verschachtelte Funktionen" sehen wirst).
Rufe deine neu definierte Funktion hello()
auf, indem du einfach hello()
ausführst, genau wie in dem DataCamp Light Chunk unten:
Wie man Docstrings zu einer Python-Funktion hinzufügt
Ein weiterer wichtiger Aspekt beim Schreiben von Funktionen in Python: Docstrings. Docstrings beschreiben, was deine Funktion tut, z. B. die Berechnungen, die sie durchführt, oder ihre Rückgabewerte. Diese Beschreibungen dienen als Dokumentation für deine Funktion, so dass jeder, der den Docstring deiner Funktion liest, versteht, was deine Funktion tut, ohne den gesamten Code in der Funktionsdefinition durchgehen zu müssen.
Funktions-Docstrings stehen in der unmittelbaren Zeile nach dem Funktionskopf und werden zwischen dreifachen Anführungszeichen platziert. Ein geeigneter Docstring für deine hello()
Funktion ist 'Druckt "Hallo Welt"'.
def hello():
"""Prints "Hello World".
Returns:
None
"""
print("Hello World")
return
Beachte, dass Docstrings länger sein können als der hier als Beispiel angegebene. Wenn du dich eingehender mit docstrings beschäftigen möchtest, solltest du dir einige Github-Repositories von Python-Bibliotheken wie scikit-learn oder pandas ansehen, wo du viele Beispiele findest!
Funktionsargumente in Python
Vorhin hast du den Unterschied zwischen Parametern und Argumenten kennengelernt. Kurz gesagt, sind Argumente die Dinge, die einem Funktions- oder Methodenaufruf übergeben werden, während sich der Funktions- oder Methodencode auf die Argumente durch ihre Parameternamen bezieht. Es gibt vier Arten von Argumenten, die Python UDFs annehmen können:
- Standard-Argumente
- Erforderliche Argumente
- Schlüsselwort-Argumente
- Variable Anzahl von Argumenten
Standard-Argumente
Standardargumente sind diejenigen, die einen Standardwert annehmen, wenn während des Funktionsaufrufs kein Argumentwert übergeben wird. Du kannst diesen Standardwert mit dem Zuweisungsoperator =
zuweisen, so wie im folgenden Beispiel:
Erforderliche Argumente
Wie der Name schon verrät, sind die erforderlichen Argumente einer UDF diejenigen, die dort enthalten sein müssen. Diese Argumente müssen während des Funktionsaufrufs und in genau der richtigen Reihenfolge übergeben werden, so wie im folgenden Beispiel:
Du brauchst Argumente, die sowohl den a
als auch den b
Parametern entsprechen, um die Funktion ohne Fehler aufrufen zu können. Wenn du a
und b
vertauschst, wird das Ergebnis nicht anders ausfallen, aber vielleicht schon, wenn du plus()
wie folgt änderst:
Schlüsselwort-Argumente
Wenn du sicherstellen willst, dass du alle Parameter in der richtigen Reihenfolge aufrufst, kannst du das Schlüsselwort arguments in deinem Funktionsaufruf verwenden. Du verwendest diese, um die Argumente durch ihren Parameternamen zu identifizieren. Nehmen wir das Beispiel von oben, um das etwas zu verdeutlichen:
Beachte, dass du mit den Schlüsselwörtern Argumente auch die Reihenfolge der Parameter vertauschen kannst und trotzdem das gleiche Ergebnis erhältst, wenn du deine Funktion ausführst:
Variable Anzahl von Argumenten
In Fällen, in denen du die genaue Anzahl der Argumente, die du einer Funktion übergeben willst, nicht kennst, kannst du die folgende Syntax mit *args
verwenden:
Das Sternchen (*
) wird vor den Variablennamen gesetzt, der die Werte aller Nicht-Schlüsselwort-Variablenargumente enthält. Beachte hier, dass du genauso gut *varint
, *var_int_args
oder einen anderen Namen an die Funktion plus()
hättest übergeben können.
Tipp: Versuche, *args
durch einen anderen Namen zu ersetzen, der das Sternchen enthält. Du wirst sehen, dass der obige Code weiterhin funktioniert!
Du siehst, dass die obige Funktion die eingebaute Python-Funktion sum()
nutzt, um alle Argumente zu summieren, die an plus()
übergeben werden. Wenn du dies vermeiden und die Funktion komplett selbst erstellen möchtest, kannst du diese Alternative verwenden:
Globale vs. lokale Variablen
Im Allgemeinen haben Variablen, die innerhalb eines Funktionskörpers definiert sind, einen lokalen Geltungsbereich, während Variablen, die außerhalb definiert sind, einen globalen Geltungsbereich haben. Das bedeutet, dass lokale Variablen innerhalb eines Funktionsblocks definiert sind und nur innerhalb dieser Funktion aufgerufen werden können, während globale Variablen von allen Funktionen in deinem Skript aufgerufen werden können:
Du wirst sehen, dass du eine NameError
bekommst, die besagt, dass die name 'total' is not defined
, wenn du versuchst, die lokale Variable total
auszudrucken, die innerhalb des Funktionskörpers definiert wurde. Die Variable init
hingegen kann problemlos ausgedruckt werden.
Anonyme Funktionen in Python
Anonyme Funktionen werden in Python auch Lambda-Funktionen genannt, denn anstatt sie mit dem Standardschlüsselwort def
zu deklarieren, verwendest du das Schlüsselwort lambda
.
In dem obigen DataCamp Light Chunk ist lambda x: x*2
die anonyme oder Lambda-Funktion. x
ist das Argument und x*2
ist der Ausdruck oder die Anweisung, die ausgewertet und zurückgegeben wird. Das Besondere an dieser Funktion ist, dass sie keinen Namen hat, wie die Beispiele, die du im ersten Teil dieses Funktions-Tutorials gesehen hast. Wenn du die obige Funktion in eine UDF schreiben müsstest, würde das Ergebnis folgendermaßen aussehen:
def double(x):
return x*2
Betrachten wir ein weiteres Beispiel für eine Lambda-Funktion, bei der du mit zwei Argumenten arbeitest:
Du verwendest anonyme Funktionen, wenn du für einen kurzen Zeitraum eine namenlose Funktion benötigst, die zur Laufzeit erstellt wird. In bestimmten Kontexten ist dies relevant, wenn du mit filter()
, map()
und reduce()
arbeitest:
Die Funktion filter()
filtert, wie der Name schon sagt, die ursprüngliche Eingabeliste my_list
auf der Grundlage eines Kriteriums >10
. Mit map()
wendest du dagegen eine Funktion auf alle Elemente der Liste my_list
an. In diesem Fall multiplizierst du alle Elemente mit 2
.
Beachte, dass die Funktion reduce()
Teil der Bibliothek functools
ist. Du wendest diese Funktion kumulativ auf die Elemente der Liste my_list
an, von links nach rechts, und reduzierst die Folge auf einen einzigen Wert, in diesem Fall 55
.
Mit main()
als Funktion
Wenn du Erfahrung mit anderen Programmiersprachen wie Java hast, wirst du wissen, dass die Funktion main
benötigt wird, um Funktionen auszuführen. Wie du in den Beispielen oben gesehen hast, ist das für Python nicht unbedingt nötig. Es kann jedoch praktisch sein, eine main()
Funktion in dein Python-Programm einzubauen, um deinen Code logisch zu strukturieren - alle wichtigen Komponenten sind in dieser main()
Funktion enthalten.
Du kannst ganz einfach eine main()
Funktion definieren und sie genauso aufrufen, wie du es mit allen anderen Funktionen oben getan hast:
So wie es jetzt aussieht, wird der Code deiner main()
Funktion jedoch aufgerufen, wenn du sie als Modul importierst. Damit das nicht passiert, rufst du die Funktion main()
auf, wenn du __name__ == '__main__'
aufrufst.
Das bedeutet, dass der Code des obigen Codeabschnitts zu:
Beachte, dass du neben der Funktion __main__
auch eine Funktion __init__
hast, die eine Instanz einer Klasse oder eines Objekts initialisiert. Einfach gesagt, fungiert er als Konstruktor oder Initialisierer und wird automatisch aufgerufen, wenn du eine neue Instanz einer Klasse erstellst. Mit dieser Funktion wird das neu erstellte Objekt dem Parameter self zugewiesen, den du weiter oben in diesem Lernprogramm gesehen hast. Sieh dir das folgende Beispiel an:
class Dog:
"""
Requires:
legs - Legs so that the dog can walk.
color - A color of the fur.
"""
def __init__(self, legs, color):
self.legs = legs
self.color = color
def bark(self):
bark = "bark" * 2
return bark
if __name__ == "__main__":
dog = Dog(4, "brown")
bark = dog.bark()
print(bark)
Willst du weiter üben?
Herzlichen Glückwunsch! Du hast es durch dieses kurze Tutorial über Funktionen in Python geschafft. Wenn du weitere Grundlagen der Python-Programmierung auffrischen möchtest, solltest du dir den Kurs Datentypen für die Datenwissenschaft nicht entgehen lassen, in dem du dein Wissen über Listen, Wörterbücher, Tupel, Mengen und Datumsangaben festigen und üben kannst.
Lass dich für deine Traumrolle als Data Scientist zertifizieren
Unsere Zertifizierungsprogramme helfen dir, dich von anderen abzuheben und potenziellen Arbeitgebern zu beweisen, dass deine Fähigkeiten für den Job geeignet sind.
Erfahre mehr über Python
Course
Effizienten Python-Code schreiben
Course