Rheinwerk Computing < openbook >

 
Inhaltsverzeichnis
1 Einleitung
2 Die Programmiersprache Python
Teil I Einstieg in Python
3 Erste Schritte im interaktiven Modus
4 Der Weg zum ersten Programm
5 Kontrollstrukturen
6 Dateien
7 Das Laufzeitmodell
8 Funktionen, Methoden und Attribute
9 Informationsquellen zu Python
Teil II Datentypen
10 Das Nichts – NoneType
11 Operatoren
12 Numerische Datentypen
13 Sequenzielle Datentypen
14 Zuordnungen
15 Mengen
16 Collections
17 Datum und Zeit
18 Aufzählungstypen – Enum
Teil III Fortgeschrittene Programmiertechniken
19 Funktionen
20 Modularisierung
21 Objektorientierung
22 Ausnahmebehandlung
23 Iteratoren
24 Kontextobjekte
25 Manipulation von Funktionen und Methoden
Teil IV Die Standardbibliothek
26 Mathematik
27 Kryptografie
28 Reguläre Ausdrücke
29 Schnittstelle zu Betriebssystem und Laufzeitumgebung
30 Kommandozeilenparameter
31 Dateisystem
32 Parallele Programmierung
33 Datenspeicherung
34 Netzwerkkommunikation
35 Debugging und Qualitätssicherung
36 Dokumentation
Teil V Weiterführende Themen
37 Anbindung an andere Programmiersprachen
38 Distribution von Python-Projekten
39 Grafische Benutzeroberflächen
40 Python als serverseitige Programmiersprache im WWW – ein Einstieg in Django
41 Wissenschaftliches Rechnen
42 Insiderwissen
43 Von Python 2 nach Python 3
A Anhang
Stichwortverzeichnis

Download:
- Beispielprogramme, ca. 464 KB

Jetzt Buch bestellen
Ihre Meinung?

Spacer
<< zurück
Python 3 von Johannes Ernesti, Peter Kaiser
Das umfassende Handbuch
Buch: Python 3

Python 3
Pfeil 19 Funktionen
Pfeil 19.1 Schreiben einer Funktion
Pfeil 19.2 Funktionsobjekte
Pfeil 19.3 Funktionsparameter
Pfeil 19.3.1 Optionale Parameter
Pfeil 19.3.2 Schlüsselwortparameter
Pfeil 19.3.3 Beliebige Anzahl von Parametern
Pfeil 19.3.4 Reine Schlüsselwortparameter
Pfeil 19.3.5 Entpacken einer Parameterliste
Pfeil 19.3.6 Seiteneffekte
Pfeil 19.4 Namensräume
Pfeil 19.4.1 Zugriff auf globale Variablen – global
Pfeil 19.4.2 Zugriff auf den globalen Namensraum
Pfeil 19.4.3 Lokale Funktionen
Pfeil 19.4.4 Zugriff auf übergeordnete Namensräume – nonlocal
Pfeil 19.5 Anonyme Funktionen
Pfeil 19.6 Annotationen
Pfeil 19.7 Rekursion
Pfeil 19.8 Eingebaute Funktionen
Pfeil 19.8.1 abs(x)
Pfeil 19.8.2 all(iterable)
Pfeil 19.8.3 any(iterable)
Pfeil 19.8.4 ascii(object)
Pfeil 19.8.5 bin(x)
Pfeil 19.8.6 bool([x])
Pfeil 19.8.7 bytearray([source, encoding, errors])
Pfeil 19.8.8 bytes([source, encoding, errors])
Pfeil 19.8.9 chr(i)
Pfeil 19.8.10 complex([real, imag])
Pfeil 19.8.11 dict([source])
Pfeil 19.8.12 divmod(a, b)
Pfeil 19.8.13 enumerate(iterable)
Pfeil 19.8.14 eval(expression, [globals, locals])
Pfeil 19.8.15 exec(object, [globals, locals])
Pfeil 19.8.16 filter(function, iterable)
Pfeil 19.8.17 float([x])
Pfeil 19.8.18 format(value, [format_spec])
Pfeil 19.8.19 frozenset([iterable])
Pfeil 19.8.20 globals()
Pfeil 19.8.21 hash(object)
Pfeil 19.8.22 help([object])
Pfeil 19.8.23 hex(x)
Pfeil 19.8.24 id(object)
Pfeil 19.8.25 input([prompt])
Pfeil 19.8.26 int([x, base])
Pfeil 19.8.27 len(s)
Pfeil 19.8.28 list([sequence])
Pfeil 19.8.29 locals()
Pfeil 19.8.30 map(function, [*iterable])
Pfeil 19.8.31 max(iterable, {default, key}), max(arg1, arg2, [*args], {key})
Pfeil 19.8.32 min(iterable, {default, key}), min(arg1, arg2, [*args], {key})
Pfeil 19.8.33 oct(x)
Pfeil 19.8.34 ord(c)
Pfeil 19.8.35 pow(x, y, [z])
Pfeil 19.8.36 print([*objects], {sep, end, file, flush})
Pfeil 19.8.37 range([start], stop, [step])
Pfeil 19.8.38 repr(object)
Pfeil 19.8.39 reversed(sequence)
Pfeil 19.8.40 round(x, [n])
Pfeil 19.8.41 set([iterable])
Pfeil 19.8.42 sorted(iterable, [key, reverse])
Pfeil 19.8.43 str([object, encoding, errors])
Pfeil 19.8.44 sum(iterable, [start])
Pfeil 19.8.45 tuple([iterable])
Pfeil 19.8.46 type(object)
Pfeil 19.8.47 zip([*iterables])
 
