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.4    Namensräume Zur vorigen ÜberschriftZur nächsten Überschrift

Bisher wurde ein Funktionskörper als abgekapselter Bereich betrachtet, der ausschließlich über Parameter bzw. den Rückgabewert Informationen mit dem Hauptprogramm austauschen kann. Das ist zunächst auch gar keine schlechte Sichtweise, denn so hält man seine Schnittstelle »sauber«. In manchen Situationen ist es aber sinnvoll, eine Funktion über ihren lokalen Namensraum hinaus wirken zu lassen, was in diesem Kapitel thematisiert werden soll.

 
Zum Seitenanfang

19.4.1    Zugriff auf globale Variablen – global Zur vorigen ÜberschriftZur nächsten Überschrift

Zunächst einmal müssen zwei Begriffe unterschieden werden. Wenn wir uns im Kontext einer Funktion, also im Funktionskörper, befinden, dann können wir dort selbstverständlich Referenzen und Instanzen erzeugen und verwenden. Diese haben jedoch nur unmittelbar in der Funktion selbst Gültigkeit. Sie existieren im lokalen Namensraum. Im Gegensatz dazu existieren Referenzen des Hauptprogramms im globalen Namensraum. Begrifflich wird auch zwischen globalen Referenzen und lokalen Referenzen unterschieden. Dazu folgendes Beispiel:

def f():
a = "lokaler String"
b = "globaler String"

Die Unterscheidung zwischen globalem und lokalem Namensraum wird anhand des folgenden Beispiels deutlich:

>>> def f(a):
... print(a)
>>> a = 10
>>> f(100)
100

In diesem Beispiel existiert sowohl im globalen als auch im lokalen Namensraum eine Referenz namens a. Im globalen Namensraum referenziert sie die ganze Zahl 10 und im lokalen Namensraum der Funktion den übergebenen Parameter, in diesem Fall die ganze Zahl 100. Es ist wichtig zu verstehen, dass diese beiden Referenzen nichts miteinander zu tun haben, da sie in verschiedenen Namensräumen existieren. Abbildung 19.2 fasst das Konzept der Namensräume zusammen.

Abgrenzung lokaler Namensräume vom globalen Namensraum anhand eines Beispiels

Abbildung 19.2    Abgrenzung lokaler Namensräume vom globalen Namensraum anhand eines Beispiels

 
Zum Seitenanfang

19.4.2    Zugriff auf den globalen Namensraum Zur vorigen ÜberschriftZur nächsten Überschrift

Im lokalen Namensraum eines Funktionskörpers kann jederzeit lesend auf eine globale Referenz zugegriffen werden, solange keine lokale Referenz gleichen Namens existiert:

>>> def f():
... print(s)
...
>>> s = "globaler String"
>>> f()
globaler String

Sobald versucht wird, schreibend auf eine globale Referenz zuzugreifen, wird stattdessen eine entsprechende lokale Referenz erzeugt:

>>> def f():
... print(s)
...
>>> s = "globaler String"
>>> f()
lokaler String
>>> s
'lokaler String'

Eine Funktion kann dennoch mithilfe der global-Anweisung schreibend auf eine globale Referenz zugreifen. Dazu muss im Funktionskörper das Schlüsselwort global geschrieben werden, gefolgt von einer oder mehreren globalen Referenzen:

>>> def f():
... global s
... s = "lokaler String"
... print(s)
...
>>> s = "globaler String"
>>> f()
lokaler String
>>> s
'globaler String'

Im Funktionskörper von f wird s explizit als globale Referenz gekennzeichnet und kann fortan als solche verwendet werden.

 
Zum Seitenanfang

19.4.3    Lokale Funktionen Zur vorigen ÜberschriftZur nächsten Überschrift

Es ist möglich, lokale Funktionen zu definieren. Das sind Funktionen, die im lokalen Namensraum einer anderen Funktion angelegt werden und nur dort gültig sind. Das folgende Beispiel zeigt eine solche Funktion:

>>> def globale_funktion(n):
... def lokale_funktion(n):
... return n**2
... return lokale_funktion(n)
...
>>> globale_funktion(2)
4

