Python-Programmierung: Sprachkonstrukte
Aus Wikibooks
Dieses Kapitel gibt eine methodische Einführung in den Aufbau von Python-Programmen. Wir beginnen mit der Syntax der Sprache; dies sind die Regeln, die die Schreibweise betreffen.
Inhaltsverzeichnis |
[Bearbeiten] Zeilen, Einrückung, Kommentare
Leerzeilen können an beliebiger Stelle in ein Programm eingefügt werden. Als Leerzeile gilt jede Zeile, die keine sichtbaren Zeichen enthält. Solche Zeilen werden grundsätzlich ignoriert, sofern sie nicht Teil einer Zeichenkette (siehe "Zeichenketten" weiter unten) sind.
Kommentare können an beliebiger Stelle in einem Programm erscheinen. Sie werden durch das Zeichen # ("Hash") eingeleitet. Der folgende Text bis zum Zeilenende wird bei der Abarbeitung eines Programmes ignoriert.
Einrückungen spiegeln in Python die Programmstruktur wieder. Dabei gelten folgende Regeln:
- Die erste Zeile eines Programmes darf weder mit Leerzeichen oder Tabulatoren eingerückt sein.
- Eine Einrückung von Zeilen ist immer dann notwendig, wenn ein Block eröffnet wird. Alle Zeilen, die zum selben Block gehören, müssen identisch eingerückt sein.
- Ausnahmen sind nur in Zeichenketten erlaubt, oder innerhalb eindeutig durch Klammerung erkennbarer Ausdrücke.
Üblicherweise wird genau eine Anweisung pro Zeile geschrieben. Unüblich aber zulässig ist, mehrere Anweisungen auf eine Zeile zu schreiben und mit Semikolon zu trennen.
[Bearbeiten] Beispiele
Ein Kommentar. Der Interpreter gibt nichts aus.
>>> # dies ist ein Kommentar ... >>>
Kommentare können an beliebiger Stelle erscheinen
>>> 1 # eine Eins 1
Die Einrückung von Zeilen ist nicht beliebig. Ein Leerzeichen vor einer Eingabe führt zu einer Fehlermeldung
>>> 1 # führendes Leerzeichen
File "<stdin>", line 1
1
^
SyntaxError: invalid syntax
Einrückungen kennzeichnen Blöcke, hier z.B. eine Fallunterscheidung. Unterschiedliche Blöcke können unterschiedlich weit eingerückt sein.
>>> if True: ... "Ja" ... else: ... "Nein" ... 'Ja'
[Bearbeiten] Konstanten
Konstanten sind die die elementaren Datentypen, die in Programmen verwendet werden können. Sie sind die einfachsten Sprachkonstrukte nach Kommentaren und Leerzeilen. Der Datentyp einer Konstante wird durch deren Schreibweise ausgedrückt. Leser mit Programmierkenntnissen werden Ähnlichkeiten zu anderen Sprachen feststellen. Trotzdem lohnt es sich, die folgenden Abschnitte zumindest zu überfliegen, da Python auch einige ungewöhnliche aber praktische Besonderheiten besitzt.
Für jeden Ausdruck (nicht nur Konstanten) kann man sich mit der Funktion type() den Typ anzeigen lassen:
>>> type(1)
<type 'int'>
>>> type('Hallo')
<type 'str'>
>>> type(type)
<type 'type'>
[Bearbeiten] Wahrheitswerte
Wahrheitswerte sind das Ergebnis logischer Ausdrücke, also z.B. von Vergleichen. Es gibt genau zwei solche Werte: True für wahr und False für falsch.
>>> 1 > 2 False >>> 2 > 1 True >>> type(True) <type 'bool'> >>> type(False) <type 'bool'>
[Bearbeiten] Zahlen
Es gibt vier Arten von Zahlen in Python:
- Ganze Zahlen (
int) - Beliebig lange ganze Zahlen (
long) - Fließkommazahlen (
float) - Komplexe Zahlen (
complex).
[Bearbeiten] Ganze Zahlen (int)
Ganze Zahlen werden im Dezimalsystem als einfache Ziffernfolge geschrieben, wobei nach Bedarf ein Vorzeichen vorangestellt werden kann, z.B. 123, -4711. Von führenden Nullen ist dringend abzuraten, wie das folgende Beispiel zeigt:
>>> 0815
File "<stdin>", line 1
0815
^
SyntaxError: invalid token
Wenn eine Zahl mit einer führenden Null angegeben ist, wird die Zahl im Oktalsystem ausgewertet, also zur Basis 8. Zahlen, die mit 0x beginnen, werden im Hexadezimalsystem ausgewertet, also zur Basis 16.
>>> 010 # oktal 8 >>> -0100 # oktal -64 >>> -0x100 # hexadezimal -256
[Bearbeiten] Beliebig lange ganze Zahlen (long)
Der Zahlentyp int kann keine beliebig großen Zahlen darstellen. Dies ist Aufgabe des Typs long. Er unterscheidet sich in der Schreibweise durch Hinzufügen des Buchstaben L (in Groß- oder Kleinschreibung) nach der Ziffernfolge. long-Werte können wie jede ganze Zahl im Oktal- oder Hexadezimalsystem geschrieben werden. Wenn das Ergebnis einer ganzzahligen Berechnung außerhalb des Wertebereichs von int liegt, wird automatisch long als Ergebnistyp benutzt. Die umgekehrte Umwandlung (von long nach int) erfolgt jedoch nicht automatisch.
>>> 1111111111111111111111 # automatische Umwandlung 1111111111111111111111L >>> 999 ** 99 # 999 hoch 99 ist eine etwas größere Zahl 90569784495866770974195656280275310090138980613960953881501965823101750409706475240 38461398929683905540248523961720824412136973299943953409012824494268482161468659359 61454742677324005498146550510264840271813301125214581059267630055862747172378231729 576039278689152963667155086263379780844149098999L >>> 1L # Eins als long, keine automatische Umwandlung zu int 1L >>> 0x100L # hexadezimal 256L >>> -010L # oktal -8L
[Bearbeiten] Fließkommazahlen (float)
Fließkommazahlen werden mit einem Dezimalpunkt notiert (englische Schreibweise), dem Nachkommastellen folgen können (aber nicht müssen). Fließkommazahlen werden grundsätzlich im Dezimalsystem geschrieben.
>>> 10.0 / 3.0 # Division mit Fließkomma 3.3333333333333335 >>> 10. / 3. # Die Null nach dem Dezimalpunkt kann weggelassen werden 3.3333333333333335 >>> 10,0 / 3,0 # Überraschung! Dies ist keine Division mit Fließkomma, sondern ein Tupel (s.u.) (10, 0, 0)
[Bearbeiten] Komplexe Zahlen (complex)
Komplexe Zahlen werden außerhalb wissenschaftlicher Anwendungen selten verwendet. Sie werden durch das Anhängsel J (in Groß- oder Kleinschreibung) an den imaginären Teil gekennzeichnet.
[Bearbeiten] Zusammenfassung
Alle Zahlentypen im Schnelldurchlauf:
>>> type(1) <type 'int'> >>> type(1L) <type 'long'> >>> type(1.0) <type 'float'> >>> type(1+1j) <type 'complex'>
[Bearbeiten] Zeichenketten
Eine Zeichenkette (engl. String) besteht aus Buchstaben, ist also ein Wort oder längerer Text. Was genau dabei ein Buchstabe ist, hängt ggf. von den landessprachlichen Einstellungen des Rechners ab, auf dem Python ausgeführt wird. Für Maschinen, die auf Deutsch eingestellt sind, ist dies i.d.R. ISO Latin-1, ISO Latin-15 oder UTF-8.
Zeichenketten werden durch einfache Apostrophe, doppelte ("Gänsefüßchen") oder dreifache Anführungszeichen begrenzt, wie hier:
>>> 'abc' # Apostroph 'abc' >>> "die Katze" # Gänsefüßchen 'die Katze' >>> """lief ... im Schnee""" 'lief\nim Schnee'
Die Besonderheit bei dreifachen Anführungszeichen ist, daß eine Zeichenkette mehrere Zeilen umfassen kann. Als Begrenzung können sowohl dreifache Apostrophe als auch dreifache Anführungszeichen benutzt werden.
[Bearbeiten] Sonderzeichen
Je nach landessprachlicher Einstellung können Umlaute verwendet werden:
>>> "öäü" '\xc3\xb6\xc3\xa4\xc3\xbc' >>> print "öäü" öäü
Im interaktiven Modus werden Ergebnisse sofort ausgegeben, ohne daß dazu eine print-Anweisung nötig ist. Allerdings unterscheidet sich das sichtbare Ergebnis je nach Ausgabemethode. Mit print werden lesbare Zeichen angezeigt, während im Taschenrechner-Modus Sonderzeichen im Wert der aktuellen Codierung ausgegeben werden (im Beispiel oben in UTF-8).
In Zeichenketten kann man Steuerzeichen wie Tabulatoren und Zeilenumbrüche mit einer speziellen Schreibweise angeben, die der Programmiersprache C entlehnt ist. Einige dieser Zeichen sind eher von historischer Bedeutung, da sie urprünglich zur Steuerung von Terminals dienten.
| \Zeilenende | Kein Effekt |
| \\ | Schrägstrich rückwärts |
| \a | Steuerzeichen BEL (Tonsignal) |
| \b | Rückwärtsschritt (1 Zeichen) |
| \f | Seitenende |
| \n | Zeilenvorschub |
| \r | Rücklauf zum Zeilenanfang |
| \t | (Horizontaler) Tabulator |
| \v | Vertikaler Tabulator |
Um beliebige Zeichen darstellen zu können, können Ordnungszahlen von Zeichen in Hexadezimal- oder Oktal-Schreibweise benutzt werden, z.B in UTF-8:
>>> "\xc3\xb6\xc3\xa4\xc3\xbc" # Hexadezimal öäü >>> "\303\244" # Oktal ä
Dummerweise ist die Codierung vom jeweils eingestellten Zeichensatz abhängig, weswegen Programme, die Zeichen auf diese Art codieren, nicht portabel sind. Eine bessere Lösung sind Unicode-Strings, die im nächsten Abschnitt erklärt werden.
[Bearbeiten] String-Varianten
Einfache Strings sind für die allermeisten Anwendungsfälle ausreichend. Probleme treten meist erst dann auf, wenn Programme auf verschiedene Landessprachen angepaßt werden sollen, oder wenn Reguläre Ausdrücke ins Spiel kommen. Hierfür gibt es spezielle Formen von Strings.
Ein Unicode-String kann sämtliche auf einem Computer darstellbaren Zeichen enthalten. Es werden beliebige Schriftarten unterstützt, insbesondere auch nicht-lateinische z.B. Kyrillisch, Arabisch oder Chinesisch.
Unicode-Strings werden durch ein führendes U bzw. u gekennzeichnet. In Ihnen können beliebige Zeichen als Hexadezimal-Code angegeben werden, der durch die Zeichen \u eingeleitet wird. Mit der Funktion unicode lassen sich normale Zeichenketten nach Unicode umwandeln, wobei die Codierung des Originals angegeben werden sollte.
>>> U"\u00e4" u'\xe4' >>> unicode( 'öäü', 'UTF-8') u'\xf6\xe4\xfc'
Wenn die Auswertung von Steuerzeichen in einer Zeichenkette nicht gewünscht wird, kann man diese mit einem führenden r oder R deaktivieren. Dies ist meist bei Regulären Ausdrücken sinnvoll. Es kann auch in Kombination mit Unicode-Strings eingesetzt werden.
>>> "\r\n" # Normaler String '\r\n' >>> r"\r\n" # Ohne Auswertung von Steuerzeichen '\\r\\n' >>> u"\r\n" # Unicode-String u'\r\n' >>> ur"\r\n" # Ohne Auswertung von Steuerzeichen u'\\r\\n'
[Bearbeiten] Tupel
In einem Tupel können mehrere Werte zusammengefasst werden. Dies kann z.B. zur gleichzeitigen Zuweisung mehrerer Variablen benutzt werden, zur Iteration über mehrere Variablen, oder um mehrere Werte aus einer Funktion zu erhalten. Tupel werden als Liste geschrieben, deren Einträge durch Komma getrennt sind. Die gesamte Liste wird üblicherweise durch runde Klammern begrenzt, wobei diese häufig weggelassen werden können.
>>> t = (1, 2) >>> t (1, 2) >>> 1, 2, 3 (1, 2, 3)
Spezialfall: Um ein Tupel mit nur einem Eintrag zu erhalten, wird ein abschließendes Komma verwendet.
>>> 1, (1,)
Die Werte eines Tupels können anhand ihrer Position abgerufen werden, wobei 0 die erste Position bezeichnet, 1 die zweite usw.
>>> t[0] 1
Wie alle Sequenzen in Python unterstützen Tupel die sog. Iteration. Diese wird in einem späteren Abschnitt genauer erklärt.
>>> for i in 2, 3, 5, 7: print i ... 2 3 5 7
Tupel sind ein nicht veränderbarer Datentyp, d.h. es können nicht nachträglich einzelne Werte verändert werden.
>>> t[0] = 3 Traceback (most recent call last): File "<stdin>", line 1, in ? TypeError: object doesn't support item assignment
[Bearbeiten] Listen
[Bearbeiten] Assoziative Listen (Dictionaries)
[Bearbeiten] None
Eine Variable vom Typ None hat keinen Wert. Er wird da benutzt, wo es ganz ohne Wert Fehler gäbe, z.B.bei nicht definierten Rückgabewerten (diese blendet der Debugger aus).

