Zahlen - EDV-Buchversand

Werbung
First
Kapitel 4
KAPITEL 4
Zahlen
Mit diesem Kapitel beginnt unsere Reise durch Python. In Python existieren Daten in
Form von Objekten. Das sind entweder bereits in Python eingebaute Objekte oder solche,
die wir selbst mit Hilfe von Python und C erstellen. Da Objekte das wichtigste Konzept in
der Python-Programmierung darstellen, beginnen wir dieses Kapitel mit einem Überblick
über die in Python eingebauten Objekttypen, bevor wir uns speziell den Zahlen widmen.
Python-Programmstruktur
Wir versuchen, als Einführung zuerst ein klares Bild davon zu vermitteln, wie das, was
Sie in diesem Kapitel lernen, in das Gesamtbild von Python passt. Konkreter: PythonProgramme können in Module, Anweisungen, Ausdrücke und Objekte zerlegt werden:
1. Programme bestehen aus Modulen.
2. Module enthalten Anweisungen.
3. Anweisungen enthalten Ausdrücke.
4. Ausdrücke bilden und verarbeiten Objekte.
Die oberste Ebene dieser Hierarchie haben wir im Zusammenhang mit Modulen in
Kapitel 3 eingeführt. Die Kapitel dieses Buchteils fangen von unten an und untersuchen
dabei sowohl eingebaute Objekte als auch die Ausdrücke, die Sie damit codieren können.
Warum eingebaute Typen benutzen?
Max.
Linie
Wenn Sie bereits mit Sprachen auf niedrigerem Niveau, wie C oder C++, gearbeitet
haben, wissen Sie, dass sich ein Großteil Ihrer Arbeit darauf konzentriert, Objekte zu
implementieren, die man oft auch als Datenstrukturen bezeichnet, um die relevanten
“
Max.
Linie
Links
Komponenten Ihres Anwendungsbereichs darzustellen. Sie müssen Speicherstrukturen
anlegen, Speicherzuordnungen verwalten, Such- und Zugangsroutinen implementieren
usw. Diese Routineaufgaben sind genauso langweilig (und fehleranfällig), wie sie klingen,
und lenken meistens von den eigentlichen Zielen Ihres Programms ab.
In typischen Python-Programmen verschwindet ein Großteil dieser lästigen Arbeit. Weil
Python über mächtige Objekttypen als wesentlichen Teil der Sprache verfügt, ist es nicht
notwendig, Objekt-Implementierungen zu erstellen, bevor Sie anfangen, Ihre Probleme
zu lösen. Sie sind wirklich besser bedient, wenn Sie die eingebauten Objekte benutzen,
anstatt Ihre eigenen zu implementieren, es sei denn, Sie brauchen eine spezielle Art von
Beaarbeitung, die die eingebauten Typen nicht bieten. Hier sind einige Gründe dafür:
Eingebaute Objekttypen machen es einfach, Programme zu schreiben. Für einfache Aufgaben sind eingebaute Typen oft alles, was Sie brauchen, um die Struktur eines Problems darzustellen. Weil Dinge wie Sammlungen (z.B. Listen) und Suchtabellen
(Dictionaries) bereits zur Verfügung stehen, können Sie sie sofort benutzen. Allein
mit diesen eingebauten Objekttypen können Sie eine Menge Arbeit erledigen.
Python stellt Objekttypen zur Verfügung und unterstützt Erweiterungen. In gewisser
Weise macht Python Anleihen sowohl bei Sprachen, die sich auf eingebaute Werkzeuge verlassen (z.B. LISP), als auch bei Sprachen, die sich auf den Programmierer
verlassen, der eigene Werkzeug-Implementierungen oder Frameworks liefert (z.B.
C++). Obwohl Sie in Python anwendungsspezifische Objekttypen implementieren
können, müssen Sie das am Anfang nicht unbedingt tun. Darüber hinaus sind
Pythons eingebaute Typen immer gleich, während Frameworks sich in der Regel
unterscheiden.
Eingebaute Objekttypen sind Komponenten von Erweiterungen. Für komplexere Aufgaben müssen Sie vielleicht doch mit Hilfe von Python-Anweisungen oder Schnittstellen zur Sprache C eigene Objekttypen erstellen. Aber wie Sie in den folgenden Teilen
sehen werden, basieren selbst implementierte Objekte oft auf eingebauten Typen wie
Listen und Dictionaries. Eine Stapel-Datenstruktur kann z.B. als eine Klasse implementiert werden, die intern ein Objekt vom eingebauten Typ Liste verwaltet.
Eingebaute Objekttypen sind oft effizienter als eigene Datenstrukturen. Die in Python
eingebauten Typen wenden bereits optimierte Datenstruktur-Algorithmen an, die
wegen der höheren Geschwindigkeit in C implementiert sind. Obwohl Sie selbst
ähnliche Objekttypen schreiben können, werden Sie normalerweise nur mit Mühe
die Performance von eingebauten Objekttypen erreichen können.
Mit anderen Worten: Eingebaute Objekttypen machen nicht nur das Programmieren einfacher, sie sind auch mächtiger und effizienter als fast alles, was von Grund auf neu
erstellt wird. Unabhängig davon, ob Sie neue Objekttypen implementieren oder nicht,
bilden die eingebauten Objekttypen den Kern eines jeden Python-Programms.
Max.
Linie
Max.
Linie
58 | Kapitel 4: Zahlen
“
Rechts
Tabelle 4-1 bietet eine Vorschau auf die eingebauten Objekttypen und ein wenig Syntax
für die Codierung ihrer Literale, d.h. der Ausdrücke, die Objekte generieren.1 Einige
davon werden Ihnen vermutlich bekannt vorkommen, wenn Sie schon mit anderen Sprachen gearbeitet haben. Zum Beispiel stellen Zahlen und Strings numerische Werte bzw.
Textwerte dar, und Dateien bieten eine Schnitttelle für die Bearbeitung von Dateien, die
auf Ihrem Rechner gespeichert sind.
Tabelle 4-1: Vorschau auf eingebaute Objekte
Objekttyp
Beispiel-Literale/-Erzeugung
Zahlen
3.1415, 1234, 999L, 3+4j
Strings
'spam', "guido's"
Listen
[1, [2, 'three'], 4]
Dictionaries
{'food': 'spam', 'taste': 'yum'}
Tupel
(1,'spam', 4, 'U')
Dateien
text = open('eggs', 'r').read( )
Mengen
set([1, 2, 'three'])
frozenset([1, 2, 'three'])
Die Objekttypen in Tabelle 4-1 sind allgemeiner und mächtiger als das, was Sie vielleicht
gewohnt sind. Sie werden z.B. feststellen, dass Listen und Dictionaries einen Großteil der
Arbeit unnötig machen, die Sie in niedrigeren Sprachen auf Sammlungen und Suchvorgänge verwenden. Listen sind geordnete Sammlungen anderer Objekte, die über ihre Position mit Zahlen ab 0 indiziert werden. Und Dictionaries sind Sammlungen anderer
Objekte, die über einen Schlüssel statt über ihre Position indiziert werden. Sowohl Dictionaries als auch Listen können verschachtelt werden, können bei Bedarf wachsen oder
schrumpfen und dürfen Objekte beliebigen Typs enthalten. Die ganze Geschichte erfahren
Sie, wenn Sie weiterlesen.
Zahlen
Der erste Objekttyp auf unserer Reise sind Python-Zahlen. Im Allgemeinen werden Ihnen
Pythons Zahlentypen vertraut vorkommen, wenn Sie schon irgendeine andere Programmiersprache benutzt haben. Python unterstützt die üblichen numerischen Typen: Ganzzahlen (engl. Integer) und Fließkommazahlen, ebenso wie Literale für die Erzeugung von
Zahlen und Ausdrücke für ihre Verarbeitung.
Max.
Linie
1 In diesem Buch steht der Begriff Literal einfach für einen Ausdruck, dessen Syntax ein Objekt erzeugt, manchmal
auch eine Konstante genannt. Allerdings heißt das nicht, dass Objekte oder Variablen gemeint sind, die nicht
mehr geändert werden können (d.h., es gibt keinen Zusammenhang zu const in C++ oder zu etwas »Unveränderlichem« in Python, was später noch in diesem Buch erklärt wird).
Zahlen | 59
“
Max.
Linie
Links
Zusätzlich bietet Python eine anspruchsvollere numerische Programmierunterstützung,
inklusive eines komplexen Zahlentyps, einer Ganzzahl mit unbegrenzter Genauigkeit
und einer Vielzahl von numerischen Werkzeug-Bibliotheken. Die nächsten Abschnitte
geben einen Überblick über die numerische Unterstützung in Python.
Zahlen-Literale
Als Grundtypen unterstützt Python die üblichen Verdächtigen: sowohl Ganzzahlen als
auch Fließkommazahlen und die gesamte damit verbundene Syntax und Operationen. Wie
C erlaubt auch Python, Ganzzahlen mit hexadezimalen und oktalen Literalen zu schreiben. Anders als C hat Python aber auch einen komplexen Zahlentyp und einen langen
Ganzzahltyp mit unbegrenzter Genauigkeit (die Anzahl der maximal möglichen Ziffern
hängt nur von Ihrem Hauptspeicher ab). Tabelle 4-2 zeigt, wie die numerischen Typen von
Python aussehen, wenn sie in einem Programm verwendet werden (d.h. als Literale).
Tabelle 4-2: Numerische Literale
Literal
Bedeutung
1234, -24, 0
Normale Ganzzahlen (in C: long)
9999999999999999999L
Lange Ganzzahlen (unbegrenzt)
1.23, 3.14e-10, 4E210, 4.0e+210
Fließkommazahl (in C: double)
0177, 0x9ff, 0XFF
Oktale und hexadezimale Literale
3+4j, 3.0+4.0j, 3J
Komplexe Zahlenliterale
Im Großen und Ganzen sind die numerischen Typen von Python einfach, aber ein paar
Konzepte dabei sollen hier doch hervorgehoben werden:
Ganzzahl- und Fließkomma-Literale
Ganzzahlen werden als Folge von Dezimalziffern geschrieben. Fließkommazahlen
enthalten einen Dezimalpunkt und/oder einen optionalen, vorzeichenbehafteten
Exponenten, dem ein e oder E vorausgeht. Wenn Sie eine Zahl mit einem Dezimalpunkt oder Exponenten schreiben, macht Python daraus ein FließkommazahlObjekt und benutzt Fließkomma- (und nicht Ganzzahl-)Arithmetik, wenn sie in
einem Ausdruck verwendet wird. Die Regeln beim Schreiben von Fließkommazahlen
sind die gleichen wie in C.
Numerische Genauigkeit und lange Ganzzahlen
Einfache Ganzzahlen (Zeile 1 in Table 4-2) werden intern als C-»longs« implementiert
(d.h., es gibt mindestens 32 Bits), und Fließkommazahlen werden als C-»doubles«
implementiert. Python-Zahlen haben dieselbe Genauigkeit wie der C-Compiler, mit
dem der Python-Interpreter erstellt wurde.2
Max.
Linie
2 Das gilt für die Standardimplementierung, d.h. CPython. In Jython, der Java-basierten Implementierung, sind
Python-Typen tatsächlich Java-Klassen.
60 | Kapitel 4: Zahlen
“
Max.
Linie
Rechts
Lange Ganzzahl-Literale
Wenn auf der anderen Seite ein Ganzzahl-Literal mit einem l oder L endet, wird
daraus eine lange Python-Ganzzahl (nicht zu verwechseln mit einem C-long), und sie
kann so groß wie nötig werden. Ab Python 2.2 ist der Buchstable L streng genommen
nicht mehr nötig, da Ganzzahlen bei einem Überlauf zu langen Ganzzahlen konvertiert werden. Für zukünftige Python-Versionen könnte die Unterscheidung zwischen
Ganzzahlen und langen Ganzzahlen ganz wegfallen.
Hexadezimale und oktale Literale
Die Regeln beim Schreiben von hexadezimalen und oktalen Ganzzahlen (jeweils zur
Basis 16 bzw. 8) sind dieselben wie in C. Oktale Literale beginnen mit einer führenden Null (0), nach der eine Folge der Ziffern 0–7 kommt. Hexadezimale Literale
beginnen mit einem führenden 0x oder 0X, nach dem eine Folge der Hexadezimalziffern 0–9 und A–F kommt. In hexadezimalen Literalen dürfen hexadezimale Ziffern
mit kleinen und großen Buchstaben codiert sein.
Komplexe Zahlen
Komplexe Zahlenliterale werden in Python als realteil+imaginärteil geschrieben,
wobei der imaginärteil mit einem j oder J endet. Rein technisch ist der realteil
optional und der imaginärteil darf an erster Stelle stehen. Intern werden sie als Paar
von Fließkommazahlen implemeniert, aber alle numerischen Operationen führen
eine komplexe Arithmetik aus, wenn sie auf komplexe Zahlen angewendet werden.
Eingebaute Werkzeuge und Erweiterungen
Neben den eingebauten Zahlentypen, die in Tabelle 4-2 dargestellt sind, stellt Python
eine Reihe von Werkzeugen zum Bearbeiten numerischer Objekte zur Verfügung:
Ausdrucksoperatoren
+, *, >>, ** usw.
Eingebaute mathematische Funktionen
pow, abs usw.
Hilfsmodule
random, math usw.
Sie werden alle im weiteren Verlauf des Buchs kennenlernen. Und schließlich, wenn Sie
an wirklich rechenintensiven Aufgaben arbeiten (engl. »number-crunching«), dann bietet
eine optionale Erweiterung für Python namens NumPy (Numeric Python) zusätzliche
numerische Programmierwerkzeuge, wie einen Matrix-Datentyp und Bibliotheken für
ausgeklügelte Berechnungen. Viele Gruppen, die ernsthaft wissenschaftliches Rechnen
betreiben, z.B. in den Lawrence Livermore Labs (USA) und bei der NASA, setzen Python
und NumPy bei Problemen ein, die sie früher mit C++ oder FORTRAN gelöst haben.
Max.
Linie
Max.
Linie
Zahlen | 61
“
Links
Weil es so anspruchsvoll ist, gehen wir hier nicht weiter auf NumPy ein. (Beispiele finden
Sie in Kapitel 29.) Weitere Unterstützung für anspruchsvolle numerische Programmierung mit Python finden Sie auf der Vaults of Parnassus-Website. Beachten Sie, dass
NumPy eine optionale Erweiterung ist, die nicht in Python enthalten ist, sondern separat
installiert werden muss.
Python-Ausdrucksoperatoren
Das vielleicht elementarste Werkzeug zum Bearbeiten von Zahlen ist der Ausdruck: eine
Kombination aus Zahlen (oder anderen Objekten) und Operatoren, die einen Wert
berechnet, wenn sie von Python ausgeführt wird. In Python werden Ausdrücke unter Verwendung der üblichen mathematischen Notationen und Operatorensymbole geschrieben. Zum Beispiel: Um die Zahlen X und Y zu addieren, schreibt man X+Y, was Python
anweist, den Operator + auf die Werte X und Y anzuwenden. Das Ergebnis dieses Ausdrucks ist die Summe von X und Y, ein weiteres Zahlen-Objekt.
In Tabelle 4-3 sind alle in Python verfügbaren Operatoren-Ausdrücke aufgeführt. Viele
sind selbsterklärend; z.B. werden die üblichen mathematischen Operatoren unterstützt: +,
-, *, / usw. Einige werden Ihnen geläufig sein, wenn Sie bereits C benutzt haben: % berechnet einen Divisionsrest, << führt eine bitweise Linksverschiebung durch, & berechnet eine
bitweise UND-Verknüpfung usw. Andere sind mehr Python-spezifisch, und nicht alle
sind numerischer Natur: Der is-Operator testet auf Gleichheit per Objekt-Identität (d.h.
über die Adresse im Speicher), lambda erzeugt unbenannte Funktionen usw. Mehr zu einigen davon folgt an späterer Stelle.
Gemischte Operatoren: Operator-Vorrang
Wie in den meisten Sprachen werden komplexere Ausdrücke dadurch codiert, dass man
Operatorausdrücke aus Tabelle 4-3 aneinanderreiht. Zum Beispiel kann man die Summe
zweier Multiplikationen als Mischung von Variablen und Operatoren schreiben:
A * B + C * D
Wie soll Python nun wissen, welcher Operator zuerst ausgeführt werden soll? Die Antwort
lautet: mit Hilfe dessen, was man als Operator-Vorrang bezeichnet. Wenn Sie einen Ausdruck mit mehr als einem Operator schreiben, gruppiert Python dessen Bestandteile
gemäß der sogenannten Vorrangsregeln, und diese Gruppierung bestimmt die Reihenfolge,
in der die Bestandteile von Ausdrücken berechnet werden. In der Table 4-3 haben die Operatoren weiter unten höheren Vorrang und binden daher in gemischten Ausdrücken stärker.
Max.
Linie
Wenn Sie z.B. X + Y * Z eingeben, wertet Python zuerst die Multiplikation aus (Y * Z) und
addiert danach das Ergebnis zu X, weil * Vorrang vor + hat (* steht weiter unten in der
Tabelle). Entsprechend werden im ursprünglichen Beispiel beide Multiplikationen (A * B
und C * D) berechnet, bevor ihre Ergebnisse addiert werden.
62 | Kapitel 4: Zahlen
“
Max.
Linie
Rechts
Klammern gruppieren Unterausdrücke
Sie können die Vorrangsregeln vollständig vergessen, wenn Sie die Bestandteile von Ausdrücken sorgfältig mit Klammern gruppieren. Wenn Sie Unterausdrücke in Klammern setzen, überschreiben Sie Pythons Vorrangsregeln. Python wertet Ausdrücke in Klammern
immer zuerst aus und benutzt dann ihre Ergebnisse in den umschließenden Ausdrücken.
Tabelle 4-3: Ausdrucksoperatoren und Vorrang
Operatoren
Beschreibung
lambda args: expression
Erzeugen anonymer Funktionen
x or y
Logisches ODER (y wird nur ausgewertet, wenn x falsch ist)
x and y
Logisches UND (y wird nur ausgewertet, wenn x wahr ist)
not x
Logische Negation
x
x
x
x
Vergleichsoperatoren, Testoperatoren für Wertgleichheit, Objektidentität und
Enthaltensein
< y, x <= y, x > y, x >= y,
== y, x <> y, x != y,
is y, x is not y,
in y, x not in y
x | y
Bitweises ODER
x ^ y
Bitweises Entweder-Oder
x & y
Bitweises UND
x << y, x >> y
Verschiebe x nach links oder rechts um y Bits
-x + y, x – y
Addition/Verkettung, Subtraktion
x * y, x % y, x / y, x // y
Multiplikation/Wiederholung, Divisionsrest/Format, Divisiona
-x, +x, ~x, x ** y
Negation, Identität, bitweises Komplement, Exponentiation
x[i], x[i:j], x.attr, x(...)
Indizieren, Slicing, Qualifizierung, Funktionsaufruf
(...), [...], {...}, `...`
Tupel, Liste,b Dictionary, Konvertierung in Stringc
a
Restslose Division (X // Y), schneidet den Nachkommateil immer ab. Das wird ausführlicher im Abschnitt »Division: klassische, restlose und echte« beschrieben.
b
Die Listensyntax ([...]) stellt entweder ein Listen-Literal oder einen List Comprehension-Ausdruck dar. Letzterer führt eine implizite Schleife durch und sammelt die Ausdrucksergebnisse in einer neuen Liste. Mehr dazu im
Zusammenhang mit Funktionen in Kapitel 14.
c
Objekte können auch mit den besser lesbaren eingebauten Funktionen str und repr in Strings konvertiert werden, siehe Abschnitt »Numerische Darstellung.«
Schreiben Sie z.B. statt X + Y * Z einen der folgenden Ausdrücke, um Python zu zwingen,
die Ausdrücke in der gewünschten Reihenfolge auszuwerten:
(X + Y) * Z
X + (Y * Z)
Max.
Linie
Im ersten Fall wird zuerst + auf X und Y angewendet, weil es in Klammern steht. Im zweiten Fall wird zuerst * ausgeführt (als ob keine Klammern da wären). Im Allgemeinen ist
Python-Ausdrucksoperatoren | 63
“
Max.
Linie
Links
es eine sehr gute Idee, in langen Ausdrücken Klammern zu setzen. Das erzwingt nicht nur
die gewünschte Auswertungsreihenfolge, es erhöht auch die Lesbarkeit.
Gemischte Typen: Konvertierung nach oben
Außer Operatoren in Ausdrücken können Sie auch numerische Typen mischen. Zum
Beispiel können Sie eine Ganzzahl zu einer Fließkommazahl addieren:
40 + 3.14
Aber das führt zu einer weiteren Frage: Welchen Typ hat das Ergebnis: Ganzzahl oder
Fließkommazahl? Die Antwort ist einfach, insbesondere wenn Sie eine beliebige andere
Sprache kennen: In Ausdrücken mit gemischten Typen konvertiert Python zuerst Operanden zu dem Typ des kompliziertesten Operanden hoch und rechnet dann mit Operanden
desselben Typs. Das ist eine ganz ähnliche Typkonvertierung wie bei C, wenn Sie diese
Sprache kennen.
Python stuft die Komplexität numerischer Typen wie folgt ein: Ganzzahlen sind einfacher
als lange Ganzzahlen, die ihrerseits einfacher als Fließkommazahlen sind, die wiederum
einfacher als komplexe Zahlen sind. Wenn also eine Ganzzahl mit einer Fließkommazahl
gemischt wird, wird die Ganzzahl zuerst zu einer Fließkommazahl hochkonvertiert, und
die Fließkommazahl-Berechnung ergibt das Fließkommazahl-Ergebnis. Analog dazu
wird in jedem Ausdruck gemischten Typs, in dem ein Operand eine komplexe Zahl ist,
der andere Operand in eine komplexe Zahl hochkonvertiert, was wiederum ein komplexes Ergebnis hervorbringt.
Außerdem konvertiert Python ab Version 2.2 normale Ganzzahlen automatisch in lange
Ganzzahlen, sobald ihr Wert zu groß für eine normale Ganzzahl wird. Beachten Sie, dass
all diese Konvertierungen bei gemischten Typen nur bei numerischen Typen um einen
Operator oder einen Vergleich herum erfolgen (z.B. eine Ganzzahl und eine Fließkommazahl). Im Allgemeinen führt Python keine Konvertierung zwischen anderen Typen durch.
So führt z.B. die Addition eines Strings zu einer Ganzzahl zu einem Fehler, es sei denn,
Sie konvertieren den einen oder anderen Wert manuell. Ein Beispiel dafür werden Sie in
Kapitel 5 sehen.
Vorschau: Operator-Überladung
Obwohl wir uns gerade auf eingebaute Zahlen konzentrieren, sollten Sie nicht vergessen,
dass Python-Operatoren durch Python-Klassen und C-Erweiterungen überladen (d.h.
implementiert) werden können, um mit Objekten zu arbeiten, die Sie selbst implementieren. Sie werden später sehen, dass durch Klassen codierte Objekte mit +-Ausdrücken
addiert, mit [i]-Ausdrücken indiziert werden usw.
Max.
Linie
Darüber hinaus sind einige Operatoren bereits durch Python selbst überladen. Je nach
Typ der eingebauten Objekte führen sie verschiedene Aktionen auf den jeweils betroffe-
64 | Kapitel 4: Zahlen
“
Max.
Linie
Rechts
nen eingebauten Objekten aus. Zum Beispiel führt der +-Operator eine Addition aus,
wenn er auf Zahlen angewendet wird, aber eine Verkettung, wenn er auf Sequenzobjekte
wie Strings und Listen angewendet wird.3
Zahlen in Aktion
Vielleicht versteht man numerische Objekte und Ausdrücke am besten dann, wenn man
sie in Aktion sieht. Starten Sie also eine interaktive Kommandozeile, und geben Sie einige
einfache, anschauliche Operationen ein.
Basis-Operationen und -Variablen
Lassen Sie uns als Erstes ein wenig elementare Mathematik üben. In der folgenden Sitzung weisen wir zunächst zwei Variablen (a und b) jeweils eine Ganzzahl zu, damit wir
sie später in einem längeren Ausdruck benutzen können. Variablen sind einfach Namen
(von Ihnen oder Python erzeugt), mit deren Hilfe Sie Informationen in Ihrem Programm
verwalten. Wir werden später noch mehr darüber sagen. Vorläufig aber nur so viel über
Variablen in Python:
• Variablen werden dann erzeugt, sobald ihnen erstmals ein Wert zugewiesen wird.
• Variablen werden durch ihre Werte ersetzt, wenn sie in Ausdrücken benutzt werden.
• Variablen müssen einen zugewiesenen Wert haben, bevor sie in Ausdrücken benutzt
werden können.
• Variablen verweisen auf Objekte und werden niemals vorab deklariert.
Mit anderen Worten: Variablen werden durch Zuweisungen automatisch erzeugt.
% python
>>> a = 3
>>> b = 4
# Name erzeugt
Hierbei haben wir auch einen Kommentar benutzt. In Python-Code wird Text ab einem
#-Zeichen bis zum Zeilenende als Kommentar betrachtet, den der Python-Interpreter
ignoriert. Kommentare sind für Dokumentation in Ihrem Code gedacht, die von Menschen gelesen werden soll. Da interaktiv geschriebener Code temporär ist, würden Sie hier
aber normalerweise keine Kommentare schreiben. Wir haben sie nur zur Beschreibung
des Codes beigefügt.4 Im nächsten Teil dieses Buches werden Sie ein ähnliches Merkmal
finden, Dokumentations-Strings, die Kommentartexte zu Objekten hinzufügen.
3 Das wird üblicherweise Polymorphie genannt, d.h., die Bedeutung einer Operation hängt vom Typ der Objekte
ab, auf die sie angewendet wird. Wir werden in Kapitel 12 darauf zurück kommen, wo es um Funktionen geht,
weil das Konzept dort viel offensichtlicher ist.
Max.
Linie
4 Während Sie diesen Code eingeben, können Sie die Kommentartexte von # bis zum Zeilenende weglassen. Kommentare werden von Python ignoriert und sind für die Anweisungen, die Sie eingeben, nicht notwendig.
Zahlen in Aktion | 65
“
Max.
Linie
Links
Nun wollen wir die Ganzzahl-Objekte in Ausdrücken benutzen. An dieser Stelle haben a
und b immer noch die Werte 3 bzw. 4. Solche Variablen werden durch ihren Wert ersetzt,
wenn sie in einem Ausdruck benutzt werden, und das Ergebnis eines Ausdrucks wird in
der interaktiven Kommandozeile einfach ausgegeben:
>>> a + 1, a – 1
(4, 2)
# Addition (3+1), Subtraktion (3-1)
>>> b * 3, b / 2
(12, 2)
# Multiplikation (4*3), Division (4/2)
>>> a % 2, b ** 2
(1, 16)
# Modulus (Rest), Exponentiation
>>> 2 + 4.0, 2.0 ** b
(6.0, 16.0)
# Konvertierung gemischter Typen
Genau genommen sind die hier ausgegebenen Ergebnisse zweistellige Tupel, weil die eingegebenen Zeilen zwei durch ein Komma getrennte Ausdrücke enthalten. Deswegen werden die Ergebnisse in Klammern dargestellt (später mehr über Tupel). Beachten Sie, dass
die Ausdrücke funktionieren, weil den Variablen a und b darin Werte zugewiesen wurden.
Wenn Sie eine andere Variable verwenden, der kein Wert zugewiesen wurde, gibt Python
einen Fehler aus und verwendet nicht etwa irgendeinen Vorgabewert:
>>> c * 2
Traceback (most recent call last):
File "<stdin>", line 1, in ?
NameError: name 'c' is not defined
In Python müssen Sie keine Variablen vorab deklarieren, aber es muss ihnen mindestens
einmal ein Wert zugewiesen worden sein, bevor Sie sie benutzen können. Es folgen zwei
etwas längere Ausdrücke, in denen Operatoren gruppiert und Konvertierungen vorgenommen werden:
>>> b / 2 + a
5
>>> print b / (2.0 + a)
0.8
# dasselbe wie ((4 / 2) + 3)
# dasselbe wie (4 / (2.0 + 3))
Im ersten Ausdruck kommen keine Klammern vor, sodass Python die Komponenten
automatisch entsprechend der Vorrangsregeln gruppiert. Da / in Tabelle 4-3 weiter unten
steht als +, bindet es stärker und wird somit zuerst ausgewertet. Das Ergebnis ist so, als
hätten wir den Ausdruck so eingeklammert, wie er im Kommentar rechts vom Code
angezeigt ist. Beachten Sie auch, dass alle Zahlen im ersten Ausdruck Ganzzahlen sind
und Python daher eine Ganzzahl-Division und -Addition durchführt.
Max.
Linie
Im zweiten Ausdruck setzen wir den +-Teil in Klammern, um Python zu zwingen, ihn als
Ersten (d.h. vor dem /) auszuwerten. Zusätzlich haben wir einen der Operanden durch
Hinzufügen eines Dezimalpunktes zu einer Fließkommazahl gemacht: 2.0. Aufgrund dieser gemischten Typen konvertiert Python die durch a dargestellte Ganzzahl in einen Fließ-
66 | Kapitel 4: Zahlen
“
Max.
Linie
Rechts
komma-Wert (3.0), bevor das + ausgeführt wird. Ebenso wird b zu einem FließkommaWert (4.0) hochkonvertiert und dann eine Fließkomma-Division durchgeführt: (4.0/5.0)
resultiert in einem Fließkomma-Ergebnis von 0.8. Wären alle Zahlen in diesem Ausdruck
Ganzzahlen, würde eine Ganzzahl-Division durchgeführt (4/5), und das Ergebnis wäre
die abgeschnittete Ganzzahl 0 (jedenfalls bis Python 2.5, siehe dazu auch die Erläuterungen zur echten Division weiter unten).
Numerische Darstellung
Beachten Sie übrigens, dass wir im zweiten Beispiel eine print-Anweisung benutzt haben.
Ohne dieses print käme Ihnen die Anzeige auf den ersten Blick vielleicht etwas merkwürdig vor:
>>> b / (2.0 + a)
0.80000000000000004
# Automatische Ausgabe: mehr Ziffern
>>> print b / (2.0 + a)
0.8
# print rundet die Ziffern weg.
Der Grund dahinter hat mit den Beschränkungen von Fließkomma-Hardware zu tun, die
prinzipiell nicht fähig ist, einige Wert exakt darzustellen. Weil aber das Thema Rechnerarchitektur weit über den Rahmen dieses Buches hinausgeht, sagen wir an dieser Stelle
nur, dass alle Ziffern in der ersten Ausgabe tatsächlich in der Fließkomma-Hardware
Ihres Computers vorhanden sind. Es ist nur so, dass Sie sie normalerweise nicht sehen.
Wir benutzen dieses Beispiel, um Unterschiede beim Formatieren der Ausgabe zu
demonstrieren. Das Ergebnis der automatischen Ausgabe bei der interaktiven Eingabeaufforderung zeigt mehr Ziffern an als die print-Anweisung. Wenn Sie nicht alle Ziffern
haben möchten, verwenden Sie einfach print.
Anzeigeformate mit Str und Repr
Rein technisch betrachtet, entspricht der Unterschied zwischen der automatischen interaktiven Echo-Ausgabe und print-Anweisungen dem Unterschied zwischen den eingebauten
Funktionen repr und str:
>>> repr(num)
'0.33333333333333331'
>>> str(num)
'0.333333333333'
# In Echos: als Code-Form
# In print: als anwenderfreundliche Form
Beide konvertieren beliebige Objekte in ihre String-Darstellung: repr (und die interaktive
Eingabeaufforderung) produziert Ergebnisse, die so aussehen, als ob sie Code wären, während str (und die print-Anweisung) in ein üblicherweise anwenderfreundlicheres Format
konvertiert. Dieses Konzept wird später nochmal beim Thema Strings auftauchen.
Max.
Linie
Max.
Linie
Zahlen in Aktion | 67
“
Links
Beachten Sie, dass nicht bei allen Werten so viele Ziffern angezeigt werden:
>>> 1 / 2.0
0.5
Und es gibt noch mehr Möglichkeiten, die Bits einer Zahl in Ihrem Rechner darzustellen
als mit print und der automatischen Echo-Ausgabe:
>>> num = 1 / 3.0
>>> num
0.33333333333333331
>>> print num
0.333333333333
>>> "%e" % num
'3.333333e-001'
>>> "%2.2f" % num
'0.33'
# Automatische Echo-Ausgabe
# Print rundet
# String-Formatierung
# String-Formatierung
Die beiden letzten davon verwenden die String-Formatierung, d.h. Ausdrücke, die flexiblere Formate ermöglichen und im Kapitel über Strings erläutert werden.
Division: klassische, restlose und echte
Da Sie nun gesehen haben, wie die Division funktioniert, sollten Sie wissen, dass sie in
einer zukünftigen Python-Version eine leichte Änderung erfahren wird (vermutlich in
3.0, die wohl erst ein paar Jahre nach Erscheinen dieses Buches veröffentlicht werden
wird). In Python 2.5 funktioniert alles wie beschrieben, aber tatsächlich gibt es zwei verschiedene Divisionsoperatoren, von denen einer sich verändern wird:
X / Y
Klassische Division. In Python 2.5 und davor schneidet dieser Operator im Ergebnis
den Rest bei Ganzzahlen ab, behält ihn aber bei Fließkommazahlen, wie hier
beschrieben. Dieser Operator wird in einer zukünftigen Version von Python (man
spricht von 3.0) eine echte Division liefern, d.h., dann wird die Division unabhängig
vom Typ der Operanden immer eine Fließkommazahl ergeben, die den Rest enthält.
X // Y
Restlose Division (engl. floor division). Diesen Operator gibt es ab Python 2.2. Er
schneidet den Divisionsrest immer ab, egal welchen Typ die Operanden haben.
Die restlose Division wurde hinzugefügt, um der Tatsache Rechnung zu tragen, dass im
aktuellen klassischen Divisionsmodell das Ergebnis von den Operandentypen abhängt
und somit in einer dynamisch typisierten Sprache wie Python gelegentlich schwer vorherzusehen ist.
Max.
Linie
Wegen möglicher Probleme mit der Rückwärtskompatibilität wird diese Veränderung
heute noch diskutiert. In der Version 2.5 funktioniert die Division mit / standardmäßig
wie hier beschrieben, und die restlose Division mit // wurde hinzugefügt, um den Divisionsrest unabhängig von den Operandentypen abzuschneiden:
68 | Kapitel 4: Zahlen
“
Max.
Linie
Rechts
>>> (5 / 2), (5 / 2.0), (5 / -2.0), (5 / -2)
(2, 2.5, -2.5, -3)
>>> (5 // 2), (5 // 2.0), (5 // -2.0), (5 // -2)
(2, 2.0, -3.0, -3)
>>> (9 / 3), (9.0 / 3), (9 // 3), (9 // 3.0)
(3, 3.0, 3, 3.0)
In einer zukünftigen Python-Version wird die Division mit / vermutlich so geändert, dass
sie ein echtes Divisionsergebnis liefert, das immer den Rest enthält, sogar bei Ganzzahlen.
Zum Beispiel wird dann 1/2 den Wert 0.5 ergeben und nicht 0, und 1//2 wird immer noch
0 ergeben.
Solange diese Änderung nicht vollständig vollzogen ist, können Sie sehen, wie / wahrscheinlich in Zukunft funktionieren wird, indem Sie einen speziellen Import der folgenden Art ausführen: from _ _future_ _ import division. Das macht aus dem Operator /
eine echte Division (die Reste erhält), lässt // aber unverändert. Sehen Sie selbst, wie sich
/ verhalten wird:
>>> from _ _future_ _ import division
>>> (5 / 2), (5 / 2.0), (5 / -2.0), (5 / -2)
(2.5, 2.5, -2.5, -2.5)
>>> (5 // 2), (5 // 2.0), (5 // -2.0), (5 // -2)
(2, 2.0, -3.0, -3)
>>> (9 / 3), (9.0 / 3), (9 // 3), (9 // 3.0)
(3.0, 3.0, 3, 3.0)
Suchen Sie ein einfaches Beispiel für eine Primzahlen-while-Schleife in Kapitel 10 und
eine entsprechende Aufgabe am Ende von Teil IV, die die Art von Code illustrieren, der
von dieser Änderung von / betroffen sein wird. Im Allgemeinen könnte jeder Code
betroffen sein, der davon ausgeht, dass / den Rest in einem ganzzahligen Ergebnis
abschneidet (verwenden Sie dann das neue //). Im Augenblick ist diese Änderung für
Python 3.0 geplant, aber Sie sollten diese Ausdrücke unbedingt in Ihrer Version ausprobieren, um zu sehen, welches Verhalten bei Ihnen vorliegt. Und achten Sie auf weitere
Erklärungen in Kapitel 18 zu der hier verwendeten speziellen Form der from-Anweisung.
Bitweise Operationen
Neben den normalen numerischen Operationen (Addition, Subtraktion usw.) unterstützt
Python die meisten der in der Sprache C verfügbaren numerischen Ausdrücke. Hier
sehen Sie zum Beispiel eine bitweise Verschiebung und zwei Boolesche Operationen:
Max.
Linie
>>> x = 1
>>> x << 2
4
# 0001
# verschiebe nach links um 2 Bits: 0100
Max.
Linie
Zahlen in Aktion | 69
“
Links
>>> x | 2
3
>>> x & 1
1
# bitweises ODER: 0011
# bitweises UND: 0001
Im ersten Ausdruck wird eine binäre 1 (zur Basis 2, 0001) um zwei Stellen nach links verschoben, um eine binäre 4 zu erzeugen (0100). Die beiden letzten Operationen führen ein
binäres ODER (0001|0010 = 0011) und ein binäres UND (0001&0001 = 0001) aus. Mit Hilfe
solcher Bit-Maskierungen können Sie mehrere Schalter und andere Werte in einer einzigen Ganzzahl kodieren.
Wir werden hier nicht viel mehr auf die Details von »Bit-Spielereien« eingehen. Es wird
unterstützt, wenn Sie es benötigen, aber seien Sie sich bewusst, dass es in einer Hochsprache wie Python oftmals nicht so wichtig ist wie in einer niederen Sprache wie C. Als
Faustregel gilt: Wenn Sie feststellen, dass Sie in Python gerne Bits vertauschen möchten,
sollten Sie gründlich darüber nachdenken, welche Sprache Sie eigentlich benutzen. Im
Allgemeinen gibt es in Python oft bessere Wege, Informationen zu kodieren als mit BitStrings.5
Lange Ganzzahlen
Nun zu etwas Exotischerem: Hier können Sie lange Ganzzahlen in Aktion sehen. Wenn
ein Ganzzahl-Literal mit dem Buchstaben L (oder kleinem l) endet, bildet Python eine
lange Ganzzahl. In Python darf eine lange Ganzzahl beliebig lang sein und kann so viele
Ziffern haben, wie Sie Platz im Hauptspeicher haben:
>>> 9999999999999999999999999999999999999L + 1
10000000000000000000000000000000000000L
Das L am Ende der Ziffernfolge sagt Python, dass es ein langes Ganzzahlobjekt mit unbeschränkter Genauigkeit erzeugen soll. Ab Python 2.2 ist sogar der Buchstabe L größtenteils optional, denn Python konvertiert normale Ganzzahlen automatisch in lange Ganzzahlen, wann immer es zu einem Überlauf der normalen Genauigkeit von Ganzzahlen
kommt (üblicherweise bei 32 Bits):
>>> 9999999999999999999999999999999999999 + 1
10000000000000000000000000000000000000L
Lange Ganzzahlen sind ein praktisches Werkzeug. Sie können damit z.B. die Staatsverschuldung in Cent direkt in Python angeben (wenn Sie möchten und Ihr Rechner über so
viel Hauptspeicher verfügt). Sie sind auch der Grund dafür, dass wir eine Exponentialberechnung mit so großen Exponenten von 2 in den Beispielen von Kapitel 3 durchführen
konnten:
>>> 2L ** 200
1606938044258990275541962092341162602522202993782792835301376L
Max.
Linie
5 Wie bei allen Regeln gibt es auch hier Ausnahmen. Beispiel: Wenn Sie eine Schnittstelle mit C-Bibliotheken
haben, die Bit-Strings erwarten, gilt diese Regel nicht.
70 | Kapitel 4: Zahlen
“
Max.
Linie
Rechts
>>>
>>> 2 ** 200
1606938044258990275541962092341162602522202993782792835301376L
Aber weil Python Extraarbeit leisten muss, um deren erweiterte Genauigkeit zu unterstützen, ist die Langzahl-Arithmetik üblicherweise um einiges langsamer als die normale
Ganzzahl-Arithmetik (die in der Regel direkt auf die Hardware abgebildet wird). Wenn
Sie die Genauigkeit benötigen, so ist sie eingebaut und für Sie verfügbar. Aber es ist ein
Performance-Nachteil damit verbunden.
Eine Bemerkung zu verschiedenen Python-Versionen: Vor Python 2.2 wurden Ganzzahlen
nicht automatisch bei einem Überlauf zu langen Ganzzahlen hochkonvertiert, d.h., Sie
mussten den Buchstaben L tatsächlich benutzen, um die erweiterte Genauigkeit zu erhalten:
>>> 9999999999999999999999999999999999999 + 1
OverflowError: integer literal too large
# vor 2.2
>>> 9999999999999999999999999999999999999L + 1
10000000000000000000000000000000000000L
# vor 2.2
Ab Version 2.2 ist das L zum Großteil optional. In Zukunft kann es sein, dass bei Verwendung des Buchstabens L Python eine Warnung ausgibt. Deswegen fahren Sie vermutlich
am besten, wenn Sie das L weglassen und es Python überlassen, automatisch für Sie bei
Bedarf hochzukonvertieren.
Komplexe Zahlen
Komplexe Zahlen sind ein eigenständiger Objekttyp im Python-Kern. Falls Sie wissen,
was sie sind, wissen Sie auch, weshalb sie nützlich sind. Falls nicht, ist es Ihnen freigestellt, diesen Abschnitt zu lesen. Komplexe Zahlen werden als zwei Fließkomma-Zahlen
dargestellt, einem Real- und einem Imaginärteil, und werden mit einem zusätzlichen j
oder J als Endung des Imaginärteils codiert. Man kann komplexe Zahlen auch mit einem
Realteil ungleich null schreiben, indem man die beiden Teile mit einem + verbindet. Zum
Beispiel wird die komplexe Zahl mit dem Realteil 2 und dem Imaginärteil -3 als 2 + -3j
geschrieben. Hier ein paar Beispiele für komplexe Arithmetik in Aktion:
>>> 1j * 1J
(-1+0j)
>>> 2 + 1j * 3
(2+3j)
>>> (2+1j)*3
(6+3j)
Max.
Linie
Bei komplexen Zahlen kann man auf beide Anteile als Attribute zugreifen. Komplexe
Zahlen unterstützen alle üblichen mathematischen Ausdrücke und können mit den
Werkzeugen des Moduls cmath in der Standardbibliothek (der komplexen Version des
Moduls math) bearbeitet werden. Komplexe Zahlen finden typischerweise Anwendung in
ingineurswissenschaftlichen Programmen. Da sie etwas anspruchsvoller sind, sollten Sie
das Python Language Reference-Handbuch für weitere Details lesen.
Zahlen in Aktion | 71
“
Max.
Linie
Links
Hexadezimale und oktale Notation
Wie am Anfang dieses Abschnitts erwähnt, können Python-Ganzzahlen zusätzlich zur
normalen Codierung (zur Basis 10) auch in hexadezimaler (zur Basis 16) und oktaler (zur
Basis 8) Notation codiert werden:
• Oktale Literale haben eine führende 0, gefolgt von einer Folge von oktalen Ziffern 0–7,
in der jede drei Bits darstellt.
• Hexadezimale Literale haben ein führendes 0x oder 0X, gefolgt von einer Folge von
hexadezimalen Ziffern 0–9 und A–F (Klein- oder Großbuchstaben), in der jede Ziffer
vier Bits darstellt.
Bedenken Sie, dass das einfach nur eine alternative Syntax für die Angabe des Wertes
eines Ganzzahl-Objektes darstellt. So produzieren z.B. die folgenden oktalen und hexadezimalen Literale normale Ganzzahlen mit dem jeweils angegebenen Wert:
>>>
(1,
>>>
(1,
01, 010, 0100
8, 64)
0x01, 0x10, 0xFF
16, 255)
# oktale Literale
# hexadezimale Literale
Hierbei ist der oktale Wert 0100 dezimal 64, und der hexadezimale Wert 0xFF ist dezimal
255. Python gibt seine Ausgaben standardmäßig dezimal aus, bietet aber eingebaute
Funktionen, mit denen Sie Ganzzahlen in Ziffern-Strings mit deren oktaler und hexadezimaler Darstellung konvertieren können:
>>> oct(64), hex(64), hex(255)
('0100', '0x40', '0xff')
Die Funktionen oct und hex konvertieren dezimal nach oktal bzw. nach hexadezimal. In
umgekehrter Richtung konvertiert die eingebaute Funktion int einen Ziffern-String in
eine Ganzzahl, wobei Sie in einem optionalen zweiten Argument die numerische Basis
angeben können:
>>> int('0100'), int('0100', 8), int('0x40', 16)
(100, 64, 64)
Die Funktion eval, die Sie später in diesem Buch noch kennenlernen werden, behandelt
Strings so, als ob sie Python-Code wären. Daher hat sie einen ähnlichen Effekt (sie läuft
aber normalerweise langsamer ab, denn sie kompiliert den String und führt ihn als Programmstück aus):
>>> eval('100'), eval('0100'), eval('0x40')
(100, 64, 64)
Und schließlich können Sie Ganzzahlen auch mit einem String-Formatierungsausdruck
in oktale und hexadezimale Strings konvertieren:
Max.
Linie
>>> "%o %x %X" % (64, 64, 255)
'100 40 FF'
Max.
Linie
Das wird noch in Kapitel 4 behandelt.
72 | Kapitel 4: Zahlen
“
Rechts
Eine Warnung, bevor wir weitermachen: Achten Sie in Python darauf, dass Sie eine Ziffernfolge nicht mit einer führenden Null beginnen, es sei denn, Sie möchten wirklich
einen oktalen Wert codieren. Python wird ihn als Wert zur Basis 8 behandeln, was vielleicht nicht so funktionieren wird, wie Sie es erwarten. 010 ist immer dezimal 8, nicht
dezimal 10 (auch wenn Sie das anders sehen!).
Weitere numerische Werkzeuge
Python stellt sowohl eingebaute Funktionen als auch Module für die numerische Verarbeitung zur Verfügung. Es folgen ein paar Beispiele mit dem eingebauten Modul math und
einigen eingebauten Funktionen:
>>> import math
>>> math.pi, math.e
(3.1415926535897931, 2.7182818284590451)
>>> math.sin(2 * math.pi / 180)
0.034899496702500969
>>> abs(-42), 2**4, pow(2, 4)
(42, 16, 16)
>>> int(2.567), round(2.567), round(2.567, 2)
(2, 3.0, 2.5699999999999998)
Das math-Modul enthält die meisten der Werkzeuge, die in der mathematischen Bibliothek von C enthalten sind. Wie schon erwähnt, würde die letzte Ausgabezeile hier 2.57
enthalten, wenn Sie print verwenden.
Beachten Sie, dass eingebaute Module wie math importiert werden müssen, aber eingebaute Funktionen wie abs immer ohne Import verfügbar sind. Tatsächlich sind Module
externe Komponenten, aber eingebaute Funktionen befinden sich in einem implizierten
Namensraum, den Python automatisch absucht, um die in Ihrem Programm benutzten
Namen zu finden. Dieser Namensraum entspricht einem Modul, das _ _builtin_ _
genannt wird. In Teil IV, Funktionen, werden Sie noch viel mehr über die Auflösung von
Namen erfahren. Vorläufig sollten Sie bei dem Wort »Modul« an »importieren« denken.
Intermezzo: Dynamische Typisierung
Max.
Linie
Falls Sie sich mit kompilierten oder statisch typisierten Sprachen wie C, C++ oder Java
auskennen, könnten Sie an dieser Stelle evtl. leicht verwirrt sein. Bisher haben wir Variablen verwendet, ohne ihren Typ zu deklarieren, und irgendwie funktioniert das auch noch.
Wenn wir a = 3 in einer interaktiven Sitzung oder in einer Programmdatei eingeben,
woher weiß dann Python, dass a für eine Ganzzahl steht? Woher weiß Python eigentlich,
was a überhaupt sein soll?
Intermezzo: Dynamische Typisierung | 73
“
Max.
Linie
Links
Dezimalzahlen ab Python 2.4
Fließkomma-Zahlen in Python werden intern mit Hilfe des Typs double in C implementiert. Damit unterliegen sie den gleichen fundamentalen Beschränkungen, was die darstellbare Genauigkeit angeht. Viele Dezimalzahlen können daher nicht exakt dargestellt
werden, auch wenn der Unterschied nicht immer sichtbar ist, weil er bei der Ausgabe versteckt wird:
>>> 1.1
1.1000000000000001
>>> print 1.1
1.1
# Nicht exakt darstellbar
# Ungenauigkeit wird versteckt
Für viele Anwendungen spielt das keine Rolle. Für die anderen, in denen sich die Fehler
meist mit der Anzahl der Operationen addieren, ist das ein Problem. Dafür gibt es seit
Python 2.4 das Modul decimal in der Standardbibliothek, das echte Dezimalzahlen bietet.
Für diese Dezimalzahlen können Sie Genauigkeit und Rundung beliebig angeben. Sie können mit ihnen rechnen, Spezialwerte wie Unendlich benutzen und sie konvertieren. Weil
diese Dezimalzahlen kein eingebauter Zahlentyp in Python sind, gehen wir hier nicht weiter auf sie ein. Weitere Details dazu finden Sie im Python-Bibliothekshandbuch.
Sobald Sie anfangen, solche Fragen zu stellen, landen Sie bei Pythons Modell der dynamischen Typisierung. In Python werden Typen automatisch zur Laufzeit bestimmt, und
nicht als Reaktion auf Deklarationen in Ihrem Code. Für Sie bedeutet das, dass Sie zu
keinem Zeitpunkt Variablen vorab deklarieren. Dieses Konzept ist vielleicht einfacher zu
verdauen, wenn Sie vorher noch nicht in anderen Sprachen programmiert haben. Aber
weil das sehr wahrscheinlich das wichtigste Konzept der Sprache Python ist, gehen wir
hier detailliert darauf ein.
Wie Zuweisungen funktionieren
Wenn wir a = 3 schreiben, dann werden Sie feststellen, dass das funktioniert, obwohl wir
Python niemals gesagt haben, dass es a als Variable benutzen soll. Außerdem scheint
auch die Zuweisung von 3 an a zu funktionieren, obwohl wir Python nicht gesagt haben,
dass a für ein Objekt vom Typ Ganzzahl stehen soll. In Python lösen sich diese Fragen
auf natürliche Weise wie folgt:
Erzeugung
Eine Variable, z.B. a, wird dann erzeugt, wenn sie in Ihrem Code erstmals einen Wert
zugewiesen bekommt. Spätere Zuweisungen ändern den Wert eines bereits erzeugten Namens. Ganz streng genommen werden die Variablen jedesmal erzeugt, egal ob
sie bereits da waren oder nicht.
Max.
Linie
Max.
Linie
74 | Kapitel 4: Zahlen
“
Rechts
Typen
Eine Variable, z.B. a, ist nie mit irgendeiner Typinformation oder -beschränkung verbunden. Stattdessen werden Typen immer mit Objekten verbunden und nicht mit
Namen. Variablen verweisen einfach immer nur zu einer bestimmten Zeit auf ein
bestimmtes Objekt.
Benutzung
Sobald eine Variable in einem Ausdruck erscheint, wird sie sofort mit dem Objekt
ersetzt, auf das sie gerade verweist, was auch immer das sein mag. Außerdem muss
allen Variablen explizit ein Wert zugewiesen worden sein, bevor sie benutzt werden
können. Die Benutzung von Variablen ohne zugewiesenen Wert führt zu einem Fehler.
Dieses Modell unterscheidet sich erheblich von jenem in traditionellen Sprachen, und es
ist der Grund für einen Großteil der Kürze und Flexibilität von Python-Code. Am Anfang
werden Sie die dynamische Typisierung leichter verstehen, wenn Sie eine klare Trennlinie
zwischen Namen und Objekten ziehen. Betrachten Sie diese Anweisung als Beispiel:
>>> a = 3
Um diesen Befehl auszuführen, führt Python zumindest im Prinzip drei verschiedene
Schritte aus, was so für alle Zuweisungsoperationen gilt:
1. Erzeuge ein Objekt, das den Wert 3 darstellt.
2. Erzeuge die Variable a, falls sie noch nicht existiert.
3. Verbinde die Variable a mit dem neuen Objekt 3.
Als Endergebnis entsteht eine Struktur in Python, wie sie in Abbildung 4-1 abgebildet ist.
Wie angedeutet wurde, werden Variablen und Objekte in verschiedenen Teilen des
Hauptspeichers gespeichert und mit Verbindungen assoziiert, die hier als Pfeile gezeigt
werden. Variablen verweisen immer auf Objekte (und nie auf andere Variablen), aber
größere Objekte können auf andere Objekte verweisen.
Diese Verbindungen von Variablen zu Objekten werden in Python Verweise (engl. references) genannt, eine Art Assoziation.6 Immer, wenn eine Variable später benutzt wird
(d.h. wenn der Verweis verfolgt wird), wird die Verbindung von der Variablen zum
Objekt von Python automatisch verfolgt. All das ist einfacher, als es durch diese Terminologie vielleicht erscheinen mag. Konkret gilt:
• Variablen sind einfach Einträge in einer Suchtabelle, die Verbindungen zu Objekten
enthält.
Max.
Linie
6 Für Leser mit C-Kenntnissen werden Python-Verweise C-Zeigern (Speicheradressen) sehr ähnlich sehen. Tatsächlich sind Verweise als Zeiger implementiert und haben oftmals den gleichen Zweck, besonders bei Objekten,
die sich an Ort und Stelle ändern können (mehr dazu später). Weil Verweise bei ihrer Benutzung allerdings
immer automatisch verfolgt werden, können Sie nie irgendetwas Sinnvolles mit einem Verweis allein machen.
Das ist so gewollt und eliminiert eine riesige Kategorie von Fehlern in C. Aber Sie können sich Python-Verweise
als »void*«-Zeiger in C vorstellen, die bei ihrer Benutzung automatisch verfolgt werden.
Intermezzo: Dynamische Typisierung | 75
“
Max.
Linie
Links
• Objekte sind einfach Teile von belegtem Hauptspeicher, die genügend Raum für die
Darstellung ihres Wertes und einer Typinformation bieten.
Abbildung 4-1: Namen und Objekte nach der Zuweisung a = 3
Jedes Mal, wenn Sie in Ihrem Skript einen neuen Wert erzeugen, erzeugt Python, jedenfalls im Prinzip, ein neues Objekt (d.h. einen Speicherbereich), der diesen Wert darstellt.
Bestimmte Arten unveränderlicher Objekte wie kleine Ganzzahlen und Strings legt
Python zur Optimierung in einen Pufferspeicher und verwendet sie wieder (nicht alle
Nullen belegen eigenen Speicherplatz), aber das funktioniert so, als ob jeder Wert ein
eigenständiges Objekt wäre. Wir werden später im Abschnitt »Vergleiche und Gleichheit« in Kapitel 7 erneut auf dieses Konzept stoßen, wenn es um Vergleiche mit == und is
geht.
Erweitern wir diese Sitzung und beobachten wir, was mit den Namen und Objekten
darin passiert:
>>> a = 3
>>> b = a
Nach Eingabe dieser beiden Anweisungen ergibt sich das Bild in Abbildung 4-2. Wie
zuvor erzeugt Python mit der zweiten Zeile die Variable b. Dabei wird die Variable a
benutzt, d.h., ihr wird nichts zugewiesen, also wird sie durch das Objekt ersetzt, auf das
sie verweist (3), und b wird zu einem Verweis auf dieses Objekt. Im Endergebnis verweisen beide Variablen, a und b, auf dasselbe Objekt (d.h., sie zeigen auf denselben
Speicherbereich). In Python wird das ein gemeinsamer Verweis (engl. shared reference)
genannt, d.h., mehrere Namen verweisen auf dasselbe Objekt.
Max.
Linie
Abbildung 4-2: Namen und Objekte nach der Zuweisung b = a
76 | Kapitel 4: Zahlen
“
Max.
Linie
Rechts
Angenommen, wir erweitern die Sitzung um eine weitere Anweisung:
>>> a = 3
>>> b = a
>>> a = 'spam'
Wie alle Python-Zuweisungen erzeugt auch diese einfach ein neues Objekt, das den
String-Wert »spam« darstellt, und setzt a als Verweis auf dieses neue Objekt. Allerdings
ändert sie nicht den Wert von b. Nach wie vor verweist b auf das ursprüngliche Objekt,
die Ganzzahl 3. Es ergibt sich also die Verweisstruktur in Abbildung 4-3.
Abbildung 4-3: Namen und Objekte nach der Zuweisung a = 'spam'
Das Gleiche würde passieren, wenn wir stattdessen b auf »spam« gesetzt hätten: Die
Zuweisung würde nur b ändern, aber nicht a. Dieses Beispiel sieht besonders für ehemalige C-Programmierer sehr sonderbar aus, sieht es doch so aus, als ob der Typ von a sich
von einer Ganzzahl in einen String geändert hätte, wenn man a = 'spam' sagt. Das stimmt
nicht ganz. In Python funktionieren die Dinge etwas einfacher: Typen gehören zu Objekten, nicht zu Namen. Wir ändern nur a so, dass es auf ein anderes Objekt verweist.
Dieses Verhalten ist auch dann genau gleich, wenn die Typen gar nicht verschieden sind.
Betrachten Sie z.B. die folgenden drei Anweisungen:
>>> a = 3
>>> b = a
>>> a = 5
Max.
Linie
Bei dieser Abfolge geschieht das Gleiche: Python macht aus der Variablen a einen Verweis auf das Objekt 3 und aus b einen Verweis auf dasselbe Objekt, auf das a verweist,
wie in Abbildung 4-2 abgebildet ist. Wie schon zuvor setzt die letzte Zuweisung nur a als
Verweis auf ein völlig anderes Objekt, nämlich die Ganzzahl 5. Sie hat nicht den Seiteneffekt, auch b zu verändern. Tatsächlich gibt es keine Möglichkeit, den Wert des Objektes
3 zu überschreiben (Ganzzahlen können niemals an Ort und Stelle verändert werden,
eine Eigenschaft, die als Unveränderlichkeit, engl. immutability, bezeichnet wird).
Anders als in manchen anderen Sprachen sind in Python Variablen immer Zeiger auf
Objekte, nicht Etiketten für veränderbare Speicherbereiche.
Intermezzo: Dynamische Typisierung | 77
“
Max.
Linie
Links
Verweise und veränderliche Objekte
Wie Sie später in diesem Teil des Buchs sehen werden, gibt es aber Objekte und Operationen, die Objekte an Ort und Stelle verändern. Zum Beispiel verändern Zuweisungen an
Positionen in Listen tatsächlich das Listenobjekt selbst (an Ort und Stelle), anstatt ein
brandneues Objekt zu erzeugen. Bei Objekten, die solche Änderungen an Ort und Stelle
unterstützen, müssen Sie über gemeinsame Verweise besser Bescheid wissen, da eine
Änderung bei einem Namen Auswirkungen auf andere haben kann. Zum Beispiel unterstützen Listenobjekte die Zuweisung an Einzelpositionen an Ort und Stelle:
>>> L1 = [2,3,4]
>>> L2 = L1
Wie am Anfang dieses Kapitels erwähnt wurde, sind Listen einfache Sammlungen anderer Objekte und werden mit eckigen Klammern codiert. Also ist L1 hier eine Liste mit den
Objekten 2, 3 und 4 darin. Auf die Elemente in einer Liste wird über ihre Position zugegriffen, d.h., L1[0] steht für das Objekt 2, das erste Element in der Liste L.
Listen sind für sich genommen auch Objekte, ebenso wie Ganzzahlen und Strings. Nach
Ausführung der obigen zwei Zuweisungen verweisen L1 und L2 auf dasselbe Objekt,
genau wie im vorherigen Beispiel (siehe Abbildung 4-2). Ebenso gilt auch jetzt, dass nach
der Anweisung
>>> L1 = 24
L1 einfach auf ein anderes Objekt und L2 immer noch auf die ursprüngliche Liste verweist. Falls wir aber die Syntax dieser Anweisung leicht ändern, hat das einen völlig
anderen Effekt:
>>> L1[0] = 24
>>> L2
[24, 3, 4]
Hierbei haben wir eine Komponente des Objekts verändert, auf das L1 verweist, statt L1
selbst zu verändern. Diese Art von Änderung überschreibt einen Teil des Listenobjekts an
Ort und Stelle. Als Konsequenz tritt der gleiche Effekt auch in L2 auf, weil es auf dasselbe
Objekt wie L1 verweist.
Normalerweise ist es das, was Sie wollen, aber Sie sollten sich darüber im Klaren sein,
wie das funktioniert. Außerdem ist es das Standardverhalten: Wenn Sie ein anderes Verhalten möchten, können Sie verlangen, dass Python Kopien von Objekten statt Verweise
darauf erzeugt. Mehr Details über Listen, gemeinsame Verweise und Kopien erfahren Sie
in den Kapiteln 6 und 7.7
Max.
Linie
7 Objekte, die an Ort und Stelle verändert werden können, werden als veränderlich (engl. mutable) bezeichnet.
Dazu gehören Listen und Dictionaries, d.h., sie sind von Seiteneffekten durch Änderungen an Ort und Stelle
betroffen.
78 | Kapitel 4: Zahlen
“
Max.
Linie
Rechts
Verweise und Speicherbereinigung
Wenn Namen erzeugt werden, um auf neue Objekte zu verweisen, holt sich Python das
alte Objekt zurück, falls kein anderer Name (oder kein anderes Objekt) darauf verweist.
Diese automatische Rückforderung des Speicherplatzes, den ein Objekt belegt, wird als
Speicherbereinigung (engl. garbage collection) bezeichnet. Das bedeutet, Sie können
Objekte freizügig einsetzen, ohne jemals in Ihrem Skript Speicherplatz freigeben zu müssen. In der Praxis eliminiert das erhebliche Mengen an Verwaltungscode, die in niederen
Sprachen wie C und C++ notwendig sind.
Betrachten Sie das folgenden Beispiel, das bei jeder Zuweisung den Namen x auf ein
anderes Objekt setzt. Beachten Sie erstens, wie der Name x jedes Mal auf einen anderen
Typ von Objekt gesetzt wird. Es ist, als ob der Typ von x sich mit der Zeit verändert. Das
stimmt aber nicht ganz, denn in Python sind Typen mit Objekten verbunden, nicht mit
Namen. Weil Namen einfach nur generische Verweise auf Objekte sind, ist diese Art von
Code völlig natürlich:
>>>
>>>
>>>
>>>
x
x
x
x
=
=
=
=
42
'shrubbery'
3.1415
[1,2,3]
# holt nun 42 zurück (?)
# holt nun 'shrubbery' zurück (?)
# holt nun 3.1415 zurück (?)
Beachten Sie zweitens, dass Verweise auf Objekte dabei weggeworfen werden. Jedes Mal,
wenn ein neues Objekt an x zugewiesen wird, holt Python das vorherige Objekt zurück.
Wenn z.B. x auf den String 'shrubbery' gesetzt wird, wird das Objekt 42 sofort zurückgeholt, sofern es keinen anderen Verweis darauf gibt. Der Speicherplatz des Objekts wird
automatisch freigegeben und zum restlichen freien Speicherplatz hinzugefügt, damit er
für ein zukünftiges Objekt wiederverwendet werden kann.
Bei einigen Typen wird dieses Prinzip, technisch betrachtet, nicht ganz eingehalten. Weil
Python kleine Ganzzahlen und Strings in einen Pufferspeicher legt und wiederverwendet,
wird das Objekt 42 wahrscheinlich nicht wirklich zurückgeholt. Stattdessen bleibt es für
den Fall bestehen, dass Sie in Ihrem Code noch einmal eine 42 erzeugen. Aber die meisten
Arten von Objekten werden sofort zurückgeholt, sobald es keinen Verweis mehr darauf
gibt. Und bei den anderen ist der Pufferspeicher-Mechanismus irrelevant für Ihren Code.
Natürlich müssen Sie keine Namen/Objekt-Diagramme mit Kreisen und Pfeilen zeichnen, um Python zu benutzen. Aber am Anfang kann es manchmal hilfreich sein, um
einige Sonderfälle besser zu verstehen, wenn Sie die Verweisstruktur nachverfolgen können. Weil außerdem alles in Python aus Zuweisungen und Verweisen zu bestehen scheint,
ist ein Grundverständnis dieses Modells in vielen Kontexten hilfreich. Wie Sie z.B. noch
sehen werden, funktioniert es auf die gleiche Weise in Zuweisungsanweisungen, forSchleifenvariablen, Funktionsargumenten, Modulimporten usw.
Max.
Linie
Max.
Linie
Intermezzo: Dynamische Typisierung | 79
“
First
Index
Symbole
%-Operator (Rest/Format) 63
&-Operator (bitweises Und) 63
*-Operator (Multiplikation) 63, 338
+-Operator (Addition/Verkettung) 338
... Eingabeaufforderung 179
/-Operator (Division) 63
: (Doppelpunkt) 160
== (Vergleichsoperator) 131
>> (Shift-Operator) 63
>>> (Eingabeaufforderung) 30
^-Operator (bitweises Exklusiv-Oder) 63
_ _add_ _-Methode 352
_ _dict_ _-Attribute 283–284
_ _getattr_ _-Methode 357
_ _getitem_ _-Methode 353
_ _init_ _.py-Dateien 293
_ _init_ _-Konstruktor 338, 344, 349
_ _repr_ _-Methode 358
{ } (geschwungene Klammern) 112
|-Operator (bitweises Oder) 63
’ (Anführungszeichen) für Strings 81
A
Max.
Linie
Abbildung 111
Funktionen 242
abfangen
Ausnahmen 453, 456
benutzerdefinierte Ausnahmen 430
eingebaute Ausnahmen 426
Abfangen von Beschränkungen 432
Ablaufverfolgung 26
abs-Funktion 471
abstrakte Oberklassen 350
allgemeine Mengen-Funktionen 232
Allgemeingültigkeit, Qualifikation 285
and-Operator 63, 164
Anpassung
Dictionaries 114
IDLE 48
Klassen 334–337
Sortierung 483
Texteditoren 52
Vererbung 320
Anweisungen
assert 431
Ausdrücke 151
Begrenzungszeichen 162
definierte 143
Fehlersuche 196
if 157–160
print 32, 152–155
raise 429–431
Reihenfolge der 310
Syntax 160–164
try/except/else 421–428
try/finally 427
try/finally-Endebehandlung 428
Verbund- 32
verpacken 451
Wahrheitstests 164
while 167–169
Zusammenfassung 144
Zuweisung 144, 149, 151, 281
Anwendungen, Internationalisierung von 87
“
Max.
Linie
Links
Max.
Linie
append-Methode 109, 114, 485
apply-Funktion 239–241
Architektur 268–271
Argumente 206
Änderungen an veränderlichen 223
apply-Funktion 239–241
gemeinsame Verweise 223
Matching 225, 233
Standardwerte 260
Übergabe 222, 232, 234, 241
Argumentübergabe beim Referenzaufruf 225
argv-Attribut (sys-Modul) 93
Arrays 107
Aspektorientierte Programmierung 26
assert-Anweisung 431
Attribute 41
Architektur 269
Klassen 404
Konstruktion 347
pseudoprivate Klasse 394–396
Qualifikation 285
Suche bei der Vererbung 321
Aufgaben, Lösungen zu den 572
Aufrufe
apply-Funktion 241
einbetten 50–51
eingebaute String-Methoden 98
Funktionen 207
indirekte 257
Instanzen 360
Klassen 332
Listenmethoden 109
Methoden 346
Oberklassen-Konstruktoren 346
Signaturen 370
Ausdrücke 62–64, 151
Funktionen, Methoden 151
gemischte Typen 64
häufige 151
Klammern 63
Lambdas 236
List-Comprehension 245–249
Literale 59
Operatoren überladen 64
Werte ausgeben 151
Zahlen 65–73
ausführbare Skripte 36
eingefrorene Binärdateien 51
ausführen
interaktive Kodierung 29–32
Moduldateien 33–37
Ausführung 19–22
Code 505–508
innerhalb des Prozesses 450
Modellvariationen 22
Moduldateien 276
PVM 21
Sequenzen 160
Texteditoren 52
Ausgabe
Funktionen 204–211
Ausgabeströme
modifizieren 494
umlenken 154
Ausnahmen 415–421
abfangen 453, 456
assert-Anweisung 431
äußeres try 449
benutzerdefinierte (Beispiel) 430
eingebaute abfangen (Beispiel) 426
Fehlersuche 448–451
Klassen 434–442
Matching 455
raise-Anweisung 429–431
raw_input 448
Strings 433
Suchroutine 448
testen 452
Text 439
try/except/else-Anweisung 421–428
try/finally-Anweisung 427
verschachteln 444–448, 451–455
zusätzliche Daten übergeben 430
auspackende Zuweisungen 145
äußere try-Anweisungen 449
Auswahl von Modulen 274
automatische Erweiterungen, Windows 35
automatische Speicherverwaltung 14
B
Backslash 83, 163
Bäume 324, 347
Begrenzungszeichen
Anweisungen 162
Blöcke 161
“
Max.
Linie
Rechts
benutzerdefinierte Ausnahmen abfangen 430
benutzerdefinierte Dokumentations-Strings 186
benutzerdefinierte Iteratoren 355
Bereiche
Schleifen 178
Zeichenlisten 181
Berichte, PyDoc 189, 192
Beschränkungen 7
abfangen 432
Icon-Klicks 40
betrachten 40
Betrachtung 67
Betriebssysteme, automatische Erweiterungen
35
Beziehungen, Vererbung/OOP 372–378
Bildschirm löschen in IDLE 48
Binärdateien 499
bitweise Operatoren 63, 69
bitweises Shift, Zahlen 69
Blöcke
Begrenzungszeichen 161
-Strings 86
Blockgröße auswählen 497
Boolesche Operatoren 164
Zahlen 69
break-Anweisung 169
Bytecode 7
Escape-Sequenzen 82
kompilieren 20
C
C
Max.
Linie
Integration mit 14
Zuweisungen 173
C++ 10, 14
Callback-Funktionen 240
gebundene Methoden 388
CGI (Common Gateway Interface)
Module 501
Skripte 514, 532
chr-Funktion 471, 473
class-Anweisung 341
close-Funktion 125
cmp-Funktion 472
Code
Architektur 268–271
ausführen 505–508
Ausnahmen 433–442
C, Python und 196
Dokumentation 184–195
einbetten 50–51
Endebehandlung 428
Escape-Sequenzen 82
Fehlersuche 196
Funktionen 204–211
hello world 153
hexadezimale Notation 72
IDLE 47
interaktiver 29–32
Klassenbäume 324
Kommentare 65
kompilieren 20
Modell für dyn. Typisierung 74–79
Module 268, 278–282
Namen 212–218
oktale Notation 72
OOP 321–329
Spalte 1 196
Strings 94–97
testen 31
Unterausdrücke 63
Verwendungshinweise 44
Werkzeuge 243
Wiederverwendung 203, 326
(siehe auch Module)
COM (Microsoft Common Object Model) 474,
481
COM-Framework 513, 521
formletter.py 521
Information finden über 525
Common Gateway Interface (siehe CGI)
compile-Funktion 505
complex-Funktion 473
Constraint-basierte Programmierung 26
continue-Anweisung 169
CPython 22
csh-Shell 569
D
Dateien 124–126
ausführen 19
auswählen 274
Erweiterungen 35
Gültigkeitsbereich 216
“
Max.
Linie
Links
Max.
Linie
kopieren 490
Matching 492
Namensänderungen an mehreren 282
print-Anweisungen in 35
Scanner-Schleifen 177
verarbeiten 125
Verarbeitung 495
Dateimanipulation
glob-Modul 492
Menge von Dateien, Kommandozeile 498
open- und close-Funktionen 124
temporäre Dateien 493
Dateinamensmanipulation 491
Daten in Modulen verbergen 301–304
Datenbanken 10
Datenkapselung 301–304
Datensätze
Dictionaries 118
Klassen als 371–372
Datenstrom-Prozessoren 376
Datenstrukturmanipulation 479–485
def-Anweisung 204–205
zur Laufzeit 206
Deklaratoren 249
del-Anweisung 105, 110, 114, 138
Delegation und OOP 378
Destruktoren 361
diamantförmige Vererbung 397
Dictionaries 111–112
an Indices zuweisen
Datensätze 371–372
erzeugen 183, 485
häufige Konstanten, Operationen 112
kopieren 480
Namensräume 364
Operationen 112–115
Schlüssel 116
Sequenzoperationen 116
Sprachtabellen 115
sys.modules 306
sys.path 304
verändern 114
Verwendungshinweise 116
dir-Funktion 185, 466
Division 68
Dokumentation 184–195
COM 525
Strings 387, 388
Dokumentations-Strings 186
eingebaute 188
Standards 188
Doppelpunkte, Verbundanweisungen 196
dynamische Typisierung 12, 13, 74–79
E
Edit/Runscript-Option (IDLE) 48
editieren (siehe Texteditoren)
Effizienz eingebauter Objekte 58
einbetten
Objekte 390
Python in C 10
Sequenzen 82
einfache Variablen 285
Eingabe modifizieren 494
Eingabeaufforderungen
... 32
>>> 30
Dateierweiterungen 35
einrücken 32
interaktive 32
Verbundanweisungen 32
eingebaute apply-Funktionen 239
eingebaute Ausnahmen
abfangen 426
Klassen 438
eingebaute Dokumentations-Strings 188
eingebaute Funktionen 508
Zahlwerkzeuge 73
eingebaute Module
Binärdateien 499
cgi-Modul 501
Fehlerbeseitigung 508
Internet-Datenverarbeitung 503
Internet-Protokolle 503
Laufzeitprofil 510
string-Funktionen 474
string-Konstanten 474
time-Modul 509
urllib 502
urlparse 503
eingebaute Objekttypen 59
eingebaute String-Methoden 98
eingebaute Typen 57–59
erweitern 390–394
Fehlersuche 135–137
Hierarchien 133–134
“
Max.
Linie
Rechts
Max.
Linie
Iteratoren 254
Kategorien 126
eingebaute Werkzeuge 61
eingebauter Gültigkeitsbereich 217
eingefrorene Binärdateien 27
ausführbare 51
Einrückung 161, 196
interaktive Eingabeaufforderungen 32
einstellige Operatoren 63
elif-Klausel 157
else (Schleifen) 157, 168–169, 174
else-Anweisung 421
Endebehandlung 416, 418, 428
Endungen
komplexe Zahlen 71
(siehe auch Erweiterungen)
Entwickler-Produktivität 5
Entwicklung 21
Entwicklungsgeschwindigkeit 5
Entwurf
Ausnahmen 444–455
Entwurfsmuster 329
Funktionen 255–258
Module 305–308
OOP 369
Ereignismeldung 416
erneutes Modul-Laden 288
allgemeine Form 288
Attribute 42–44
Auswirkung auf Importe 312
Beispiel 289
Verwendungshinweise 44
erweiterte Zuweisungsanweisungen 149
Erweiterungen 7
automatische (Windows) 35
Bytecode 20
eingebaute Objekte 58
Importe als 304
Klassen neuen Stils 400
print-Anweisungen 154
Zahlen 61
Escape-Sequenzen 82
eval-Funktion 505
exec-Anweisung 505
execfile-Funktion 505–506
explizite Konfliktauflösung 398
extending
Python mit C 14
Extensible Markup Language (siehe XML)
F
Fabriken 383
feedback.py-Programm 514–520
Fehlerbehandlung 416
Fehlerbeseitigung 425, 448, 508–511
äußere try-Anweisungen 449
IDLE 48
Module 508
(siehe auch Fehlersuche)
Fehlersuche 508–511
Änderungen an veränderlichen Argumente
223
Ausnahmen 415–421, 429–431, 448–451
Code 196
explizite Konfliktauflösung 398
Funktionen 258–262
Icon-Klicks 40
if-Anweisugnen 158
Klassen 404–407
Module 308–315
Objekte 135–137
Wahrheitswerte 164
Fenster, IDLE 47
Fließkomma-Literale 60
Fließkommazahlen 59
float-Funktion 470, 473
Formatierung 212–218
Dictionaries 183, 485
for-Schleifen 173
Funktionen 204–211, 255–258
if-Anweisungen 157
Listen 485
Module 305–308
Schleifen 169–173
Strings 94–97
FormEditor-Program
Vergleich mit feedback.py 532
FormEditor-Programm 526
add_variable 530
Code 527
for-Schleifenblock 529
load_data-Funktion 530–531
select-Methode 531
formletter.py-Programm 521
Formulare, print-Anweisungen 152
for-Schleife 172–177
Variationen 178–183
Frameworks 329, 513
“
Max.
Linie
Links
COM 520–525
Entwurfsüberlegungen 532
PIL 553
Swing Java GUI 534–541
Freeware 12
from-Anweisung 279, 281
allgemeine Form 288
for-Zuweisungen 281
interaktives Testen 312
Module 309
Pakete 296
Zuweisungen 281
Funktionen 203, 235
Abbildung 242
allgemeine Menge 232
apply-Funktion 239–241
Argumentübergabe 222, 234
Aufrufe 207
Aufrufsyntax 197
Callback 240
Code 204–211
Code-Wiederverwendung 203
dir 185
eingebaute 508
Entwurf 255–258
Ergebnisse 197
Fehlersuche 258–262
Generatoren 251–255
global-Anweisung 205, 218
Gültigkeitsregeln in 212
indirekte Aufrufe 257
Iteratoren 251–255
Lambdas 235–239
map-Funktion 242
partielle Anwendung 244
Python-Code ausführen 505–508
raw_input 39, 448
return-Anweisung 205
reversed-Funktion 180
Typkonvertierungen 472
überladen 370
überschneidende Elemente 209
umgebende 214
verschachteln 219–222
Werte 231
Zahlwerkzeuge 73
Max.
Linie
G
Ganzzahlen 60, 70
lange 70
Literale 60
Zuweisungen 74
gebundene Instanzmethoden 385
gemeinsame Objektverweise 128
gemeinsame Verweise 128–130, 223
gemischte Operatoren 62
gemischte Typen, Ausdrucksoperatoren 64
gemischte Verwendungsarten, Module 303
Generator-Ausdrücke 254
Generatoren 251–255
Generierung
mehrerer Instanzobjekte 330–334
von Instanzen 371
generische Datenstrom-Prozessoren 376
Gleichheit, testen auf 131–133
global deklariert 214
global-Anweisung 205, 218
globaler Gültigkeitsbereich 213
glob-Modul 492
grapher.py 535, 540
Graphical User Interface (siehe GUI)
Groß-/Kleinbuchstaben-Unterscheidung
Namen 147
Größe von Objekten 89
große Zeichenmengen kodieren 86
GUI (Graphical User Interface)
Entwurfsüberlegungen 532
Programmierung 9
Gültigkeitsbereich 179, 362, 379
eingebauter 217
importieren 286
Lambdas 238
LGB-Regel 214
Regeln 212–218
verschachteln 206
verschachtelte Funktionen 219–222
(siehe auch Namensräume)
H
Hammond, Mark 521
»hat-eine«-Beziehung 374
hello world ausgeben 153
hexadezimale Konstanten 61
hexadezimale Literale 60
“
Max.
Linie
Rechts
hexadezimale Notation 72
hex-Funktion 473
Hierarchien
Klassen 334
Objekte 133–134
HTML (Hypertext Markup Language) 9, 515
PyDoc-Berichte 192
Hypertext Markup Language (siehe HTML)
I
Max.
Linie
Icons, Windows- 37–41
Identitätstests 131
IDLE 45–49
if-Anweisungen 157–160
imaginäre Zahlen 71
Implementation 22
import-Anweisung 505
allgemeine Form 288
als Zuweisung 281
importieren
Äquivalenz 282
Architektur 269
Attribute 42–44
Erweiterungen 304
Gültigkeitsbereich 286
Module 41–42, 271–277, 279–280
Namensstrings 308
Pakete 292–300
rekursiv 311
Verwendungshinweise 44
Zuweisungen 281
IndexError-Ausnahme 418
indirekte Aufrufe 257
indizieren 80, 90, 91
_ _getitem_ _-Methode 353
Dictionaries (siehe Dictionaries)
Klassen 353
Listen 104–110
in-Operator 63
Installation 18
Instanzen 371
Aufrufe 360
Klassen 322
mehrere -objekte 330–334
Slots 400
zusätzliche Daten schicken 440
Integration
mit C 10, 14, 51
Komponenten 10
Integrität, Tupel 123
interaktive Eingabeaufforderungen
einrücken 32
Kommandos 32
interaktive Kommandozeile, Python 29
interaktive Sitzungen 41
interaktives Testen 312
Internationalisierung von Anwendungen 87
Internet
cgi-Modul 501
Datenverarbeitung 503
Hilfsmodule 9
Protokolle 503
urllib-Modul 502
urlparse-Modul 503
Internet-Module 501–504
Interpreter nutzen 17
int-Funktion 470, 473
Introspektion 306
IronPython 23
is not-Operator 63
is-a-Relation 372
is-Operator 63, 131
Iteration 167–169, 242
benutzerdefinierte 355
Klassen 354
Strings 89
J
Java/Jython 533
Java-Bibliotheken 534
Java-Scripting 535
Nnstallation 533
Swing-Anwendung, grapher.py 535
Vergleich 540
Jython 23
K
Kanäle 495
Kapselung 369
Kategorien
Ausnahmen 434
Typen 126
KI-Programmierung 11
Klammern in Ausdrücken 63
Klassen
_ _add_ _-Methode 352
_ _getattr_ _-Methode 357
“
Max.
Linie
Links
Max.
Linie
_ _getitem_ _-Methode 353
_ _init_ _-Konstruktor 338, 344, 349
_ _repr_ _-Methode 358
aufrufen 332
Ausnahmen 434–442
Bäume 324
als Datensätze 371–372
Dokumentations-Strings 387
entwerfen mit OOP 369
Fehlersuche 404–407
generische Objektfabriken 383
Gründe für 320
Instanzen 322
Iteration 354
mehrfache Instanzobjekte 330
Methoden 344, 400
Module 336, 388
Namensräume 362–368
Namensverstümmelung 394
neuer Stil 396, 404
Oberklassen 334
Operatorüberladung 127, 337, 340, 351
Persistenz 379
Properties 401
pseudoprivate Attribute 394–396
Schnittstellen 349
Unterklassen 334–337
Vererbung 334–335, 383
Klassen neuen Stils 396, 404
klassifizierende Namen 363
Klauseln
try/else 424
try-Anweisung 422
Kommandos, interaktive Eingabeaufforderungen 32
Kommandozeilenargumente 29–32, 93
Kommentare 65, 160
Dokumentation 185
kommutative Operatoren 359
Komodo 50
kompilieren
Bytecode 20
Erweiterungen 7
Module 276
Psyco, Just-in-Time-Compiler 24
komplexe Zahlen 61, 71
Komponenten
Integration 10
mischen 27
Psyco, Just-in-Time-Compiler 24
PVM 21
Komposition 320, 374
Konfiguration
Ausnahmen 444–455
Dictionaries 112–115
Funktionen 255–258
Module 305–308
Suchpfad-Einstellungen 293
Konfliktauflösung 398
Konstanten
Listen 105
Tupel 121
Konstruktoren 326
Klassen 338, 344, 346, 349
Kontrollfluss
Anweisungen 160
ungewöhnlicher 417
verschachteln 445
Konventionen, Namens- 148, 485
Konvertierung, Strings 64, 92–95, 470–474
Konzepthierarchie 143
kopieren
copy-Modul 481
Dateien 490
Dictionaries 480
Objekte 128–130, 479
Vergleich mit verweisen 145
Verzeichnisse 490
Kopplung 255
ksh-Shell 569
Kurzschlussauswertung 165
L
Lambdas 235–239
Operatoren 63
lange Ganzzahlen 60, 70, 470
Laufzeit, def-Anweisungen 206
Laufzeitmessung 508–511
Laufzeitprofil 508–511
lazy evaluation 26
leere Sequenzen 132
leere Strings 80
Leerzeichen in Programmen 160
Leerzeilen 196
LEGB-Regel 214–215
leichte Bedienung 15
len-Funktion 89
“
Max.
Linie
Rechts
lesen von stdin 498
lexikalische Gültigkeitsbereiche 286
Links, Namensräume 367
List-Comprehension-Asdrücke 245–249
Listen
an Ort und Stelle ändern 108
Dictionaries 116
einfache Operationen auf 106
erzeugen 485
häufige Konstanten 105
Indizierung und Slicing 107
Methoden 109
Objekte 131–133
Operationen 106
sys.path 274
Tupel 123
Zeichen 181
list-Funktion 472
Literale 59
Dictionaries 112
Fließkomma 60
Listen 105
Strings 81–88
Tupel 121
Zahlen 60
logisch falsche Objekte 132
logische Operatoren 63
logische Programmierung 26
lokale Variablen 211
lokaler Gültigkeitsbereich 213
long, C 470
long-Funktion 473
Lösungen zu den Aufgaben 572
Lundh, Fredrik 553
M
Max.
Linie
Manuale (siehe Dokumentation)
map-Funktion 181, 242
Matching
Argumente 225, 233
Ausnahmen 455
Dateien 492
Matritzen 107
max-Funktion 474
mehrdimensionale Arrays 107
mehrere Instanzobjekte 320, 330–334
mehrfache Vererbung 405
Klassen 380
Reihenfolge 405
mehrfache Verzweigung 159
Werkzeuge 238
Mehrfachziel-Zuweisungen 146
mehrzeilige Block-Strings 86
Mengen-Objekte 123
Metaprogramme 306, 308
Methoden
Aufrufe 346
Dictionaries 115
Klassen 344
Listen 109
Operatorüberladung 352
Strings 97
Microsoft Common Object Model (siehe COM)
min-Funktion 473
Mischen von Komponenten 27
Mixins 381
Modelle
Ausführung 22
dynamische Typisierung 74–79
Modifikation
Ausgabe 494
Dictionaries 114
Eingabe 494
Strings 94, 98
veränderliche Typen 103
Module 57, 267, 316
_ _name_ _ und _ _main_ _ 303
Attribute 42–44
ausführen 276
auswählen 274
Code 268
copy 481
Dateien 33–37
Datenkapselungskonvention 301–304
definieren 278–282
Entwurf 305–308
erneut laden 312
Erweiterungen 304
Fehlersuche 308–315
gemischte Verwendungsarten 303
Gültigkeitsbereich 216
importieren 41–42, 271–277
Internet 501–504
Klassen 336, 388
kompilieren 276
Namensräume 283–287
Pakete 292, 300
“
Max.
Linie
Links
shutil 490
Standardbibliothek 271
suchen 272
Suchpfad ändern 304
Verwendungshinweise 44
Zahlwerkzeuge 73
(siehe auch erneutes Modul-Laden)
Module definieren 278–282
Muster
eingebaute String-Methoden 98
Entwurfs- 329
N
Namen
Änderungen an mehreren Dateien 282
Konventionen 148, 485, 487
Moduldateien 42–44
Qualifikation 285, 363
Typen 148
unqualifizierte Namen 362
Variablen-, Regeln 147
Verstümmelung 394
Verweis 145
Zuweisung 145
Namensänderungen an mehreren Dateien 282
Namensräume 212, 323, 362–368
Baumkonstruktion 347
class-Anweisung (Beispiel) 342
Dictionaries 364
LGB-Regel 214
Links 367
Module 268, 283–287
(siehe auch Gültigkeitsbereiche)
Negationsoperator 63
negative Abstände, Strings 90
None-Objekt 109, 133, 170, 197
not in-Operator 63
not-Operator 63, 164
numerische Genauigkeit 60
numerische Objekte
bitweise Operationen 69
lange Ganzzahlen 70
numerische Programmierung 11
NumPy, numerische Programmier-Erweiterung
11
Max.
Linie
O
Oberflächen
IDLE 45–49
Komodo 50
Programmierung 9
(siehe auch GUI)
Oberklassen 322, 334
abstrakte 350
Konstruktoren 346
oberste Ebene, Kopien auf 130
Objektänderung an Ort und Stelle 78
Objekte 57
Änderung an Ort und Stelle 78
einbetten 390
eingebaute 58
Fabriken 383
Fehlersuche 135–137
Funktionen 205
Gleichheitstests 131
Hierarchien 133–134
Klassifikation 126
kopieren 128–130, 479
Listen 104–106
Literale 59
mehrere Instanz- 330–334
Mengen 123
Namensräume 363
operations 106
Persistenz 10, 379
shared references 128–130
String-Methoden 97
veränderliche 260
Verbundtypen 126
Vergleiche 131–133
Wahrheitswerte 132
Zahlen 59–62, 65–73
objektorientierte Programmierung (siehe OOP)
Objektverweis
Erzeugung 145
Funktionen 205
oct-Funktion 473
offene Paar-Regel 163
öffnen von Windows-Icons 37–41
Oktalzahlen
Konstanten 61
Literale 60
Notation 72
“
Max.
Linie
Rechts
OOP (Object-Oriented Programming) 12
Delegation 378
entwerfen mit 369
Fabriken 383
Klassen (Beispiel) 330
Klassenobjekte 330, 334
Überblick 321–329
Vererbung 372–378
Open Source-Software 12
open-Funktion 124
Operationen
Dateien 124
Dictionaries 112–115
Listen 106
Tupel 121
Operatoren
Ausdrücke 62–64
Klassen 337
kommutative 359
Strings 88–94
überladen 64, 320
Überladung 127
Klassen 337, 340, 351
Vorrang 62
Optionen, Dictionaries 114
ord-Funktion 471, 473
or-Operator 63, 164
os.environ-Dictionary 488
os.error-Ausnahme 488
os.listdir-Funktion 491
os.name-Attribut 488
os.path-Modul, -Funktionen 489
os.rename-Funktion 491
os-Modul 486–490, 522
Attributdefinition 488
Funktionen (oft benutzte) 486
String-Attribute 489
Ousterhout, John 526
P
Max.
Linie
Pakete
importieren 292–300
Module 300
parallele Traversierungen 181
Parameter, Funktionen 206
parsen
Argumente 222, 234
raise-Anweisungen 430
Text 101
partielle Anwendung von Funktionen 244
pass-Anweisung 169
PATH-Umgebungsvariable 37, 530
Performance 21
Perl-Sprache 15
Persistenz 379
Pfade
Module 272
Qualifikation 285
Suche 304
suchen 293
pickle-Modul 10, 520, 522
PIL (Python Imaging Library) 513
Polymorphie 208, 210, 230, 369
portable Datenbank-APIs 10
portables ANSI-C 13
positive Abstände, Strings 90
POSIX-Konventionen 487
print-Anweisungen 32, 152–155
in Dateien 35
Zahlen 67
Produktivität 5
profile-Modul 511
Programmierung 9
Architektur 268–271
ausführen 505–508
Ausnahmen 433–442
Code-Wiederverwendung 204
Datenbanken 10
Dokumentation 184–195
Endebehandlung 428
Fehlersuche 196
Funktionen 204–211
GUI 9
hello world 153
Interpreter 17
KI 11
Klassenbäume 324
Kommentare 65
Modell für dyn. Typisierung 74–79
Module 268, 278–282
Namen 212–218
numerische 11
OOP 321–329
String-Methoden 97
Strings 94–97
“
Max.
Linie
Links
Struktur 57
Werkzeuge 243
Programmstruktur 269
Properties
Klassen 401
Listen 104–106
Syntaxregeln 160–164
Prototyp-Erstellung 11
pseudoprivate Klassenattribute 394–396
Psyco, Just-in-Time-Compiler 24
pth-Dateiverzeichnisse 273
PVM (Python Virtual Machine) 21
PyDev 50
PyDoc-Werkzeuge 189
HTML-Berichte 192
PyPy 25
Python ausführen
eingebetteter Code, Objekte 50–51
interaktive Kommandozeile 29–32
Interpreter 18
Moduldateien 33–37
Unix-artige Skripte 36
Python Imaging Library (PIL) 553
Python Virtual Machine (PVM) 21
Python.NET 23
PYTHONPATH-Variable 568
Verzeichnisse 273
PYTHONSTARTUP-Variable 568
PythonWin 50
Q
Qualifikation
_ _getattr_ _-Methode 357
Namen 285, 363
Qualität 4
Quellcode kompilieren 20
R
Max.
Linie
raise-Anweisung 429–431, 442
random-Modul 483
Rapid Prototyping 11
raw_input-Funktion 39, 448
re.compile( ) (Strings) 477
Rechte, ausführbare Skripte 36
Regeln
Gültigkeitsbereiche 212–218
LEGB 215
offene Paare 163
Syntax 160–164
reguläre Ausdrücke 474, 479
rekursiv importieren 311
re-Modul 474, 479
Repräsentationen, Strings 358
reservierte Wörter 147
Restoperator 63
return-Anweisungen 197, 205
reversed-Funktion 180
rohe Strings, Escapes unterdrücken 85
Rollen, Ausnahmen 416
RPython 25
S
Schleifen
Bereiche 178
Datei-Scanner 177
else 157, 169, 174
for 172–183
Formatierung 169–173
String-Iteration 89
verschachteln 246
while 167–169
Schlüsselwort-Argumente 226–234
Übergabe 241
Schnittstellen
Klassen 349
PyDoc 189
PythonWin 50
schreiben
auf sys.stdout 155
(siehe auch Code)
schreibweisenunabhängige Sortierung 483
Scripting 6, 9
Internet 9
PVM 21
Sprachen 13
umlenken 155
Unix-ähnliches 36
verpacken 451
Sequenzen 80
Ausführung 160
einbetten 82
Funktionen 242
Listen 106
überschneidende Elemente 209
unterdrücken 85
“
Max.
Linie
Rechts
Max.
Linie
Shell-Werkzeuge 6
shelve-Modul 379
Shift-Operatoren 63
shutil-Modul 490
Signaturen, Aufrufe 370
Slicing 80, 90–91
Listen 107
Zuweisungen 108
Slots, Instanzen 400
Software-Qualität 4
Sortierung anpassen 483
sort-Methode 109, 482
spärliche (sparse) Datenstrukturen, Dictionaries
für 117
Speicher, automatische Verwaltung von 14
Speicherbereinigung 14
Verweise 79
speichern, Text 33
Spezialfall, Behandlung 416
Spiele 11
Sprachen
Vergleiche mit 15
zukünftige Eigenschaften einschalten 302
Sprachtabellen, Dictionaries 115
Stackless Python-System 25
Stacks 444
Standardargumente 227, 229, 260
Standard-Ausnahmebehandler 418
Standard-Bibliotheksmodule 271
Standard-Manualsatz 193
Standards, Dokumentations-Strings 188
Startoptionen 52
Startverzeichnis 272
statisch verschachtelte Gültigkeitsbereiche 219–
222
statische lokale Funktionsvariablen 260
statische Methoden, Klassen neuen Stils 400
Stein, Greg 521
Steuersprache 6
str-Funktion 472
string-Modul 474
Ersetzungsoperation 478
Funktionen 474
Konstanten 474
Problem mit regulären Ausdrücken 476
Strings
ändern, formatieren 94
Ausnahmen 433
Block- 86
Codes 96
definierte 80
Dokumentation 387–388
einfache Operationen 88–94
Formatierung 94–97
indizieren 90–91
Konstanten, Operationen 81
Listen 106
Literale 81–88
Methoden 97
modifizieren 94, 98
Slicing 90–91
Typkategorien 102
zurückgeben 358
Strings in doppelten Anführungszeichen 82
Strings in dreifachen Anführungszeichen 86
Strings in einfache Anführungszeichen 82
Strom-Umlenkung 34
struct-Modul 499
Formatierungscodes 500
suchen
Ausnahmen 448
Module 272
Pakete 293
-Pfad ändern 304
Vererbung 321
Swing Java GUI-Toolkit 513
syntaktische Verschachtelung 446
Syntax
Anweisungen 160–164
apply-Funktion 241
Ausführungssequenzen 160
Backslash 163
offene Paare 163
Syntaxregeln
Anweisungs-Begrenzungszeichen 162
Blöcke 160–161
Leerzeichen, Kommentare 160
Variablennamen 147
Verbundanweisungen 160
sys.modules-Dictionary 306
sys.path-Dictionary 304
sys.path-Listen 274
sys.stdout, Schreiben auf 155
Systemprogrammierung 9
Max.
Linie
“
Links
T
Max.
Linie
Tabellen, Dictionaries 115
Tainting 26
tempfile-Modul 520
temporäre Dateien 493
Testen 508–511
testen
Ausnahmen 452
Code 31
Gleichheit 131–133
if-Anweisugnen 158
innerhalb des Prozesses ausführen 450
interaktiv 312
Wahrheitswerte 164–166
Tests hinzufügen 246
Tests innerhalb des Prozesses ausführen 450
Text 86
Ausnahmen 439
Dokumentations-Strings 188
Kommentare 65
parsen 101
speichern 33
String-Methoden 97
Strings modifizieren 94
umlenken 154
Texteditoren
Module 278–282
Startoptionen 52
time-Modul 509
Tk/Tkinter 9, 513, 526–532
GUI 513
Umgebungseinstellungen 569
Tracing 26
Traversierungen
parallele 181
Schleifen 180
try/except/else-Anweisung 421–428
try/finally-Anweisung 427
try-Anweisung 422
try/except/else-Anweisung 421
try/finally-Anweisung 427
Tupel
definierte 120–123
Eigenschaften 121
Funktionen 472
Inhalt sortieren 482
Zuweisung 145
Typen
Dateien 124–126
eingebaute 390–394
Einschränkungen 205
Fehlersuche 135–137
Gründe für eingebaute 57–59
Hierarchien 133–134
Iteratoren 254
Kategorien 102, 126
konvertieren 64, 472
Modell für dyn. Typisierung 74–79
Namen 148
Objekte 126
Sammlungstupel 120–123
veränderliche 103
Zahlen 59–62
U
Übergabe von Schlüsselwortargumenten 241
überladen von Operatoren 64, 127, 320
Klassen 340, 351
Übersetzung, Psyco, Just-in-Time-Compiler 24
umgebende
Ausdrücke 63
Funktionen 214
Umgebung 567
umlenken
Ausgabeströme 154
Skripte 155
ungebundene Klassenmethoden 385
Unicode-Strings 86
Unix-ähnliche System-Skripte 36
unqualifizierte Namen 362
Unterausdrücke 63
unterdrücken von Escape-Sequenzen 85
Unterklassen 322, 334, 391
unveränderliche Sequenzen 80
unveränderliche Typen ändern 137
urllib-Modul 502
urlparse-Modul 503
URLs, urllib-Modul 502
V
van Rossum, Guido 541
Variablen 43
einfache 285
lokale 211
“
Max.
Linie
Rechts
Max.
Linie
Namensregeln 147
Zahlen 65
Zuweisungen 74
Variationen, Ausführungsmodelle 22
veränderliche Argumente, Änderungen an 223
veränderliche Objekte 260
veränderliche Typen 103
Veränderlichkeit 80, 103, 137
Verarbeitung
Dateien 125, 495
Zahlobjekte 61
Zeilen 499
Verbergen von Objekten 26
Verbreitung von Ausnahmen 420, 431
Verbundanweisungen 32, 160
Verbundobjekttypen 126
Vererbung 320, 369
Anpassung 320
diamantförmig 397
Klassen 334, 383
Konstruktion von Namensraumbäumen 347
mehrfache 405
OOP 372–378
Spezialisierungsmethoden 348–350
Suche 321
Vergleiche 470–474
importieren/Gültigkeitsbereiche 286
Klassen/Module 388
Objekte 131–133
Operatoren 63
Sprachen 15
Zahlen 472
Verkettung 80
+ (Addition/Verkettung) 338
Strings 88–94
Verpacken von Anweisungen 451
verschachteln
Ausnahmen 444–448, 451–455
Blöcke 160
Funktionen 219–222
Gültigkeitsbereiche 154, 206, 366
Kontrollfluss 445
Lambdas 238
Listen 107
Namensräume 213, 287
Schleifen 246
syntaktisch 446
Verwaltung von Speicher, automatische 14
Verweise
Argumente 223
gemeinsame 128–130
Objektänderung an Ort und Stelle 78
Speicherbereinigung 79
Vergleich mit Kopien 145
Zuweisungen 135
Verwendungshinweise 44, 116
Verzeichnisse kopieren 490
verzögerte Auswertung 26
Vorrang
Ausdrücke 63
Regeln (Operatoren) 62
Vorwärtsverweise 310
W
Wahrheitswerte
Objekte 132
testen 164–166
Webseiten, cgi-Modul 501
Website-Ressourcen XXII
Werkzeuge
Ausdrücke 62–64
Dokumentation 185
eingebaute Funktionen 73
mehrfache Verzweigung 238
Programmierung 243
PyDoc 192
Shell 6
Zahlen 61
Werte
Funktionen 231
Standardargumente 260
Wahrheitswerte 164–166
Wahrheitswerte für Objekte 132
while-Schleife 167–169
Wide-Character-Strings 86
Wiederholung, eine Ebene tief 136
win32com 521
Dispatch-Funktion 522
formletter.py-Programm 521
Windows
automatische Erweiterungen 35
Icons 37–41
(siehe auch Oberflächen)
Wing IDE 50
Max.
Linie
“
Links
X
XML (Extensible Markup Language) 9, 11, 14
Z
Zahlen 59–62, 67, 470–474
Ausdrücke 62–64
Dezimalzahlen 74
einfache Operationen 65–73
eingebaute Typen 57–59
komplexe Zahlen 71
print-Anweisungen 67
Zuweisungen 74
Zählschleifen 167–169, 178
Zeichen
große Mengen kodieren 86
Listen 181
Zeilen, Verarbeitung 499
zip-Funktion 181, 183
Zope 559
Zusammenhalt 255
zusätzliche Daten an Instanzen schicken 440
Zuweisungen 74
C 173
Funktionen durch 205
Listen 108
Namen, klassifizierende 363
Objektänderung an Ort und Stelle 78
Verweise 135
Zuweisungsanweisungen 144, 149, 151, 281
Formen 145
implizite 145
Objektverweise 145
Regeln für Variablennamen 147
zyklische Datenstrukturen ausgeben 136
Max.
Linie
Max.
Linie
“
Herunterladen