Zum Seitenanfang

19    Funktionen Zur vorigen ÜberschriftZur nächsten Überschrift

Aus der Mathematik kennen Sie den Begriff der Funktion, mit dem eine Zuordnungsvorschrift bezeichnet wird. Die Funktion ƒ(x)=x2 ordnet beispielsweise dem Parameter x sein Quadriertes zu. Eine Funktion im mathematischen Sinne besteht aus einem Namen, einer Liste von Parametern und einer Berechnungsvorschrift für den Funktionswert.

In der Programmierung findet sich das mathematische Konzept der Funktion wieder. Wir haben beispielsweise bereits die eingebaute Funktion len besprochen, die die Länge eines iterierbaren Objekts berechnet. Dazu bekommt sie das entsprechende Objekt als Argument übergeben und gibt das Ergebnis in Form eines Rückgabewertes zurück.

>>> len("Dieser String ist ein Argument")
30

Offensichtlich besteht hier eine gewisse Analogie zum mathematischen Begriff der Funktion. Eine Funktion in der Programmierung besteht aus einem Funktionsnamen, einer Liste von Funktionsparametern und einem Code-Block, dem Funktionskörper. Bei einem Funktionsaufruf wird dann der Funktionskörper unter Berücksichtigung der übergebenen Argumente ausgeführt. Eine Funktion in Python kann, wie len, einen Rückgabewert haben oder nicht.[ 62 ](In Python wird – anders als beispielsweise in PASCAL – nicht zwischen den Begriffen Funktion und Prozedur unterschieden. Unter einer Prozedur versteht man eine Funktion, die keinen Rückgabewert hat. )

Funktionen werden in der Programmierung dazu eingesetzt, um Redundanzen im Quellcode zu vermeiden. Das bedeutet, dass Code-Stücke, die in der gleichen oder einer ähnlichen Form öfter im Programm benötigt werden, nicht jedes Mal neu geschrieben, sondern in einer Funktion gekapselt werden. Diese Funktion kann dann an den Stellen, an denen sie benötigt wird, aufgerufen werden. Darüber hinaus bilden Funktionen ein elegantes Hilfsmittel, um einen langen Quellcode sinnvoll in Unterprogramme aufzuteilen. Das erhöht die Les- und Wartbarkeit des Codes.

Im Folgenden erläutern wir die Handhabung einer bestehenden Funktion am Beispiel von range. Vieles des hier Gesagten kennen Sie bereits aus Kapitel 8, »Funktionen, Methoden und Attribute«; wir möchten es an dieser Stelle trotzdem noch einmal wiederholen.