Innerhalb der globalen Funktion globale_funktion wurde eine lokale Funktion namens lokale_funktion definiert. Beachten Sie, dass der jeweilige Parameter n trotz des gleichen Namens nicht zwangsläufig denselben Wert referenziert. Die lokale Funktion kann im Namensraum der globalen Funktion völlig selbstverständlich wie jede andere Funktion auch aufgerufen werden.

Da sie einen eigenen Namensraum besitzt, hat die lokale Funktion keinen Zugriff auf lokale Referenzen der globalen Funktion. Um dennoch einige ausgewählte Referenzen an die lokale Funktion durchzuschleusen, bedient man sich eines Tricks mit vorbelegten Funktionsparametern:

>>> def globale_funktion(n):
... def lokale_funktion(n=n):
... return n**2
... return lokale_funktion()
...
>>> globale_funktion(2)
4

Wie Sie sehen, muss der lokalen Funktion der Parameter n beim Aufruf nicht mehr explizit übergeben werden. Er wird vielmehr implizit in Form eines vorbelegten Parameters übergeben.

 
Zum Seitenanfang

19.4.4    Zugriff auf übergeordnete Namensräume – nonlocal Zur vorigen ÜberschriftZur nächsten Überschrift

Im letzten Abschnitt haben wir von den zwei existierenden Namensräumen, dem globalen und dem lokalen, gesprochen. Diese Unterteilung ist richtig, unterschlägt aber einen interessanten Fall, denn laut Abschnitt 19.3.3, »Beliebige Anzahl von Parametern«, dürfen auch lokale Funktionen innerhalb von Funktionen definiert werden. Lokale Funktionen bringen natürlich wieder ihren eigenen lokalen Namensraum im lokalen Namensraum der übergeordneten Funktion mit. Bei verschachtelten Funktionsdefinitionen kann man die Welt der Namensräume also nicht in eine lokale und eine globale Ebene unterteilen. Dennoch stellt sich auch hier die Frage, wie eine lokale Funktion auf Referenzen zugreifen kann, die im lokalen Namensraum der übergeordneten Funktion liegen.

Das Schlüsselwort global hilft dabei nicht weiter, denn es erlaubt nur den Zugriff auf den äußersten, globalen Namensraum. Für diesen Zweck existiert seit Python 3.0 das Schlüsselwort nonlocal. Betrachten wir dazu einmal folgendes Beispiel:

>>> def funktion1():
... def funktion2():
... nonlocal res
... res += 1
... res = 1
... funktion2()
... print(res)
...
>>> funktion1()
2

Innerhalb der Funktion funktion1 wurde eine lokale Funktion funktion2 definiert, die die Referenz res aus dem lokalen Namensraum von funktion1 inkrementieren soll. Dazu muss res innerhalb von funktion2 als nonlocal gekennzeichnet werden. Die Schreibweise lehnt sich an den Zugriff auf Referenzen aus dem globalen Namensraum via global an.

Nachdem funktion2 definiert wurde, wird res im lokalen Namensraum von funktion1 definiert und mit dem Wert 1 verknüpft. Schließlich wird die lokale Funktion funktion2 aufgerufen und der Wert von res ausgegeben. Im Beispiel gibt funktion1 den Wert 2 aus.

Das Schlüsselwort nonlocal lässt sich auch bei mehreren, ineinander verschachtelten Funktionen verwenden, wie folgende Erweiterung unseres Beispiels zeigt:

>>> def funktion1():
... def funktion2():
... def funktion3():
... nonlocal res
... res += 1
... nonlocal res
... funktion3()
... res += 1
... res = 1
... funktion2()
... print(res)
...
>>> funktion1()
3

Nun wurde eine zusätzliche lokale Funktion im lokalen Namensraum von funktion2 definiert. Auch aus dem lokalen Namensraum von funktion3 heraus lässt sich res mithilfe von nonlocal inkrementieren. Die Funktion funktion1 gibt in diesem Beispiel den Wert 3 aus.

Allgemein funktioniert nonlocal bei tieferen Funktionsverschachtelungen so, dass es in der Hierarchie der Namensräume aufsteigt und die erste Referenz mit dem angegebenen Namen in den Namensraum des nonlocal-Schlüsselworts einbindet.

 


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