Die eingebaute Funktion range wurde in Abschnitt 5.2.6, »Die for-Schleife als Zählschleife« eingeführt und erzeugt ein iterierbares Objekt über eine begrenzte Anzahl fortlaufender ganzer Zahlen:

ergebnis = range(0, 10, 2)

Im Beispiel oben wurde range aufgerufen; man nennt dies den Funktionsaufruf. Dazu wird hinter den Namen der Funktion ein (möglicherweise leeres) Klammernpaar geschrieben. Innerhalb dieser Klammern stehen die Parameter der Funktion, durch Kommata getrennt. Wie viele es sind und welche Art von Parametern eine Funktion erwartet, hängt von der Definition der Funktion ab und ist sehr unterschiedlich. In diesem Fall benötigt range drei Parameter, um ausreichend Informationen zu erlangen. Die Gesamtheit der Parameter wird Funktionsschnittstelle genannt. Konkrete, über eine Schnittstelle übergebene Instanzen heißen Argumente. Ein Parameter hingegen bezeichnet einen Platzhalter für Argumente.

Nachdem die Funktion abgearbeitet wurde, wird ihr Ergebnis zurückgegeben. Sie können sich bildlich vorstellen, dass der Funktionsaufruf, wie er im Quelltext steht, durch den Rückgabewert ersetzt wird. Im Beispiel oben haben wir dem Rückgabewert von range direkt einen Namen zugewiesen und können fortan über ergebnis auf ihn zugreifen. So können wir beispielsweise in einer for-Schleife über das Ergebnis des range-Aufrufs iterieren:

>>> ergebnis = range(0, 10, 2)
>>> for i in ergebnis:
... print(i)
...
0
2
4
6
8

Es ist auch möglich, das Ergebnis des range-Aufrufs mit list in eine Liste zu überführen:

>>> liste = list(ergebnis)
>>> liste
[0, 2, 4, 6, 8]
>>> liste[3]
6

So viel vorerst zur Verwendung vordefinierter Funktionen. Python erlaubt es Ihnen, eigene Funktionen zu schreiben, die Sie nach demselben Schema verwenden können, wie es hier beschrieben wurde. Im nächsten Abschnitt werden wir uns damit befassen, wie Sie eine eigene Funktion erstellen.

 
Zum Seitenanfang

19.1    Schreiben einer Funktion Zur vorigen ÜberschriftZur nächsten Überschrift

Bevor wir uns an konkreten Quelltext wagen, möchten wir rekapitulieren, was eine Funktion ausmacht, was also bei der Definition einer Funktion anzugeben ist:

  • Eine Funktion muss einen Namen haben, über den sie in anderen Teilen des Programms aufgerufen werden kann. Die Zusammensetzung des Funktionsnamens erfolgt nach denselben Regeln wie die Namensgebung einer Referenz.[ 63 ](Das bedeutet, dass sich der Funktionsname aus großen und kleinen Buchstaben, Zahlen sowie dem Unterstrich (»_«) zusammensetzen, allerdings nicht mit einer Zahl beginnen darf. Seit Python 3.0 dürfen auch Buchstaben verwendet werden, die nicht im englischen Alphabet enthalten sind. )
  • Eine Funktion muss eine Schnittstelle haben, über die Informationen vom aufrufenden Programmteil in den Kontext der Funktion übertragen werden. Eine Schnittstelle kann aus beliebig vielen (unter Umständen auch keinen) Parametern bestehen. Funktionsintern wird jedem dieser Parameter ein Name gegeben. Sie lassen sich dann wie Referenzen im Funktionskörper verwenden.
  • Eine Funktion muss einen Wert zurückgeben. Jede Funktion gibt automatisch None zurück, wenn der Rückgabewert nicht ausdrücklich angegeben wurde.

Zur Definition einer Funktion wird in Python das Schlüsselwort def verwendet. Syntaktisch sieht die Definition folgendermaßen aus:

Definition einer Funktion

Abbildung 19.1    Definition einer Funktion

Nach dem Schlüsselwort def steht der gewählte Funktionsname. Dahinter werden in einem Klammernpaar die Namen aller Parameter aufgelistet. Nach der Definition der Schnittstelle folgen ein Doppelpunkt und, eine Stufe weiter eingerückt, der Funktionskörper. Bei dem Funktionskörper handelt es sich um einen beliebigen Code-Block, in dem die Parameternamen als Referenzen verwendet werden dürfen. Im Funktionskörper dürfen auch wieder Funktionen aufgerufen werden.

Betrachten wir einmal die konkrete Implementierung einer Funktion, die die Fakultät einer ganzen Zahl berechnet und das Ergebnis auf dem Bildschirm ausgibt:

def fak(zahl):
ergebnis = 1
for i in range(2, zahl+1):
ergebnis *= i
print(ergebnis)

Anhand dieses Beispiels können Sie gut nachvollziehen, wie der Parameter zahl im Funktionskörper verarbeitet wird. Nachdem die Berechnung erfolgt ist, wird ergebnis mittels print ausgegeben. Die Referenz zahl ist nur innerhalb des Funktionskörpers definiert und hat nichts mit anderen Referenzen außerhalb der Funktion zu tun.

Wenn Sie das obige Beispiel jetzt speichern und ausführen, werden Sie feststellen, dass zwar keine Fehlermeldung angezeigt wird, aber auch sonst nichts passiert. Nun, das liegt daran, dass wir bisher nur eine Funktion definiert haben. Um sie konkret im Einsatz zu sehen, müssen wir sie mindestens einmal aufrufen. Folgendes Programm liest in einer Schleife Zahlen vom Benutzer ein und berechnet deren Fakultät mithilfe der soeben definierten Funktion:

def fak(zahl):
ergebnis = 1
for i in range(2, zahl+1):
ergebnis *= i
print(ergebnis)

while True:
eingabe = int(input("Geben Sie eine Zahl ein: "))
fak(eingabe)

Sie sehen, dass der Quellcode in zwei Komponenten aufgeteilt wurde: zum einen in die Funktionsdefinition oben und zum anderen in das auszuführende Hauptprogramm unten. Das Hauptprogramm besteht aus einer Endlosschleife, in der die Funktion fak mit der eingegebenen Zahl als Parameter aufgerufen wird.

Betrachten Sie noch einmal die beiden Komponenten des Programms. Es wäre im Sinne der Kapselung der Funktionalität erstrebenswert, das Programm so zu ändern, dass sich das Hauptprogramm allein um die Interaktion mit dem Benutzer und das Anstoßen der Berechnung kümmert, während das Unterprogramm fak die Berechnung tatsächlich durchführt. Das Ziel dieses Ansatzes ist es vor allem, dass die Funktion fak auch in anderen Programmteilen zur Berechnung einer weiteren Fakultät aufgerufen werden kann. Dazu ist es unerlässlich, dass fak sich ausschließlich um die Berechnung kümmert. Es passt nicht in dieses Konzept, dass fak das Ergebnis der Berechnung selbst ausgibt.

Idealerweise sollte unsere Funktion fak die Berechnung abschließen und das Ergebnis an das Hauptprogramm zurückgeben, sodass die Ausgabe dort erfolgen kann. Dies erreichen Sie durch das Schlüsselwort return, das die Ausführung der Funktion sofort beendet und einen eventuell angegebenen Rückgabewert zurückgibt.

def fak(zahl):
ergebnis = 1
for i in range(2, zahl+1):
ergebnis *= i
return ergebnis

while True:
eingabe = int(input("Geben Sie eine Zahl ein: "))
print(fak(eingabe))

Eine Funktion kann zu jeder Zeit im Funktionsablauf mit return beendet werden. Die folgende Version der Funktion prüft vor der Berechnung, ob es sich bei dem übergebenen Parameter um eine negative Zahl handelt. Ist das der Fall, wird die Abhandlung der Funktion abgebrochen:

def fak(zahl):
if zahl < 0:
return None
ergebnis = 1
for i in range(2, zahl+1):
ergebnis *= i
return ergebnis

while True:
eingabe = int(input("Geben Sie eine Zahl ein: "))
ergebnis = fak(eingabe)
if ergebnis is None:
print("Fehler bei der Berechnung")
else:
print(ergebnis)

In der zweiten Zeile des Funktionskörpers wurde mit return None explizit der Wert None zurückgegeben, was nicht unbedingt nötig ist. Der folgende Code ist äquivalent:

if zahl < 0:
return

Vom Programmablauf her ist es egal, ob Sie None explizit oder implizit zurückgeben. Aus Gründen der Lesbarkeit ist return None in diesem Fall trotzdem sinnvoll, denn es handelt sich um einen ausdrücklich gewünschten Rückgabewert. Er ist Teil der Funktionslogik und nicht bloß ein Nebenprodukt des Funktionsabbruchs.

Die Funktion fak, wie sie in diesem Beispiel zu sehen ist, kann zu jeder Zeit zur Berechnung einer Fakultät aufgerufen werden, unabhängig davon, in welchem Kontext diese Fakultät benötigt wird.

Selbstverständlich können Sie in Ihrem Quelltext mehrere eigene Funktionen definieren und aufrufen. Das folgende Beispiel soll bei Eingabe einer negativen Zahl keine Fehlermeldung, sondern die Fakultät des Betrags dieser Zahl ausgeben:

def betrag(zahl):
if zahl < 0:
return -zahl
else:
return zahl

def fak(zahl):
ergebnis = 1
for i in range(2, zahl+1):
ergebnis *= i
return ergebnis

while True:
eingabe = int(input("Geben Sie eine Zahl ein: "))
print(fak(betrag(eingabe)))

Für die Berechnung des Betrags einer Zahl gibt es in Python auch die Built-in Function abs. Diese werden Sie noch in diesem Kapitel kennenlernen.

 


Ihre Meinung

Wie hat Ihnen das Openbook gefallen? Wir freuen uns immer über Ihre Rückmeldung. Schreiben Sie uns gerne Ihr Feedback als E-Mail an kommunikation@rheinwerk-verlag.de.

<< zurück
 Zum Rheinwerk-Shop
Zum Rheinwerk-Shop: Python 3 Python 3
Jetzt Buch bestellen

 Buchempfehlungen
Zum Rheinwerk-Shop: Einstieg in Python
Einstieg in Python


Zum Rheinwerk-Shop: Python. Der Grundkurs
Python. Der Grundkurs


Zum Rheinwerk-Shop: Algorithmen mit Python
Algorithmen mit Python


Zum Rheinwerk-Shop: Objektorientierte Programmierung
Objektorientierte Programmierung


Zum Rheinwerk-Shop: Raspberry Pi. Das umfassende Handbuch
Raspberry Pi. Das umfassende Handbuch


Zum Rheinwerk-Shop: Roboter-Autos mit dem Raspberry Pi
Roboter-Autos mit dem Raspberry Pi


Zum Rheinwerk-Shop: Neuronale Netze programmieren mit Python
Neuronale Netze programmieren mit Python


 Lieferung
Versandkostenfrei bestellen in Deutschland, Österreich und der Schweiz
InfoInfo

 
 


Copyright © Rheinwerk Verlag GmbH 2020
Für Ihren privaten Gebrauch dürfen Sie die Online-Version natürlich ausdrucken. Ansonsten unterliegt das Openbook denselben Bestimmungen, wie die gebundene Ausgabe: Das Werk einschließlich aller seiner Teile ist urheberrechtlich geschützt.
Alle Rechte vorbehalten einschließlich der Vervielfältigung, Übersetzung, Mikroverfilmung sowie Einspeicherung und Verarbeitung in elektronischen Systemen.

 
[Rheinwerk Computing]

Rheinwerk Verlag GmbH, Rheinwerkallee 4, 53227 Bonn, Tel.: 0228.42150.0, Fax 0228.42150.77, service@rheinwerk-verlag.de

Cookie-Einstellungen ändern