Programmieren in Python//Eine praktische Einführung · 12 1Einführung 1.1 Python-Hintergrund...

123
Programmieren in Python Eine praktische Einführung tuxcademy – Linux- und Open-Source-Schulungsunterlagen für alle https://www.tuxcademy.org [email protected]

Transcript of Programmieren in Python//Eine praktische Einführung · 12 1Einführung 1.1 Python-Hintergrund...

  • Programmieren in PythonEine praktische Einfhrung

    tuxcademy Linux- und Open-Source-Schulungsunterlagen fr allehttps://www.tuxcademy.org [email protected]

  • Das tuxcademy-Projekt bietet hochwertige frei verfgbare Schulungsunterlagenzu Linux- und Open-Source-Themen zum Selbststudium, fr Schule, Hoch-schule, Weiterbildung und Beruf.Besuchen Sie https://www.tuxcademy.org/! Fr Fragen und Anregungen stehen wirIhnen gerne zur Verfgung.

    Programmieren in Python Eine praktische EinfhrungRevision: pyth:e431aefb71298e66:2016-07-18

    pyth:4294f89813971178:2016-07-18 17pyth:EfL030ydsekLVrB525xdF7

    2015 Linup Front GmbH 2016 tuxcademy (Anselm Lingnau) Mainzhttps://www.tuxcademy.org [email protected] Tux Larry Ewing (CC-BY-Lizenz)

    Alle in dieser Dokumentation enthaltenen Darstellungen und Informationen wurden nachbestem Wissen erstellt und mit Sorgfalt getestet. Trotzdem sind Fehler nicht vllig auszu-schlieen. Das tuxcademy-Projekt haftet nach den gesetzlichen Bestimmungen bei Scha-densersatzansprchen, die auf Vorsatz oder grober Fahrlssigkeit beruhen, und, auer beiVorsatz, nur begrenzt auf den vorhersehbaren, typischerweise eintretenden Schaden. DieHaftung wegen schuldhafter Verletzung des Lebens, des Krpers oder der Gesundheitsowie die zwingende Haftung nach dem Produkthaftungsgesetz bleiben unberhrt. EineHaftung ber das Vorgenannte hinaus ist ausgeschlossen.Die Wiedergabe von Warenbezeichnungen, Gebrauchsnamen, Handelsnamen und hn-lichem in dieser Dokumentation berechtigt auch ohne deren besondere Kennzeichnungnicht zu der Annahme, dass solche Namen im Sinne des Warenzeichen- und Marken-schutzrechts frei seien und daher beliebig verwendet werden drften. Alle Warennamenwerden ohne Gewhrleistung der freien Verwendbarkeit benutzt und sind mglicherweiseeingetragene Warenzeichen Dritter.

    Diese Dokumentation steht unter der Creative Commons-BY-SA 4.0 International-Lizenz. Sie drfen sie vervielfltigen, verbreiten, und ffentlich zugnglich machen, solan-ge die folgenden Bedingungen erfllt sind:Namensnennung Sie mssen darauf hinweisen, dass es sich bei dieser Dokumentation

    um ein Produkt des tuxcademy-Projekts handelt.Weitergabe unter gleichen Bedingungen Sie drfen die Dokumentation bearbeiten, ab-

    wandeln, erweitern, bersetzen oder in sonstiger Weise verndern oder darauf auf-bauen, solange Sie Ihre Beitrge unter derselben Lizenz zur Verfgung stellen wiedas Original.

    Mehr Informationen und den rechtsverbindlichen Lizenzvertrag finden Sie unterhttp://creativecommons.org/licenses/by-sa/4.0/

    Autor: Anselm LingnauTechnische Redaktion: Anselm Lingnau [email protected] in Palatino, Optima und DejaVu Sans Mono

  • Inhalt

    1 Einfhrung 111.1 Python-Hintergrund. . . . . . . . . . . . . . . . . . . 121.2 Python als Programmiersprache . . . . . . . . . . . . . . 131.3 Ein einfaches Python-Programm . . . . . . . . . . . . . . 151.4 Python interaktiv . . . . . . . . . . . . . . . . . . . . 18

    2 Einfache Datentypen 212.1 Numerische Datentypen und Literale . . . . . . . . . . . . 222.2 Numerische Ausdrcke . . . . . . . . . . . . . . . . . 242.3 Variable . . . . . . . . . . . . . . . . . . . . . . . 272.4 Zeichenketten . . . . . . . . . . . . . . . . . . . . . 29

    2.4.1 Zeichenketten-Literale . . . . . . . . . . . . . . . . 292.4.2 Zeichenketten-Ausdrcke. . . . . . . . . . . . . . . 31

    3 Verzweigungen und Schleifen 333.1 Verzweigungen mit if . . . . . . . . . . . . . . . . . . 34

    3.1.1 Einstieg . . . . . . . . . . . . . . . . . . . . . 343.1.2 Boolesche Ausdrcke . . . . . . . . . . . . . . . . 343.1.3 else und elif . . . . . . . . . . . . . . . . . . . 37

    3.2 Schleifen mit while . . . . . . . . . . . . . . . . . . . 393.2.1 Wiederholungen . . . . . . . . . . . . . . . . . . 393.2.2 break und continue . . . . . . . . . . . . . . . . . . 41

    4 Strukturierte Datentypen: Folgen 454.1 Strukturierte Daten: Tupel. . . . . . . . . . . . . . . . . 464.2 Strukturierte Daten: Listen . . . . . . . . . . . . . . . . 514.3 Mehr ber Zeichenketten . . . . . . . . . . . . . . . . . 564.4 Schleifen mit for und Ranges . . . . . . . . . . . . . . . . 624.5 List Comprehensions . . . . . . . . . . . . . . . . . . 66

    5 Funktionen 695.1 Einfache Funktionen. . . . . . . . . . . . . . . . . . . 705.2 Parameterbergabe . . . . . . . . . . . . . . . . . . . 715.3 Variable Signaturen . . . . . . . . . . . . . . . . . . . 755.4 Sichtbarkeitsbereiche . . . . . . . . . . . . . . . . . . 76

    6 Strukturierte Datentypen: Dictionaries und Mengen 816.1 Dictionaries . . . . . . . . . . . . . . . . . . . . . . 826.2 Funktionsaufrufe mit beliebigen benannten Parametern . . . . . . 896.3 Dictionary Comprehensions . . . . . . . . . . . . . . . . 906.4 Mengen . . . . . . . . . . . . . . . . . . . . . . . 92

    7 Objektorientierte Programmierung 997.1 Klassen, Attribute und Methoden . . . . . . . . . . . . . . 1007.2 Konstruktoren und Destruktoren . . . . . . . . . . . . . . 1057.3 Vererbung . . . . . . . . . . . . . . . . . . . . . . 107

  • 4 Inhalt

    7.4 Operatoren berladen . . . . . . . . . . . . . . . . . . 1117.5 Duck Typing . . . . . . . . . . . . . . . . . . . . . 115

    A Musterlsungen 119

    Index 123

  • Tabellenverzeichnis

    2.1 Rckstrich-Kombinationen in Zeichenketten-Literalen . . . . . . . . 30

    3.1 Vergleichsoperatoren in Python . . . . . . . . . . . . . . . . . . . . . 35

    7.1 Mathematische Operatoren und die dazugehrigen Methodennamen113

  • Abbildungsverzeichnis

    1.1 Ein simples Python-Programm . . . . . . . . . . . . . . . . . . . . . 15

  • Vorwort

    Diese Schulungsunterlage bietet einen konzentrierten und praxisorientierten Ein-stieg in die Programmiersprache Python. Basierend auf der aktuellen Implemen-tierung Python 3. (aber mit Rckbezgen auf Python 2) erklrt sie eine interes-sante Untermenge des Sprachumfangs mit vielen Beispielen und bungsaufga-ben.

    Die Schulungsunterlage richtet sich an Programmierer mit Linux-Kenntnissenund idealerweise Erfahrungen in anderen Programmiersprachen wie C, C++, Pas-cal, Perl oder PHP.

    Diese Schulungsunterlage soll den Kurs mglichst effektiv untersttzen, indemdas Kursmaterial in geschlossener, ausfhrlicher Form zum Mitlesen, Nach- oderVorarbeiten prsentiert wird. Das Material ist in Kapitel eingeteilt, die jeweils fr Kapitelsich genommen einen Teilaspekt umfassend beschreiben; am Anfang jedes Kapi-tels sind dessen Lernziele und Voraussetzungen kurz zusammengefasst, am Ende Lernziele

    Voraussetzungenfinden sich eine Zusammenfassung und (wo sinnvoll) Angaben zu weiterfhren-der Literatur oder WWW-Seiten mit mehr Informationen.

    B Zustzliches Material oder weitere Hintergrundinformationen sind durchdas Glhbirnen-Sinnbild am Absatzanfang gekennzeichnet. Zuweilen be-nutzen diese Abstze Aspekte, die eigentlich erst spter in der Schulungs-unterlage erklrt werden, und bringen das eigentlich gerade Vorgestellte soin einen breiteren Kontext; solche Glhbirnen-Abstze sind mglicher-weise erst beim zweiten Durcharbeiten der Schulungsunterlage auf demWege der Kursnachbereitung voll verstndlich.

    A Abstze mit dem Warnschild weisen auf mgliche Probleme oder ge-fhrliche Stellen hin, bei denen besondere Vorsicht angebracht ist. AchtenSie auf die scharfen Kurven!

    C Die meisten Kapitel enthalten auch bungsaufgaben, die mit dem Blei- bungsaufgabenstift-Sinnbild am Absatzanfang gekennzeichnet sind. Die Aufgaben sindnumeriert und Musterlsungen fr die wichtigsten befinden sich hintenin dieser Schulungsunterlage. Bei jeder Aufgabe ist in eckigen Klammernder Schwierigkeitsgrad angegeben. Aufgaben, die mit einem Ausrufungs-zeichen (!) gekennzeichnet sind, sind besonders empfehlenswert.

    Auszge aus Konfigurationsdateien, Kommandobeispiele und Beispiele frdie Ausgabe des Rechners erscheinen in Schreibmaschinenschrift. Bei mehrzeiligenDialogen zwischen Benutzer und Rechner werden die Benutzereingaben in fetterSchreibmaschinenschrift angegeben, um Missverstndnisse zu vermeiden. WennTeile einer Kommandoausgabe ausgelassen wurden, wird das durch kenntlich gemacht. Manchmal sind aus typografischen Grnden Zeilenumbrcheerforderlich, die in der Vorlage auf dem Rechner nicht stehen; diese werden als dargestellt. Bei Syntaxdarstellungen stehen Wrter in spitzen Klammern(Wort) fr Variable, die von Fall zu Fall anders eingesetzt werden knnen;Material in eckigen Klammern ([-f Datei]) kann entfallen und ein vertikalerBalken trennt Alternativen (-a |-b).

    Wichtige Konzepte werden durch Randnotizen hervorgehoben; die Defini- Wichtige KonzepteDefinitionen

  • 10 /home/anselm/.config/tuxcademy/preface-de.tex

    tionen wesentlicher Begriffe sind im Text fett gedruckt und erscheinen ebenfallsam Rand.

    Verweise auf Literatur und interessante Web-Seiten erscheinen im Text in derForm [GPL91] und werden am Ende jedes Kapitels ausfhrlich angegeben.

    Wir sind bemht, diese Schulungsunterlage mglichst aktuell, vollstndig undfehlerfrei zu gestalten. Trotzdem kann es passieren, dass sich Probleme oder Un-genauigkeiten einschleichen. Wenn Sie etwas bemerken, was Sie fr verbesse-rungsfhig halten, dann lassen Sie es uns wissen, etwa indem Sie eine elektro-nische Nachricht an

    [email protected]

    schicken. (Zur Vereinfachung geben Sie am besten den Titel der Schulungsunter-lage, die auf der Rckseite des Titelblatts enthaltene Revisionsnummer sowie diebetreffende(n) Seitenzahl(en) an.) Vielen Dank!

  • 1Einfhrung

    Inhalt1.1 Python-Hintergrund. . . . . . . . . . . . . . . . . . . 121.2 Python als Programmiersprache . . . . . . . . . . . . . . 131.3 Ein einfaches Python-Programm . . . . . . . . . . . . . . 151.4 Python interaktiv . . . . . . . . . . . . . . . . . . . . 18

    Lernziele Grundlagen der Programmiersprache Python kennen Strken und Schwchen von Python einschtzen knnen Einfache Python-Programme eintippen und starten knnen Python als interaktiven Interpreter aufrufen knnen

    Vorkenntnisse Elementare Linux-Kenntnisse (als Anwender) Umgang mit einem (beliebigen) Texteditor Erfahrung mit anderen Programmiersprachen ist von Vorteil

    pyth-intro.tex (4294f89813971178)

  • 12 1 Einfhrung

    1.1 Python-Hintergrund

    Die Programmiersprache Python wurde in den spten 1980er Jahren von Guidovan Rossum erfunden. Van Rossum war damals beim Zentrum fr Mathematikund Informatik der Freien Universitt Amsterdam beschftigt (heute (2015) ar-beitet er fr die Firma Dropbox). Python wird heute als Open-Source-Software-projekt von einem Team von Freiwilligen unter der gide der Python SoftwareFoundation (einer gemeinntzigen Stiftung) betreut und weiterentwickelt. Gui-do van Rossum hat immer noch das letzte Wort; sein Titel im Projekt ist BDFLoder benevolent dictator for life (wohlwollender Diktator auf Lebenszeit).

    B Python 1.0 wurde im Januar 1994 verffentlicht, Python 2.0 im Oktober2000 (die wesentlichen Neuerungen waren garbage collection und die Unter-sttzung von Unicode). Python 3.0 kam im Dezember 2008 heraus. Aktuell(2015) sind die Versionen 2.7. bzw. 3.4..

    Python beruht in seinen Grundideen auf einer frheren Programmiersprachenamens ABC, die besonders fr Unterrichtszwecke gedacht war und an deren Ent-wicklung Guido van Rossum beteiligt war. Der wesentliche Unterschied zwischenPython und ABC ist, dass Python auch in der wirklichen Welt zu gebrauchen ist ABC hatte diverse eigentmliche Eigenschaften, die das nicht unbedingt frder-ten, und die Sprache ist inzwischen auf der Schutthalde der Informatik-Geschich-te gelandet.

    B Python 3. hat gegenber Python 2. diverse nicht rckwrtskompatiblenderungen man nahm den Versionssprung zur Gelegenheit, einigedunkle Ecken der Programmiersprache aufzurumen und alte Zpfeabzuschneiden. Das bedeutet, dass nicht jedes Python-2-Programm unver-ndert mit Python 3 funktioniert. Es gibt aber Mittel und Wege, Code zuschreiben, der mit beiden Versionen zurechtkommt, und auerdem gibtes automatische Anpassungswerkzeuge, die einen Groteil der (schemati-schen) nderungen bernehmen, die fr eine Anpassung eines Python-2-Programms an Python 3 ntig sind.

    B Python 2 soll noch bis 2020 weiter gewartet werden allerdings werdengrundstzlich nur noch Fehlerkorrekturen vorgenommen. Die Python-Wei-terentwicklung konzentriert sich schon seit einiger Zeit fast vllig auf Py-thon 3.

    B Diese Schulungsunterlage beschftigt sich vorwiegend mit Python 3. Wosinnvoll und ntig weisen wir auf Eigenheiten von Python 2 hin.

    Gem Guido van Rossum (1999) sind die Entwicklungsziele von Python:

    Die Sprache soll einfach und intuitiv sein, aber mchtig.

    Eine Open-Source-Implementierung der Sprache soll zur Verfgung stehen,damit jeder zur Weiterentwicklung beitragen kann.

    Der Code soll so leicht verstndlich sein wie Englisch.

    Die Sprache soll fr Alltagsaufgaben ntzlich sein und kurze Entwicklungs-zeiten frdern.

    Inzwischen gehrt Python zu den populrsten Programmiersprachen. Auf demInternet finden Sie unter http://www.python.org/ die offizielle Web-Seite der PythonSoftware Foundation.

  • 1.2 Python als Programmiersprache 13

    1.2 Python als Programmiersprache

    Python ist eine moderne Programmiersprache mit vielen ntzlichen Eigenschaf-ten. Zu diesen gehren zum Beispiel:

    Dynamische Typisierung Variable mssen in Python nicht vor der Verwendungdeklariert werden. Trotzdem wird zur Laufzeit berprft, dass nur zulssi-ge Operationen auf die jeweiligen Daten angewendet werden. Python unter-sttzt sehr flexible Parameterbergabe an Funktionen sowie Polymorphie,also die Mglichkeit, dieselbe Funktion mit unterschiedlichen Parametersi-gnaturen aufzurufen.

    Objektorientierung Python untersttzt objektorientierte Programmierung, alsodie Definition von Klassen und Objekten mit Methoden und Attributen.Vererbung, auch Mehrfachvererbung, ist mglich, genau wie Metaprogram-mierung. Pythons objektorientierte Mglichkeiten sind sehr mchtig, aberihre Verwendung ist nicht zwingend: Kleine Programme und solche, frdie ein objektorientiertes Vorgehen nicht sinnvoll ist, knnen ohne weiteresauch in einem klassischen imperativen Stil geschrieben werden.

    Sehr leistungsfhige Datentypen Schon ab Werk enthlt Python diverse inter-essante und leistungsfhige eingebaute Datentypen neben numerischenGanzzahlen und Gleitkommazahlen auch Ganzzahlen (potentiell) beliebi-ger Lnge, komplexe Zahlen oder Dezimalzahlen, mit denen kaufmnni-sche Rechnungen ohne Rundungsfehler mglich sind. Zeichenketten un-tersttzen Unicode. Es gibt eine Reihe von praktischen Container-Typen,darunter Tupel, Listen, Dictionaries und Mengen.

    Automatische Speicherverwaltung Python kmmert sich transparent um dieVerwaltung von Speicher fr Objekte und rumt auch selbstttig auf einEingreifen des Programmierers ist nur sehr selten erforderlich. Dies erleich-tert die Erstellung von Programmen fr Anwendungen, wo Sicherheitsl-cken und Programmabstrze durch Fehler in der Speicherverwaltung nichterwnscht sind (etwa Internet-Dienste).

    Module Python-Programme knnen in Module aufgeteilt werden, die zusam-mengehrende Funktionalitt einkapseln und ber separate Namensrumeverfgen. Auf diese Weise ist es bequem mglich, auch groe Softwaresyste-me in Python zu realisieren. Code-Wiederverwendung wird gefrdert. Py-thon enthlt Infrastruktur fr das automatische Testen von Modulen, undmit dem Sphinx-System ist eine komfortable Dokumentation mglich.

    Systemnahe Programmierung Python erlaubt den direkten Zugriff auf Funk-tionen des unterliegenden Betriebssystems, aber enthlt auch komforta-ble Abstraktionsschichten, um eine portable, betriebssystembergreifendeProgrammierung zu ermglichen. Python-Quellcode sowie -Bytecode istzwischen verschiedenen Rechnerarchitekturen und Betriebssystemen por-tabel.

    Standardbibliothek und Erweiterungen Python wird mit einer sehr reichhal-tigen Standardbibliothek ausgeliefert, die diverse Anwendungsbereicheabdeckt bis hin zum Netzwerkzugriff, der Untersttzung diverser In-ternet-Protokolle und -Datenformate und komfortablen Hilfsmitteln zurProgrammerstellung wie Testgerste, Protokollierung, Profilierung undhnliches. Zahllose Erweiterungen fr alle mglichen Zwecke sind im In-ternet als Open-Source-Code verfgbar.

    Erweiterbarkeit Python-Module knnen in Python oder auch in C/C++ ge-schrieben werden letzeres ist aus Effizienzgrnden manchmal sinnvoll.Fr den Python-Programmierer ist es syntaktisch nicht unterscheidbar,

  • 14 1 Einfhrung

    ob eine Erweiterung in Python oder C realisiert wurde. Es ist auch mg-lich, Python als Erweiterungssprache fr existierende Anwendungen zuverwenden.

    Portabilitt Die Standardimplementierung von Python ist in portablem ISO-Cgeschrieben und luft auf jeder wesentlichen Betriebssystemplattform auer auf Linux und Unix zum Beispiel auf Windows, OS X, QNX, Vx-Works, Android, Auch der Python-Bytecode ist portabel. Neben der C-Implementierung gib es Python-Implementierungen in diversen anderenProgrammiersprachen, etwa C#, Java, JavaScript und Python (!).

    Freie Verfgbarkeit Die Standardimplementierung von Python ist frei verfg-bar und kann beliebig (auch kommerziell) eingesetzt werden. Es ist erlaubt,den Code zu ndern und die nderungen kommerziell zu nutzen und zuvertreiben sowie Python in eigene Produkte zu integrieren und diese ggf.kommerziell zu vertreiben. Die Programmiersprache Python hngt nichtvon einem einzelnen Anbieter ab und wird darum vermutlich existieren,solange sich noch jemand dafr interessiert.

    Natrlich hat Python wie jede Programmiersprache auch ein paar Schw-chen, die wir hier nicht verschweigen wollen:

    Performance Python wird normalerweise als Interpreter implementiert und isteine objektorientierte Programmiersprache mit diversen komfortablen Au-tomatismen. Dafr bezahlen Sie als Anwender mit einem gewissen Perfor-mance-Verlust gegenber sorgfltig handoptimiertem C-Code. Ob das tat-schlich ein Problem darstellt, ist natrlich anwendungsabhngig als Pro-grammierer knnen Sie in Python wesentlich produktiver sein als in einerProgrammiersprache wie C, und das wiegt einen gewissen Effizienzver-lust vielleicht auf. Auerdem werden Computer (und damit Ihre Python-Programme) mit der Zeit tendenziell schneller, und es ist einfacher, in ei-nem groen Python-Programm genau die Teile, wo viel Zeit verbraten wird,in eine in C geschriebene und optimierte Erweiterung auszulagern, als einkomplettes groes Programm von Grund auf in C zu schreiben, nur damitein paar Teile davon schnell ausgefhrt werden knnen.

    Dynamische Typisierung Pythons dynamische Typisierung ist eine sehr beque-me Sache, weil Sie nicht viel Zeit damit verbringen mssen, Variable mitden korrekten Datentypen vorzudeklarieren. Allerdings begibt Python sichdadurch der Mglichkeit, allfllige Fehler, die mit Datentypen und Opera-tionen zu tun haben, schon zu erkennen, bevor das Programm ausgefhrtwird. Statt dessen riskieren Sie einen Programmabsturz im falschen Mo-ment. Sie knnen das bis zu einem gewissen Grad mit Disziplin und ge-schickter Programmierung ausgleichen, aber fairerweise sollten wir sagen,dass fr Hochsicherheitsanwendungen Python in seiner aktuellen Formmglicherweise nicht die beste Programmiersprache ist.

    B Eines der interessanteren Themen der aktuellen (2015) Python-Ent-wicklung ist die Idee, optionale Datentypfestlegungen fr Variableund vor allem Funktionsparameter zuzulassen. Damit knnte dasProblem der statischen Typberprfung (bzw. deren bisheriger Abwe-senheit in Python) bis zu einem gewissen Grad adressiert werden. Wirdrfen gespannt sein.

    Die kanonische Python-Implementierung beruht auf einem Interpreter. Dasheit, anders als bei vielen anderen Programmiersprachen ist kein expliziter ber-setzungsvorgang ntig, bevor Sie ein Python-Programm starten knnen Sie ms-sen nur den Python-Interpreter mit der Textdatei aufrufen, die das Programmenthlt.

  • 1.3 Ein einfaches Python-Programm 15

    #!/usr/bin/python3

    # hallo.py -- Ein sehr einfaches Python-Programm

    print("Hallo Welt!")

    Bild 1.1: Ein simples Python-Programm

    B Intern bersetzt Python Programme in einen maschinenunabhngigenBytecode, der dann ausgefhrt wird. Dieser bersetzungsvorgang ist fr Bytecodeden Benutzer transparent. Zur Beschleunigung kann der Python-Interpre-ter den Bytecode in einer Datei ablegen, damit das betreffende Programmnicht wieder bersetzt werden muss, solange es nicht gendert wurde. DerPython-Interpreter kmmert sich selbst um allfllige Neu-bersetzungen.

    Sie knnen den Python-Interpreter auch interaktiv aufrufen, um direkt Python-Code einzutippen und auszufhren. Siehe hierzu Abschnitt 1.4.

    1.3 Ein einfaches Python-Programm

    Python-Programme knnen Sie mit jedem beliebigen Texteditor anlegen. Voraus-setzung ist nur, dass der Editor tatschliche Textdateien erzeugt und keine Text-verarbeitungs-Dokumente (wenn Sie LibreOffice benutzen wollen, mssen Sie al-so darauf achten, Ihr Programm im richtigen Format abzuspeichern).

    B Manche Texteditoren sind fr die Programmierung in Python besser geeig-net als andere. Das Wichtigste, worauf Sie bei der Auswahl eines Editorsachten sollten, ist, dass der Editor die Grundzge der ProgrammiersprachePython beherrscht und dadurch zum Beispiel in der Lage ist, Programmtextgem der Syntax einzufrben und etwa Schlsselwrter oder Zeichenket-ten hervorzuheben. Damit werden Fehlerquellen wie zum Beispiel nicht or-dentlich beendete Zeichenketten offensichtlicher. Ebenfalls ntzlich ist au-tomatische Einrckung, bei der der Editor wei, dass die Zeilen nach ei-nem if oder for eingerckt werden sollen, und dafr selbstndig Vorschl-ge macht. Spezialisierte Programmierumgebungen haben noch wesentlichweitreichendere Hilfsmittel, die bis zur Refaktorierung (dem Umschreibenvon Programmen zur Vereinfachung) oder dem automatischen Aufrufenvon Dokumentation beim Klick auf einen Funktionsnamen gehen.

    Nach Konvention schreibt man Python-Code in Textdateien mit der Endung.py.

    B Das ist ntzlich, weil ein hinreichend schlauer Texteditor dann wei, dasser es mit Python-Code zu tun hat. Sptestens wenn Sie Ihr Programm an-deren Leuten zur Verfgung stellen, sollten Sie die Endung aber entfernen,da die verwendete Programmiersprache unter dem Strich ein Implementie-rungsdetail darstellt, das nicht wichtig ist. Am Ende schreiben Sie Ihr Pro-gramm gar doch nochmal neu in C, und dann wre es hchst doof, wenndie Benutzergemeinde sich daran gewhnt htte, es ber den Namen prog.pyaufzurufen.

    Ein simples Beispiel fr ein Python-Programm sehen Sie in Bild 1.1. Der Codespricht weitgehend fr sich, aber wir nehmen diese Gelegenheit, um ein paargrundlegende Dinge zu erwhnen:

    Leerzeilen haben fr Python keine Bedeutung. Halten Sie sich also nichtzurck.

  • 16 1 Einfhrung

    Zeilen mit einem # am Anfang gelten als Kommentarzeilen. Der Kommentarerstreckt sich vom # bis zum Zeilenende und wird von Python ignoriert. Esist also auch mglich, Zeilen der Form

    print("Hallo Welt!") # Freundliche Begrung

    zu haben.

    B Programmiermethodischer Einschub: Verkneifen Sie sich (in egal wel-cher Programmiersprache) Zeilen wie

    i = i + 1 # Erhhe i um 1

    So etwas sollten Sie nur schreiben, wenn Sie entweder im ersten Semes-ter Informatik studieren und Ihren Tutor beeindrucken wollen, oderaber als Programmierer pro Byte Quelltext bezahlt werden. Denn eshat keinen praktischen Nhrwert, in den Kommentaren den Code wie-derzukuen guter Code (insbesondere in Python) braucht eigentlichberhaupt keine Kommentare. Wenn Sie etwas kommentieren, danntun Sie es, weil es unoffensichtlich ist: Zum Beispiel knnte ein be-stimmtes Problem in Ihrem Programm eine auf den ersten Blick ber-komplizierte Lsung erfordern, weil die offensichtliche simple Lsungeinen subtilen Fehler hat. In diesem Fall ist ein Kommentar ntig, da-mit kein wohlmeinender Kollege daherkommt und denkt, Ihnen einenGefallen zu tun, indem er Ihren Code vereinfacht. Ebenfalls sinn-voll sind High-Level-Kommentare, die zum Beispiel fr Funktionenangeben, was die Funktion tun soll und wie Parameter und Resultataussehen mssen. Das andere Problem mit Kommentaren, die denCode wiederkuen, ist, dass ber kurz oder lang der Code und dieKommentare auseinanderdriften und dann nicht mehr sofort klar ist,wer von beiden recht hat: Haben Sie korrekten Code mit einem fal-schen Kommentar, oder stimmt der Kommentar und jemand hat sichim Code vertan?

    Python 3 nimmt standardmig an, dass Programmcode gem UTF-8 co-diert ist. Sollten Sie etwas Anderes benutzen (Pfui ber Sie!), dann knnenSie das Python durch einen speziell formatierten Kommentar am Dateian-fang mitteilen. Zum Beispiel:

    # coding=Name der Codierung# -*- coding: Name der Codierung -*- Emacs versteht das# vim: set fileencoding=Name der Codierung : Vim versteht das

    Sie brauchen nur eine dieser Zeilen. Gngige Zeichencodierungen (auerUTF-8) sind zum Beispiel latin-1 oder iso-8859-15.

    B Genaugenommen muss die erste oder zweite Zeile der Datei auf denregulren Ausdruck coding[:=]\s*([-\w.]+) passen. Ist das der Fall,gilt das, was von der ersten Gruppe des Ausdrucks (den runden Klam-mern) gefunden wurde, als Name der Zeichencodierung. Wenn Py-thon diese Zeichencodierung nicht kennt, dann wird ein Fehler gemel-det. (Wenn das alles fr Sie bhmische Drfer sind, dann lassen Siesich keine grauen Haare wachsen.)

    B Python 2 geht davon aus, dass Programmcode dem ASCII (128 Zei-chen) folgt. Das heit, sobald Sie irgendwelche Sonderzeichen benut-zen, die nicht aus dem traditionellen Zeichenvorrat stammen, mssenSie einen Codierungs-Kommentar am Dateianfang haben.

  • 1.3 Ein einfaches Python-Programm 17

    Sie knnen das Beispielprogramm ausprobieren, indem Sie den Python-Inter-preter aufrufen und den Namen der Programmdatei als Parameter bergeben:

    $ python hallo.py

    Hallo Welt!

    B Bei diesem Programm ist es noch egal, ob Sie es mit Python 2 oder Python 3aufrufen. Typische Linux-Distributionen haben heutzutage beide Versioneninstalliert, und Sie erhalten in der Regel ber das Kommando python2 undpython3 die entsprechende Version. Wenn Sie herausfinden wollen, welcheGeschmacksrichtung von Python Sie bekommen, wenn Sie einfach nur py-thon sagen, dann versuchen Sie etwas wie

    $ python -V

    Python 2.7.10

    B Wenn Sie die Voreinstellung nicht mgen, dann hindert Sie niemand daran,in Ihrer Shell etwas wie

    $ alias python=python3

    zu sagen. Das symbolische Link, das in Ihrem Linux dafr sorgt, dass pythoneigentlich python2 ist, sollten Sie nur mit groer Vorsicht verbiegen es knn-te sein, dass andere Programme auf Ihrem System unter dem Namen pythoneinen Python-2-Interpreter vermuten und dann in Schwierigkeiten geraten.

    B Die meisten Linux-Distributionen sind dabei, Python 3 zum Standard zumachen. Wie weit dieser Vorgang fortgeschritten ist, mssen Sie im Zwei-felsfall gezielt erforschen. (Vielleicht mgen Sie ja auch mithelfen; die meis-ten Distributionen wrden sich freuen.)

    Die erste Zeile in unserem Beispiel sorgt dafr, dass Sie unter Linux (oder Unix)das Programm aufrufen knnen, ohne dass Sie beim Aufruf einen expliziten Py-thon-Interpreter benennen mssen. Dazu mssen Sie die Datei zunchst ausfhr-bar machen:

    $ chmod +x hallo.py

    Anschlieend knnen Sie das Programm direkt ber seinen Namen aufrufen:

    $ ./hallo.py

    Hallo Welt!

    B Die explizite Verzeichnisangabe ist normalerweise ntig, weil es als ausge-sprochen ungeschickt gilt, das aktuelle Verzeichnis nach ausfhrbaren Pro-grammen zu durchsuchen (Sie machen sich dadurch verwundbar gegen-ber trojanischen Pferden mit Namen wie ls). Wenn Sie Ihre Python-Pro-gramme ohne eine Pfadangabe aufrufen wollen, dann machen Sie sich einVerzeichnis namens bin in Ihrem Heimatverzeichnis, kopieren die Python-Programme dort hinein und nehmen es in Ihre PATH-Variable auf:

    $ mkdir $HOME/bin

    $ ln -s $(pwd)/hallo.py $HOME/bin/hallo

    $ PATH=$HOME/bin:$PATH

    $ hallo

    Hallo Welt!

  • 18 1 Einfhrung

    (Damit das Verzeichnis bin dauerhaft im PATH landet, mssen Sie natrlichin einer Datei wie .profile eine entsprechende Zuweisung einbauen. Aberschauen Sie vorher mal genau nach vielleicht stellen Sie ja zu Ihrer Ge-nugtuung fest, dass Ihre Distribution das schon bernimmt, wenn ein bin-Unterverzeichnis in Ihrem Heimatverzeichnis existiert.)

    A Verkneifen Sie sich den Programmname test. Das gibt in der Regel Konfliktemit dem gleichnamigen eingebauten Shellkommando bzw. dem gleichna-migen Systemkommando, die nur schwer zu diagnostizieren sind, da dasShellkommando test keine oder nur kryptische Fehlermeldungen ausgibt.Wir haben Sie gewarnt.

    bungen

    C 1.1 [!2] Wenn Sie es noch nicht gemacht haben: Geben Sie das Beispielpro-gramm aus Bild 1.1 ein und speichern es als hallo.py ab. Rufen Sie hallo.pyauf und berzeugen Sie sich, dass es funktioniert.

    C 1.2 [!1] Machen Sie hallo.py ausfhrbar und stellen Sie sicher, dass es auchohne einen auf der Kommandozeile explizit benannten Python-Interpreterluft.

    1.4 Python interaktiv

    Wenn Sie den Python-Interpreter aufrufen, ohne den Namen einer Programmda-tei zu bergeben, dann bekommen Sie eine interaktive Eingabeaufforderung:

    $ python3

    Python 3.4.3+ (default, Jun 2 2015, 14:09:35)

    [GCC 4.9.2] on linux

    Type "help", "copyright", "credits" or "license" for more information.

    >>> _

    (Die letzte Zeile enthlt den Cursor, hier angedeutet durch _.)Diese Eingabeaufforderung verrt Ihnen freundlicherweise die Versionsnum-

    mer und das bersetzungsdatum dieses Interpreters. Die drei Grerzeichen(>>>) sind Pythons Einladung an Sie, Code einzutippen, der dann auch direktausgefhrt wird, bevor Sie erneut nach einem Kommando gefragt werden:

    >>> print("Hallo Welt!")

    Hallo Welt!

    >>> _

    Im Rahmen dieses Kurses werden wir den interaktiven Modus von Python sehrintensiv fr Experimente nutzen. In der Unterlage geben wir die letzte Zeile (>>>_) aber aus Platzgrnden nicht mehr an.

    Sie knnen den interaktiven Modus von Python verlassen, indem Sie auf derStandardeingabe das Dateiende signalisieren. Drcken Sie dazu die Taste Strg ,halten Sie sie fest und drcken Sie gleichzeitig die Taste d .

    bungen

    C 1.3 [!1] Rufen Sie Python im interaktiven Modus auf. Was passiert, wenn Siebei der Eingabeaufforderung help, copyright, credits oder license angeben?

  • 1.4 Python interaktiv 19

    Zusammenfassung

    Die Programmiersprache Python wurde Ende der 1980er Jahre von Guidovan Rossum erfunden und wird heute als Open-Source-Projekt von der Py-thon Software Foundation weiterentwickelt.

    Python ist eine moderne Programmiersprache mit vielen netten Eigenschaf-ten und wenigen Schwchen.

    Python-Programme stehen in normalen Textdateien. blich ist die Endung.py.

    Ohne Parameter aufgerufen startet der Python-Interpreter im interaktivenModus.

  • 2Einfache Datentypen

    Inhalt2.1 Numerische Datentypen und Literale . . . . . . . . . . . . 222.2 Numerische Ausdrcke . . . . . . . . . . . . . . . . . 242.3 Variable . . . . . . . . . . . . . . . . . . . . . . . 272.4 Zeichenketten . . . . . . . . . . . . . . . . . . . . . 29

    2.4.1 Zeichenketten-Literale . . . . . . . . . . . . . . . . 292.4.2 Zeichenketten-Ausdrcke. . . . . . . . . . . . . . . 31

    Lernziele Mit ganzen Zahlen und Gleitkommazahlen umgehen knnen Variable benutzen knnen Einfache Operationen fr Zeichenketten beherrschen

    Vorkenntnisse Interaktiver Gebrauch von Python (Kapitel 1) Erfahrung mit anderen Programmiersprachen ist von Vorteil

    pyth-types.tex (4294f89813971178)

  • 22 2 Einfache Datentypen

    2.1 Numerische Datentypen und Literale

    Python unterscheidet drei verschiedene grundlegende Arten von Zahlen: GanzeZahlen, Gleitkommazahlen und komplexe Zahlen.

    Ganze Zahlen Ganze Zahlen sind sozusagen das Brot- und Buttergeschft derComputerei. In Python knnen Sie mit ihnen ziemlich intuitiv umgehen. Ganz-zahlige Konstanten im Programmtext (vulgo Literale) sind einfach Folgen vonKonstantenZiffern, die dann als Dezimalzahlen interpretiert werden:

    1

    4711

    3141926535

    B Natrlich drfen Sie auch negative ganze Zahlen benutzen, indem Sie einnegative ganze ZahlenMinuszeichen links vor die Zifferfolge stellen. Das Minuszeichen ist aberstrenggenommen nicht Teil des Literals, sondern ein mathematischer Ope-rator.

    B Verkneifen Sie sich fhrende Nullen aus Grnden, die wir gleich nochfhrende Nullensehen werden. In Python 3 sind sie sowieso verboten.

    Wenn Sie maschinennahe Programmierung betreiben, ist es oft ntzlich, Zah-len in einem anderen Zahlensystem als dem sonst blichen Dezimalsystem anzu-Andere Zahlensystemegeben. Python untersttzt das Binr-, das Oktal- und das Hexadezimalsystem:

    0b1111011 123 als binres Literal (Basis 2)

    0o173 123 als oktales Literal (Basis 8)

    0x7b 123 als hexadezimales Literal (Basis 16)

    B Die Prfixe 0b, 0o und 0x drfen Sie auch als 0B, 0O bzw. 0X schreiben. Zumin-dest von 0O wrden wir Ihnen allerdings dringend abraten, da das groe Oeiner Null je nach Schrifttype unangenehm hnlich sieht. (Auch 0B findenwir nicht unbedingt prall.)

    B Python 2 untersttzt fr oktale Literale auch die althergebrachte, von derProgrammiersprache C geerbte Schreibweise mit fhrender Null (0173 in un-serem Beispiel). Wir finden das nicht offensichtlich genug und empfehlendarum, lieber 0o173 zu benutzen1.

    Ganzzahlige Literale (egal in welchem Zahlensystem), die grer sind als diegrte direkt darstellbare positive ganze Zahl auf 32-Bit-Rechnern gemeinhin2.147.483.647 , werden als lange ganze Zahlen betrachtet. Lange ganze ZahlenLange ganze Zahlensind nur durch den verfgbaren Speicher begrenzt.

    B Einfache ganze Zahlen decken mindestens den Bereich von -2.147.483.648bis 2.147.483.647 ab wenn Ihr Computer eine natrliche Wortlnge vonmehr als 32 Bit hat, auch gerne mehr, aber nie weniger.

    B Python 3 macht keinen Unterschied zwischen einfachen und langen gan-zen Zahlen. Wenn der Zahlenbereich fr einfache ganze Zahlen ber-schritten wird, rechnet Python 3 automatisch mit langen ganzen Zahlenweiter.

    1Das war brigens der Grund fr die Warnung vor fhrenden Nullen weiter oben. Wenn Sie dezi-male Literale aus Grnden der Optik mit fhrenden Nullen versehen, knnen Sie interessante ber-raschungen erleben. Wir drcken Ihnen die Daumen, dass Sie in Ihren Konstanten eine gelegentlicheZiffer 8 oder 9 haben, damit Ihnen Ihr Programm frhzeitig um die Ohren fliegt, anstatt spter merk-wrdige Ergebnisse zu liefern.

  • 2.1 Numerische Datentypen und Literale 23

    B Sie knnen in Python 2 ein ganzzahliges Literal ausdrcklich zu einer lan-gen ganzen Zahl erklren, indem Sie an die Ziffernfolge ein L anhngen:

    1L Lange ganze Zahl

    (l wre auch erlaubt, aber das ist zu leicht mit einer 1 zu verwechseln. LassenSies also sein.) In Python 3 ist das nicht mglich, weil unntig.

    B Das Rechnen mit langen ganzen Zahlen ist deutlich langsamer als das Rech-nen mit einfachen ganzen Zahlen.

    Gleitkommazahlen Neben ganzen Zahlen untersttzt Python auch Gleitkomma-zahlen, salopp gesagt also Zahlen mit einem Nachkommaanteil. Das Komma Komma als Punktwird nach US-amerikanischer Manier aber als Punkt geschrieben:

    1.5

    Bei Bedarf knnen Sie den Teil der Zahl vor oder nach dem Dezimalpunkt auchweglassen (dann wird 0 angenommen) aber nicht beide.

    .5 Dasselbe wie 0.5

    1. Dasselbe wie 1.0

    Auerdem knnen Sie einen Exponenten angeben. Wenn die Mantisse (die ExponentZiffern ohne den Exponenten) darstellt undden Exponenten, dann reprsentiertdas Literal den Wert 10:

    1e100 10100 ein Googol1e+100 Dasselbe nochmal

    1e-100 10100 eine sehr kleine Zahl

    B Statt eines kleinen e knnen Sie auch ein groes E verwenden, um den Ex-ponenten einzuleiten.

    Auch wenn ganzzahlige und Gleitkomma-Literale im Programmtext ziemlichhnlich aussehen, stehen sie doch fr sehr unterschiedliche Daten: Normale Ganz-zahlen werden im Computer genau dargestellt (mit den eingebauten Ganzzahlendes Prozessors, falls sie nicht zu gro sind, sonst mit Python-internen Datenstruk-turen), Gleitkommazahlen dagegen entsprechen den eingebauten Gleitkomma-zahlen doppelter Genauigkeit.

    B Was die genauen Eigenschaften der Gleitkommazahlen Ihres Rechners an- Eigenschaften der Gleitkomma-zahlenbetrifft, sind Sie dessen C-Implementierung ausgeliefert (vor allem wenn

    es um gltige Zahlenbereiche oder das Verhalten bei einer Bereichsber-schreitung geht). Gngige Prozessoren untersttzen heutzutage Gleitkom-ma-Arithmetik gem IEEE 754; fr doppelte Genauigkeit (eine Gleitkom-mazahl nimmt 8 Byte ein) haben Sie 52 Bit fr die Mantisse, 11 Bit fr den Ex-ponent und 1 Bit fr das Vorzeichen zur Verfgung. Das erste Bit der Man-tisse ist nach Definition immer 1, so dass Sie unter dem Strich eine 53 Bit-Mantisse erhalten2. Sie drfen also mit 1517 signifikanten Dezimalstellenrechnen, wobei der dezimale Exponent zwischen 308 und 308 liegen kann.

    B Vielleicht werden Sie sich fragen, warum Python nicht (auch) Gleitkomma-zahlen einfacher Genauigkeit anbietet (so wie zum Beispiel die Program-miersprache C). Die Antwort darauf lautet, dass Zahlen intern nicht als Zah-len, sondern als Python-Objekte dargestellt werden und dass der Zusatz-aufwand, um aus einer Gleitkommazahl ein Python-Objekt zu machen, sogro ist, dass die Extramhe, zwei verschiedene Gleitkomma-Formate zuuntersttzen, die Ersparnis von 4 Byte pro Zahl nicht wert wre. (RAM istheute ja ziemlich billig.)

    2Spezialflle wie denormalisierte Werte lassen wir hier mal auer Acht.

  • 24 2 Einfache Datentypen

    A Auch bei Python gelten die blichen Vorbehalte im Umgang mit compu-Vorbehalteterisierten Gleitkommazahlen. Zum Beispiel sollten Sie, wenn Sie zehnmalden Wert 0.1 addieren, nicht damit rechnen, dass exakt 1.0 herauskommt.berhaupt ist es in der Regel Keine Gute Idee, zwei Gleitkommazahlen aufGleichheit zu testen. Dazu sagen wir spter mehr.

    Komplexe Zahlen Elektrotechniker und andere Ingenieure werden mit Genugtu-ung feststellen, dass Python auch ohne Zusatzbibliotheken mit komplexen Zahlenumgehen kann. Imaginre Literale bestehen einfach aus Gleitkomma- oder ganz-zahligen Literalen mit einem angehngten j (oder J):

    1j oder auch 1

    Wenn Sie eine komplexe Zahl mit einem von Null verschiedenen Realteil hin-schreiben wollen, mssen Sie den Real- und den Imaginrteil addieren (und daserklren wir im nchsten Abschnitt).

    B Intern sind komplexe Zahlen einfach Paare von zwei Gleitkommazahlen.Das heit, alles, was wir weiter oben ber die Darstellung, gltigen Wer-tebereiche usw. von Gleitkommazahlen gesagt haben, gilt sinngem auchfr komplexe Zahlen.

    2.2 Numerische Ausdrcke

    Rechnen ist eine der naheliegendsten Anwendungen fr Programmiersprachenwie Python und in der Tat gibt der Python-Interpreter im interaktiven Modus ei-nen sehr bequemen Taschenrechner ab (obwohl Sie Python auf einem Android-Handy laufen lassen mssen, damit es wirklich ein Taschen-Rechner wird):

    >>> 1+2*3

    7

    >>> (1+2)*3

    9

    Wie Sie sehen, kommt Python mit den gngigen Grundrechenarten zurecht (mul-Grundrechenartentipliziert wird, wie in anderen Programmiersprachen, mit dem Sternchen) und be-achtet auch die gngigen mathematischen Gepflogenheiten: Punktrechnung gehtvor Strichrechnung, und mit Klammern knnen Sie angeben, was zuerst ausge-wertet werden soll.

    Natrlich kann Python auch subtrahieren:

    >>> 1-2

    -1

    >>> -1+-2

    -3

    Negative Zahlen sind auch kein Problem setzen Sie einfach ein Minuszeichendirekt vor die Zahl.

    Interessant ist das Thema Division:Division

    >>> 10/5

    2.0 Python 3

    2 Python 2

    >>> 11/5

    2.2 Python 3

    2 Python 2

    >>> 11./5

    2.2 Immer

  • 2.2 Numerische Ausdrcke 25

    In Python 3 liefert eine Division immer ein Gleitkommaresultat, unabhngig vomTyp der Operanden. In Python 2 hngt das Resultat der Division davon ab, ob dieOperanden ganze Zahlen oder Gleitkommazahlen sind: Handelt es sich um ganzeZahlen, ist das Ergebnis wieder ganzzahlig; ist mindestens einer der Operandeneine Gleitkommazahl, kommt ein Gleitkommaergebnis heraus.

    B Division durch Null ist natrlich verboten. Das signalisiert Python Ihnendurch eine Exception:

    >>> 1/0

    Traceback (most recent call last):

    File "", line 1, in

    ZeroDivisionError: division by zero

    Exceptions fhren in der Regel zum Programmabbruch; nur im interaktivenPython-Interpreter sind sie nicht weiter schlimm, weil es mit der nchstenEingabeaufforderung weitergeht. Grundstzlich knnen Sie in Ihren Pro-grammen Exceptions abfangen, um Fehlersituationen auszubgeln. Daswrde hier aber etwas zu weit fhren.

    B Genaugenommen ist das Ergebnis einer Division von zwei ganzen Zahlenin Python 2 die grte ganze Zahl, die kleiner oder gleich dem echtenErgebnis ist. Zum Beispiel:

    >>> -10/5

    -2

    >>> -11/5.

    -2.2

    >>> -11/5

    -3 Die grte ganze Zahl -2,2

    Python 3 hat fr den (gngigen) Fall, dass ein ganzzahliges Ergebnis gewnschtwird, den speziellen Divisionsoperator //:

    >>> 11//5

    2

    >>> -11//5

    -3

    // benimmt sich wie der Divisonsoperator / von Python 2.

    B Wenn Sie Python 2 benutzen, sich aber schon an das Divisionsverhalten vonPython 3 gewhnen wollen, knnen Sie mit dem Kommando

    from __future__ import division

    am Anfang einer Datei das Python-3-Verhalten einschalten. Das funktio-niert ab Python 2.2.

    Der Operator %, auch bekannt als Modulo-Operator, liefert den Rest bei ganz- Modulo-Operatorzahliger Division:

    >>> 7 % 3

    1

    >>> 7. % 3.

    1.0

    >>> -7 % 3

    2 Huch.

  • 26 2 Einfache Datentypen

    B Das letzte Beispiel ist mglicherweise etwas verwirrend. Um es zu verste-hen, mssen Sie wissen, dass in Python die (ganzzahlige) Division und dieModulo-Operation wie folgt zusammengehren:

    = (/) + ( % )

    Damit die Gleichung fr = 7 und = 3 gilt, muss % den Wert 2 haben.

    Mit dem Operator ** knnen Sie Potenzen bilden:Potenzen

    >>> 2**3

    8

    >>> 2**-3

    0.125

    Alle diese Operatoren sind linksassoziativ, das heit, Ausdrcke wie 1+2+3Assoziativittoder 4-5-6 werden respektive wie (1+2)+3 oder (4-5)-6 interpretiert. Die Aus-nahme ist der Potenzoperator **, der rechtsassoziativ ist 2**3**4 ist dasselbewie 2**(3**4).

    B Auch wenn es dem Menschen auf der Strae willkrlich vorkommen mag:Das ist so Usus in der Mathematik.

    Python untersttzt auch einige ntzliche mathematische Funktionen, die Siemathematische Funktionenauf Zahlen anwenden knnen:

    >>> abs(-5) Betrag

    5

    >>> int(3.14) Umwandeln in ganze Zahl

    3

    >>> int(-3.14) int rundet immer in Richtung Null

    -3

    >>> max(1,7,5) Maximum

    7

    >>> min(5,2,1) Minimum

    1

    >>> round(1.123) Runden

    1.0

    >>> round(1.234, 1) Runden auf bestimmte Stellenzahl

    1.2

    B Der Unterschied zwischen round() und int() ist, dass round() eine Gleitkom-mazahl liefert und int() eine Ganzzahl auch wenn Sie mit round() aufnull Nachkommastellen runden. Wenn zwei mgliche Rundungsergeb-nisse gleich weit von der zu rundenden Zahl entfernt sind, rundet round()von Null weg; round(-0.5) ist also -1., wenn Sie auf null Nachkommastel-len runden3.

    Fr grere Geschtze der mathematischen Art mssen Sie auf das math-Modulmathzurckgreifen, ungefhr so:

    >>> import math

    >>> math.pi

    3.141592653589793

    >>> math.sin(math.pi/2)

    1.0

    >>> math.log(10) Basis 2.302585092994046

    3 sagt die Theorie. Im wirklichen Leben ist Python durchaus fr eine berraschung gut round(3.55,1) zum Beispiel ergibt 3.5, nicht, wie man eigentlich erwarten wrde, 3.6. Das liegt dar-an, dass eine Python-Gleitkommazahl einen Wert wie 3,55 nicht exakt darstellen kann und die binreDarstellung nher an 3,5 als an 3,6 liegt.

  • 2.3 Variable 27

    (Eine genauere Beschreibung des Inhalts von math knnen Sie der Python-Doku-mentation entnehmen.)

    bungen

    C 2.1 [!1] Was ist der Unterschied zwischen 1e100 und 10**100?C 2.2 [1] Verwenden Sie den Satz des Pythagoras, um die Lnge der Hypo-

    tenuse eines rechtwinkligen Dreiecks zu bestimmen, dessen Katheten und jeweils die Lnge 6 und 8 haben. (Ob Nanometer oder Lichtjahre,bleibt hier Ihrer Fantasie berlassen.) Tipp: 2 = 2 + 2, und die Quadrat-wurzelfunktion heit math.sqrt.

    2.3 Variable

    Die allermeisten Programmiersprachen sind sich einig, dass es eine gute Idee ist,Objekten (wie Zahlenwerten) einen Namen geben zu knnen das macht Pro-gramme bersichtlicher, leichter lesbar und besser wartbar. Es ist allemal vernnf-tiger, etwas zu sagen wie

    >>> pi = 3.141592654

    >>> u = 2*pi*5 Umfang eines Kreises mit Radius 5

    >>> a = pi*5*5 Flche eines Kreises mit Radius 5

    als etwas wie

    >>> u = 2*3.141592654*5

    >>> a = 3.141592654*5*5

    (Im ersten Beispiel haben Sie auch weniger Arbeit, wenn der Wert von sich malndert.)

    B Weil Sie aufgepasst haben, wissen Sie natrlich noch, dass Python im Modulmath die vordefinierte Variante pi bereithlt. Sie mssen sich also in diesemFall gar keinen Stress machen, und mit

    from math import pi

    am Anfang Ihres Programms mssen Sie sogar nicht mal math.pi tippen wieim vorigen Abschnitt.

    Eigentlich haben Sie das Wichtigste schon gesehen: Wenn Sie einem Literal Zuweisungoder dem Ergebnis eines mathematischen Ausdrucks einen Namen geben wol-len, dann schreiben Sie einfach den Namen hin, ein Gleichheitszeichen (mit oderohne Leerzeichen drumherum, das ist egal) und dann den Literal oder Ausdruck eben wie in

    >>> drei=3

    Namen in Python drfen Buchstaben, Ziffern und die Unterstreichung enthalten, Namendas erste Zeichen eines Namens darf aber keine Ziffer sein. Gro- und Kleinschrei-bung sind bedeutsam. Die Lnge eines Namens ist nicht beschrnkt (auer durchIhre persnliche Bequemlichkeit).

    B Buchstabe steht in Python 2 fr die Zeichen AZ bzw. az keine Um-laute oder sonstigen fremdlndischen Zeichen. Python 3 ist da wesentlichliberaler es erlaubt praktisch alles, was wie ein Buchstabe aussieht. Es hin-dert Sie also niemand daran, in Frankreich Variablennamen mit Akzenten

  • 28 2 Einfache Datentypen

    oder in Russland kyrillische Variablennamen zu verwenden von chine-sischen, japanischen, koreanischen oder arabischen Zeichen mal ganz zuschweigen. (Ob Sie Ihren Kollegen damit uneingeschrnkt einen Gefallentun, steht allerdings auf einem anderen Blatt.)

    B Die Details stehen im Abschnitt 2.3 des Python-Sprachhandbuchs. Unterhttp://www.dcl.hpi.uni-potsdam.de/home/loewis/table-3131.html finden Sie eine(nicht normative) Liste der Zeichen aus Unicode 4.1, die fr Python-Namenin Frage kommen.

    Einige ansonsten plausibel wirkende Namen werden von Python als Schls-Schlsselwrterselwrter fr interne Zwecke verwendet und sind als Namen von Variablen nichterlaubt. In Python 3 sind das

    and del from None True

    as elif global nonlocal try

    assert else if not while

    break except import or with

    class False in pass yield

    continue finally is raise

    def for lambda return

    B In Python 2 sind exec und print Schlsselwrter und True, False und Nonenicht. nonlocal ist in Python 2 auch kein Schlsselwort. Machen Sie sich aberkeinen zu groen Kopf.

    Auerdem haben einige Klassen von Namen eine besondere Bedeutung. DieseNamen mit Sonderbedeutungerkennt man an den Unterstreichungen am Anfang oder Ende:

    _IRGENDWAS Namen, die mit einer Unterstreichung anfangen, werden von einemModul nicht automatisch exportiert.

    B Der Name _ bezieht sich im interaktiven Modus implizit auf den zu-letzt berechneten Wert. Das macht das Leben bequemer:

    >>> 1+2*3

    7

    >>> 4*_+5

    33

    In Programmen hat _ keine Sonderbedeutung.

    B _ wird in Programmen oft verwendet, um Zeichenketten zu kennzeich-nen, die im Zuge der Internationalisierung bzw. Lokalisierung ei-nes Programms bersetzt werden sollen. Man schreibt also

    print _("Hallo Welt")

    und sorgt dafr, dass _ fr eine Funktion steht, die die bersetzung derZeichenkette in einer geeigneten Datenbank nachschlgt. Vorgeschrie-ben ist das aber nicht.

    __IRGENDWAS__ Namen mit je zwei Unterstreichungen am Anfang und am Ende ha-ben eine magische Sonderbedeutung, die vom Python-Interpreter festge-legt wird. Sie knnen damit zum Beispiel Konstruktoren und Destruktorenfr Objekte implementieren oder Operatoren berladen.

    __IRGENDWAS Namen mit zwei Unterstreichung am Anfang (aber keinen zwei Unter-streichungen am Ende) gelten als klassenprivat. Wenn Sie objektorientiertmit Klassen und Unterklassen arbeiten, knnen Sie so vermeiden, dass in-terne Attribute verschiedener Klassen miteinander kollidieren. Wir schauenuns das im Kapitel ber objektorientierte Programmierung genauer an.

  • 2.4 Zeichenketten 29

    2.4 Zeichenketten

    2.4.1 Zeichenketten-Literale

    Python kann nicht nur mit Zahlen umgehen, sondern auch mit Zeichenketten (dassollte Sie nicht mehr wirklich berraschen). Schauen wir uns zunchst an, wieZeichenketten-Literale aussehen:

    >>> "Hallo"

    'Hallo'

    >>> 'Hallo'

    'Hallo'

    Zeichenketten-Literale werden entweder mit einfachen oder mit doppelten An- Anfhrungszeichenfhrungszeichen eingerahmt. Die Anfhrungszeichen sind selber nicht Teil desLiterals. Die betreffenden Anfhrungszeichen drfen im Literal selbst nicht vor-kommen:

    >>> "Er sagte "Huch" und fiel in Ohnmacht"

    SyntaxError: invalid syntax

    >>> 'Er sagte "Huch" und fiel in Ohnmacht' Besser.

    'Er sagte "Huch" und fiel in Ohnmacht'

    >>> "Er sagte 'Huch' und fiel in Ohnmacht" Auch gut.

    "Er sagte 'Huch' und fiel in Ohnmacht"

    Sie knnen die Anfhrungszeichen im Literal auch hinter einem Rckstrich (back-slash) verstecken:

    >>> "Er sagte \"Huch\" und fiel in Ohnmacht"

    'Er sagte "Huch" und fiel in Ohnmacht'

    Alternativ knnen Sie lange Zeichenketten benutzen. Die beginnen mit drei An- lange Zeichenkettenfhrungszeichen (statt einem) und enden mit drei weiteren zu denen am Anfangpassenden Anfhrungszeichen. In ihrem Innern drfen nicht nur (einzeln oderpaarweise) dieselben Anfhrungszeichen stehen, sondern auch Zeilenumbrche:

    >>> """Er sagte "Huch"

    ... und fiel in Ohnmacht"""

    'Er sagte "Huch"\nund fiel in Ohnmacht'

    Im vorigen Beispiel knenn Sie auch sehen, wie Sie einen Zeilenumbruch ineiner literalen Zeichenkette unterbringen: mit der Zeichenkombination \n. All-gemein gibt es eine ganze Reihe von Sonderzeichen, die ber solche Rckstrich- SonderzeichenKombinationen zu erreichen sind; betrachten Sie Tabelle 2.1.

    Python 2 und Python 3 unterscheiden sich darin, wie sie mit Unicode umge- Unicodehen. In Python 3 sind alle Zeichenketten-Literale automatisch Unicode-Zeichen-ketten. Python 3 geht auch davon aus, dass Programmdateien gem UTF-8 co-diert sind; eine explizite Angabe der Zeichencodierung brauchen Sie also nur,wenn das nicht der Fall ist4. Zum Ausgleich untersttzt Python 3 sogenannte Byte- Byte-StringsStrings, die durch ein vorgestelltes b (oder B) kenntlich gemacht werden:

    b"Hallo Welt!"

    Byte-Strings bestehen in Python 3, wie der Name sagt, aus Bytes, die nicht weiterinterpretiert werden. ASCII-Zeichen stehen zum grten Teil fr sich (die bli-chen Sequenzen wie in Tabelle 2.1 gelten, auer \u, \U und \N), aber wenn Sie einByte mit einem Wert grer 127 darstellen wollen, mssen Sie \x oder die Oktal-schreibweise benutzen.

    4Fr UTF-8-codierte Dateien schadet sie aber auch nichts.

  • 30 2 Einfache Datentypen

    Tabelle 2.1: Rckstrich-Kombinationen in Zeichenketten-Literalen

    Kombination Bedeutung\\ Rckstrich (\)\' Einfaches Anfhrungszeichen (')\" Doppeltes Anfhrungszeichen (")\a Signalton (ASCII BEL)\b Rckschritt (ASCII BS)\f Seitenvorschub (ASCII FF)\n Zeilenschritt (ASCII LF)\r Wagenrcklauf (ASCII CR)\t Horizontaler Tabulator (ASCII TAB)\v Vertikaler Tabulator (ASCII VT)

    \ooo Zeichen mit dem oktalen numerischen Code ooo\xhh Zeichen mit dem hexadezimalen numerischen Code hh

    \uxxxx Zeichen mit dem 16-Bit-Hexadezimalcode xxxx*\uxxxxxxxx Zeichen mit dem 32-Bit-Hexadezimalcode xxxxxxxx*\N{Name} Zeichen mit dem Namen Name*

    * = Nur in Unicode-Literalen (Python 2) bzw. Zeichenketten-Literalen (Python 3)

    Python 2 trennt zwischen ASCII- und Unicode-Strings, und der Standard istASCII. Das heit, es wird davon ausgegangen, dass ein Literal wie

    "Hallo Welt"

    nur ASCII-Zeichen enthlt. Sollen Zeichen vorkommen, die nicht dem Standard-7-Bit-ASCII entstammen, mssen Sie das voranmelden:

    u"Gr\u00fcezi Welt"

    Das u vor dem ffnenden Anfhrungszeichen weist Python darauf hin, dass essich hier um einen Unicode-Literal handelt; fehlte es, dann wrde das \u00fceine Fehlermeldung auslsen.

    B Statt u drfen Sie auch U schreiben, um einen Unicode-Literal einzuleiten.Das ist allerdings ziemlich unblich.

    B Vorgesetzte us (oder Us) werden von Python 3 nur noch aus Kompatibilitts-grnden untersttzt5). Standardmig sind ja alle Zeichenketten Unicode.

    B Dass in Python 2 in einem Zeichenketten-Literal ein Unicode-Zeichen ste-hen darf, heit noch lange nicht, dass Sie es auch direkt eintippen drfen:Etwas wie

    u"Grezi Welt"

    im Programmtext wrde Python 2 anmeckern, da es nicht auf Anhieb wei,wie das Zeichen zu interpretieren ist (es gibt ja grundstzlich diverseMglichkeiten ISO-Latin-1 oder UTF-8 knnten Ihnen in den Sinn kom-men).

    B Dieses Problem knnen Sie beheben, indem Sie Python mitteilen, welcheZeichencodierung in einer Datei benutzt wird. Dazu mssen Sie in die ersteoder zweite Zeile der Datei etwas schreiben wie

    5Vor Python 3.3 ging das gar nicht aber dann wurde es wieder eingefhrt, um das Erstellen vonProgrammen zu erleichtern, die sowohl mit Python 2 als auch Python 3 funktionieren sollen.

  • 2.4 Zeichenketten 31

    # -*- coding: utf-8 -*- Emacs-freundlich

    # vim:fileencoding=utf-8 Vi(m)-freundlich

    (Python sucht nach coding, gefolgt von einem Doppelpunkt oder Gleich-heitszeichen, mglicherweise gefolgt von Freiplatz, gefolgt vom Namen ei-ner Zeichencodierung.)

    B Alternativ knnen Sie auch das Unicode-Byteorder-Zeichen die Bytes\xef\xbb\xbf an den Anfang Ihrer Datei setzen (Windows Notepad machtdas fr Sie), damit Python Ihre Datei als UTF-8 erkennt.

    In Python knnen Sie mehrere Zeichenketten-Literale direkt nebeneinander-stellen. Diese gelten dann als ein groes Literal, das die Zeichenkette repr-sentiert, die Sie erhalten, wenn Sie die Werte der einzelnen Literale lckenlosaneinanderhngen. Die einzelnen Literale drfen zum Beispiel unterschiedlicheAnfhrungszeichen-Konventionen verwenden:

    >>> "Hallo" 'Welt'

    'HalloWelt'

    Auch eine Mischung aus Unicode- und einfachen Literalen ist erlaubt:

    >>> u"Gr\u00fcezi" 'Welt'

    u'Gr\xfceziWelt'

    >>> print(u"Gr\u00fcezi" 'Welt')

    GreziWelt

    2.4.2 Zeichenketten-Ausdrcke

    Auch Zeichenketten knnen Sie in Python gezielt manipulieren, etwa indem Siesie aneinanderhngen:

    >>> hw = "Hallo Welt"

    >>> print(hw + 'enbummler')

    Hallo Weltenbummler

    Multiplikation einer Zeichenkette mit einer Zahl ist auch erlaubt:

    >>> "Bla" * 3 So herum

    'BlaBlaBla'

    >>> 3 * "Bla" oder so herum

    'BlaBlaBla'

    Die Lnge einer Zeichenkette ermitteln Sie mit der Funktion len(): Lnge

    >>> len("Hallo")

    5

    Zeichenketten sind in Python eine Form von Folgen (sequence types). Zu die- Folgensen zhlen auch Listen und Tupel, die wir spter kennenlernen werden. Es gibtdiverse ntzliche Operationen, die Sie auf Listen und Tupel anwenden knnenund die auch mit Zeichenketten funktionieren wir kommen darauf zurck.

  • 32 2 Einfache Datentypen

    Zusammenfassung

    Python untersttzt ganze Zahlen (normale und lange), Gleitkomma-zahlen und komplexe Zahlen.

    Python untersttzt die gngigen Grundrechenarten mit den blichen Vor-rangregeln (die Division ist ein bisschen trickreich).

    Diverse ntzliche mathematische Funktionen sind entweder standardm-ig im Python-Interpreter realisiert oder ber das Modul math zugnglich.

    Namen in Python drfen Buchstaben, Ziffern und den Unterstrich enthalten(aber nicht mit einer Ziffer anfangen). Einige Schlsselwrter sind tabu.

    Namen, die mit einem Unterstrich anfangen, haben eine Sonderbedeutung. Zeichenketten-Literale werden durch einfache oder doppelte Anfhrungs-

    zeichen begrenzt. Lange Literale drfen Zeilenumbrche enthalten. Zeichenketten untersttzen Aneinanderhngen, Multiplikation und Ln-

    genbestimmung. Zeichenketten in Python sind eine Art von Folgen

  • 3Verzweigungen und Schleifen

    Inhalt3.1 Verzweigungen mit if . . . . . . . . . . . . . . . . . . 34

    3.1.1 Einstieg . . . . . . . . . . . . . . . . . . . . . 343.1.2 Boolesche Ausdrcke . . . . . . . . . . . . . . . . 343.1.3 else und elif . . . . . . . . . . . . . . . . . . . 37

    3.2 Schleifen mit while . . . . . . . . . . . . . . . . . . . 393.2.1 Wiederholungen . . . . . . . . . . . . . . . . . . 393.2.2 break und continue . . . . . . . . . . . . . . . . . . 41

    Lernziele Boolesche Ausdrcke in Python verstehen Verzweigungen mit if verwenden knnen Schleifen mit while verwenden knnen

    Vorkenntnisse Einfache Datentypen in Python (Kapitel 2) Erfahrung mit anderen Programmiersprachen ist von Vorteil

    pyth-loops.tex (4294f89813971178)

  • 34 3 Verzweigungen und Schleifen

    3.1 Verzweigungen mit if

    3.1.1 Einstieg

    Programmiersprachen werden eigentlich erst in dem Moment interessant, wosie es erlauben, dass bestimmte Programmteile manchmal ausgefhrt werdenund manchmal nicht1. Da Python eine interessante Programmiersprache ist, ent-tuscht es uns in dieser Beziehung nicht. Das if-Kommando wertet eine Bedin-gung aus und fhrt ein Programmstck nur dann aus, wenn die Bedingungwahr ist:

    if i > 10:

    print "i ist grer als 10!"

    j = 2*i+1

    (Beachten Sie den Doppelpunkt am Zeilenende hinter der Bedingung.)Die if-Konstruktion ist ein Beispiel fr ein zusammengesetztes Kommando inzusammengesetztes Kommando

    Python. Es besteht aus einem Kopf dem if, der Bedingung und dem Doppel-punkt gefolgt von einer Kommandofolge (engl. Suite). Eine KommandofolgeKommandofolgewiederum ist entweder eine Anzahl von gleich weit eingerckten Kommandosauf eigenen Zeilen unter dem Kopf (wie im Beispiel oben) oder aber eine durchSemikolons getrennte Anzahl von Kommandos auf derselben Zeile wie der Kopf,unmittelbar hinter dem Doppelpunkt:

    if i > 10: print "i ist grer als 10!"; j = 2*i+1

    B Letzteres ist hin und wieder ntzlich, aber nicht uneingeschrnkt frderlichfr die Lesbarkeit Ihres Codes. Verwenden Sie es sparsam und mit Vorbe-dacht.

    Pythons Philosophie, Einrckung zur Darstellung der Programmstruktur zuEinrckungverwenden, ist fr viele Programmierer zunchst ungewohnt und abschreckend,aber hat durchaus Vorteile, weil sie Fehler verhindern kann.

    B Andere Programmiersprachen verwenden geschweifte Klammern oderSchlsselwrter wie BEGIN und END aber Sie sind trotzdem gehalten, IhreProgramme ordentlich einzurcken. Das ist eine potentielle Problemquelle,weil einerseits nicht garantiert ist, dass die Einrckung der tatschlichenProgrammstruktur gem der Klammern oder Schlsselwrter entspricht,andererseits wir Programmierer uns gerne vom groben optischen Eindruckder Einrckung irrefhren lassen, selbst wenn im Programm eigentlichetwas ganz Anderes steht. In Python ist beides dasselbe, so dass es keineVerwirrung geben kann.

    B Wie blich taugt so etwas als Quelle hitziger Meinungsverschiedenheiten.Wir haben dazu nichts zu sagen auer dass Python eben so ist; wenn Siedie geschweiften Klammern wollen, dann mssen Sie halt in Perl oder PHPprogrammieren.

    3.1.2 Boolesche Ausdrcke

    Der Ausdruck hinter dem if muss wahr sein, damit die vom if abhngige Kom-Wahr und falschmandofolge ausgefhrt wird. Als wahr betrachten wir in diesem Zusammen-hang alles, was nicht falsch ist. Falsch wiederum sind Werte, die numerischNull sind (egal, welche Typen ganzzahlig, Gleitkomma oder komplex), und ei-nige andere Werte, die Sie noch nicht gesehen haben.

    1Das andere, was man haben mchte, ist, bestimmte Programmteile in Abhngigkeit von Bedin-gungen wiederholen zu knnen aber dazu kommen wir spter in diesem Kapitel.

  • 3.1 Verzweigungen mit if 35

    Tabelle 3.1: Vergleichsoperatoren in Python

    Operator Bedeutung== Gleichheit!= Ungleichheit Ungleichheit (Python 2, verpnt)< Kleiner als Grer als>= Grer als oder gleichis Objektidentitt

    is not Objekt-Nichtidentitt

    B Ohne jetzt allzusehr vorgreifen zu wollen: Die anderen Mglichkeiten sinddie vordefinierten Werte False und None, leere Zeichenketten und leere Con-tainer (wie Tupel, Listen, Dictionaries, Mengen usw.). Alles andere gilt alswahr.

    B True und False sind im Grunde nur vornehme Namen fr die numerischenWerte 1 und 0. Python untersttzt einen besonderen numerischen Datentypfr Boolesche Werte2. False und True sind die einzigen Booleschen Objekte inPython und benehmen sich fr alle praktischen Zwecke wie 0 und 1, werdenaber respektive als die Zeichenketten "False" und "True" ausgegeben.

    Whrend etwas wie 1+2 absolut als Boolescher Ausdruck in einem if inFrage kommt, bieten Vergleichsoperatoren sich vielleicht eher an. Python unter- Vergleichsoperatorensttzt die gngigen Vergleichsoperatoren, die Sie vielleicht von anderen Program-miersprachen her kennen (siehe Tabelle 3.1).

    Vergleichsoperatoren liefern immer einen der Werte False oder True. Beide Ope-randen mssen denselben Typ haben. Numerische Operanden werden notfallsumgewandelt etwa von ganzen in Gleitkomma-Zahlen , bis sie vergleichbarwerden:

    >>> 1 < 0

    False

    >>> 2 > 1.5

    True

    Zeichenketten werden lexikografisch verglichen, also Zeichen fr Zeichen, wo- Zeichenketten vergleichenbei die Codepunkt-Nummern der Zeichen zhlen (@ ist zum Beispiel 64 und aist 97.) Python betrachtet dazu das erste Zeichen der beiden Zeichenketten; ist diesbei beiden gleich, fhrt es mit dem zweiten Zeichen fort usw., bis es entweder einePosition erreicht, wo die beiden Zeichenketten sich unterscheiden, oder das Endeeiner der Zeichenketten. Im ersteren Fall entscheiden die Zeichen an dieser Positi-on ber das Ergebnis, im letzteren gilt die krzere Zeichenkette als kleiner, undwenn sie gleich lang sind (also beide auf einmal zu Ende), dann sind sie gleich.

    B Komplexe Zahlen knnen gar nicht verglichen werden. In frheren Versio-nen von Python ging das, aber es ist mathematisch gesehen Unfug.

    B Python 2 erlaubt tatschlich Vergleiche zwischen Objekten verschiedenenTyps. Allerdings passiert nicht unbedingt das, was man vermuten wrde.In Vergleichen zwischen numerischen Typen und anderen (etwa Zeichen-ketten) gilt ein Objekt numerischen Typs immer als kleiner:

    2Der britische Mathematiker, Philosoph und Logiker George Boole (18151864) gilt als Begrnderder mathematischen Logik. Er war auch ziemlich clever, was Differentialgleichungen und Wahrschein-lichkeitsrechnung anging.

  • 36 3 Verzweigungen und Schleifen

    >>> 4 < "3"

    True Nanu!?

    Nichtnumerische Typen werden untereinander verglichen, indem die Na-men ihrer Typen als Zeichenketten verglichen werden. Die Werte werdendafr berhaupt nicht angeschaut:

    >>> True > "bla"

    False

    (True ist vom Typ bool und "bla" vom Typ str, der Vergleich ist also unterdem Strich eigentlich "bool" > "str", und das ist wie oben besprochen False.)3

    B In Python 3 sind Vergleiche zwischen Objekten unterschiedlichen Typs ein-fach nicht erlaubt4:

    >>> 4 < "3"

    TypeError: unorderable types: int() < str()

    Boolesche Werte knnen mit den logischen Operatoren and, or und not ver-Logische Operatorenknpft werden. Der Operator not ist am einfachsten: Er liefert False, wenn seinOperand wahr ist, und sonst True. (Beachten Sie, dass Python nicht darauf be-steht, dass der Operand ein Boolescher Wert im engeren Sinne ist.)

    >>> not True

    False

    >>> not False

    True

    >>> not (1 > 0)

    False

    >>> not 4711

    False

    Der Operator and liefert genau dann ein wahres Ergebnis, wenn beide Ope-Operator andranden wahr sind:

    >>> True and False

    False

    >>> True and True

    True

    Es ist wichtig zu wissen, dass and sich dafr die minimal mgliche Mhe macht:Zuerst wird der linke Operand ausgewertet, und wenn dieser ein falsches Er-gebnis liefert, wird der rechte Operand vllig ignoriert, da sein Wert fr das Ge-samtergebnis nicht mehr relevant ist (es ist so oder so falsch). Dies ist oft ntz-lich, etwa in Konstruktionen wie

    if n != 0 and total/n > 5:

    3Man knnte sich fragen, was Guido van Rossum Potentes geraucht hatte, bevor er sich diese Merk-wrdigkeit berlegt hat. Die Motivation dahinter, das zu erlauben, war, dass es mglich sein soll-te, heterogene Listen, also Listen von Objekten unterschiedlichen Typs, zu sortieren. Spter kamenkomplexe Zahlen dazu, und heterogene Listen wurden sachte verpnt.

    4Auch heterogene Listen knnen in Python 3 nicht mehr sortiert werden.

  • 3.1 Verzweigungen mit if 37

    wo die Division nur stattfinden soll, wenn der Divisor von Null verschieden ist5.Logischerweise gilt das auch analog fr Verkettungen der Form

    a and b and c and d

    die Auswertung endet mit dem ersten Operanden, der falsch ist, bzw. wennauch d wahr ist, mit dem Ende der Kette.

    Der Operator or liefert ein wahres Ergebnis, wenn mindestens einer seiner Operator orOperanden wahr ist. Er funktioniert ganz genauso wie and, bis darauf, dass dieAuswertung mit dem ersten Operanden endet, der sich als wahr herausstellt.

    B Tatschlich liefert or nicht True oder False als Ergebnis, sondern den Wert desletzten ausgewerteten Operanden. Das ist sehr bequem, erlaubt es doch dieVergabe von Standardwerten fr unbelegte Variable:

    >>> a = 0

    >>> a or 123

    123

    (and macht dasselbe, aber da drngt die Anwendung sich nicht so auf.)

    not hat Vorrang vor and und beide haben Vorrang vor or.Hier ist noch eine kleine ntzliche Ungewhnlichkeit (oder ungewhnliche

    Ntzlichkeit): Python gestattet es, Vergleiche aneinanderzureihen: 0 < a < 10 ist Vergleiche aneinanderreihenquivalent zu 0 < a and a < 10, bis darauf, dass der Wert von a nur einmal be-stimmt werden muss (damit sich das wirklich lohnt, knnte dort statt a ein kom-plizierter Funktionsaufruf stehen, der eine Datenbankrecherche macht oder etwasaus dem Internet herunterldt). Auch hier wird links angefangen, weitergemacht,bis das Ergebnis feststeht, und allfllige irrelevante Ausdrcke am rechten Endeder Kette ignoriert.

    B Die Vergleiche mssen nicht notwendigerweise etwas miteinander zu tunhaben: 0 < a == b < c ist auch erlaubt (und quivalent zu 0 < a and a ==b and b < c). Insbesondere erlaubt eine Vergleichskette wie a < b > c kei-ne Aussagen darber, ob a < c wahr ist oder nicht. Sie sollten das nichtberstrapazieren.

    3.1.3 else und elif

    Das if-Kommando ist nicht nur dazu zu gebrauchen, eine Kommandofolge aus-zufhren, wenn eine Bedingung erfllt ist. Sie knnen auch alternativ eine Kom-mandofolge ausfhren, wenn die Bedingung wahr ist, und eine andere, wennsie falsch ist. Dazu dient else:

    if n % 2 == 0:

    print("n ist gerade")

    else:

    print("n ist ungerade")

    (Wichtig: Auch hinter dem else steht ein Doppelpunkt.) In der ifelse-Konstruk-tion wird die Kommandofolge nach dem if ausgefhrt, wenn die Bedingungwahr ist, die Kommandofolge nach dem else sonst.

    B Die Regel, dass eine Kommandofolge direkt hinter dem Doppelpunkt ste-hen darf, gilt natrlich auch hier. Etwas wie

    5Wenn Sie C oder eine andere Sprache aus demselben Dunstkreis kennen (Perl, Tcl, Shell, ), dannist dieses Verhalten Ihnen bereits gelufig. In anderen Programmiersprachen Pascal oder FORTRANdrngen sich auf bruchte man dafr zwei ineinander verschachtelte IFs, weil ansonsten nicht ga-rantiert ist, dass nicht mglicherweise der zweite Operand zuerst ausgewertet wird.

  • 38 3 Verzweigungen und Schleifen

    if n % 2 == 0: print ("n ist gerade")

    else: print ("n ist ungerade")

    ist absolut erlaubt, selbst wenn es nicht gerade den Gipfel des lesbarenCodes darstellt. Auch Mischformen wie

    if n % 2 == 0:

    print ("n ist gerade")

    else: print ("n ist ungerade")

    sind denkbar, unter denselben Vorbehalten.

    Natrlich knnen Sie ifs (und elses) auch verschachteln. Sie mssen nur dieifs verschachtelnEinrckung konsequent einhalten. Zum Beispiel:

    if x

  • 3.2 Schleifen mit while 39

    B Nur zur Illustration und ohne Rcksicht auf etwaige unaufgelste Vorwrts-referenzen: Schlagen Sie zum Beispiel einen gewnschten Wert in einem li-teralen Dictionary nach.

    choice = 'Mortadella'

    print({ 'Gelbwurst': 1.25,

    'Mortadella': 1.99,

    'Leberwurst': 0.99,

    'Speck': 1.10 }[choice])

    Hier gibt es leider keine direkte Mglichkeit, einen Standardwert vorzuge-ben, aber das knnen Sie ber die get()-Methode erreichen:

    options = { 'Gelbwurst': 1.25,

    'Mortadella': 1.99,

    'Leberwurst': 0.99,

    'Speck': 1.10 }

    choice = 'Mortadella'

    print options.get(choice, 'Schlechte Auswahl'))

    Oder Sie schalten einen in-Test vor:

    if choice in branch:

    print(branch['choice'])

    else:

    print('Schlechte Auswahl')

    (Mehr ber Dictionaries steht im Kapitel 6.)

    3.2 Schleifen mit while

    3.2.1 Wiederholungen

    Nachdem Sie jetzt gelernt haben, wie Fallunterscheidungen mit if funktionieren,ist der nchste Schritt, Ihnen zu zeigen, wie Schleifen funktionieren. Die einfachsteForm von Schleife, die in Python zur Verfgung steht, ist der Fallunterscheidungprinzipiell gar nicht unhnlich:

    i = 1

    while i

  • 40 3 Verzweigungen und Schleifen

    while i >> s = "123"

    >>> s += "X"

    >>> s

    '123X'

    >>> s *= 3

    >>> s

    '123X123X123X'

    Die einzige Vorbedingung ist, dass die zugrundeliegenden Operatoren wie+ oder * fr den betreffenden Datentyp definiert sind.

  • 3.2 Schleifen mit while 41

    B Ganz identisch sind x = x + y und x += y brigens nicht. Zum einenknnte es sein, dass bei der Bestimmung von x irgendwelche Seiteneffek-te ausgelst werden. Bei = passiert das dann zweimal und bei += nur einmal(das ist Absicht). Zum anderen ist es sehr wahrscheinlich, dass bei = dasObjekt, auf das x zeigt, verworfen und durch ein bei der Auswertung derrechten Seite neu angelegtes Objekt ersetzt wird, whrend bei +=, soweit ir-gend mglich, das Objekt, auf das x zeigt, direkt manipuliert wird. (Wennwir genauer ber Zuweisung geredet haben, wird das hoffentlich klarer.)

    B Zeichenketten sind in Python unvernderbare Objekte. Das heit, auchbei s += "X" muss ein neues Objekt generiert werden, das dann an s zuge-wiesen wird. Der Gipfel der Effizienz ist das natrlich nicht. (Wobei einigeImplementierungen von Python es sich da erlauben, ein paar Abkrzungenzu nehmen, um den Performanceverlust zu mildern.)

    bungen

    C 3.1 [!1] Schreiben Sie ein Programm, das von 10 aus rckwrts zhlt undbei 0 aufhrt.

    C 3.2 [2] Schreiben Sie ein Programm, das die Zahlen 1 bis 50 ausgibt (einepro Zeile), mit den folgenden Ausnahmen:

    Ist eine Zahl durch 5 teilbar, wird statt der Zahl das Wort Hopp aus-gegeben.

    Ist eine Zahl durch 7 teilbar, wird statt der Zahl das Wort Hipp aus-gegeben.

    Ist eine Zahl durch 5 und 7 teilbar, wird statt der Zahl die Phrase HippHopp ausgegeben.

    C 3.3 [3] Betrachten Sie eine beliebige natrliche Zahl . Wenn gerade ist,dividieren Sie durch 2. Wenn ungerade ist, berechnen Sie 3 + 1. Wie-derholen Sie dieses Vorgehen beliebig oft. Wahrscheinlich werden Sie frheroder spter bei 1 ankommen. Die Collatz-Vermutung (aufgestellt 1937 vomdeutschen Mathematiker Lothar Collatz, 19101990) besagt, dass man aus-gehend von irgendeiner natrlichen Zahl immer bei 1 ankommt. SchreibenSie ein Programm, das fr die Zahlen von 2 bis 100 die Collatz-Vermutungberprft.6

    C 3.4 [2] ndern Sie Ihr Programm aus bung 3.3 so, dass es fr jede getesteteZahl die Anzahl der Schritte bestimmt, die ntig sind, um 1 zu erreichen.Was ist die grte Anzahl von Schritten, die fr Zahlen bis 100 vorkommt,und bei welcher Zahl ist sie ntig? Wie sieht es aus fr Zahlen bis 1000?

    3.2.2 break und continue

    Hin und wieder kommt es vor, dass eine Schleife vorzeitig abgebrochen werdenmuss (zum Beispiel weil eine Fehlersituation aufgetreten ist). In Python dient dazudas break-Kommando. Es beendet die innerste umgebende Schleife: break-Kommando

    s0 = 'Habe nun, ach! Philosophie, Juristerei und Medizin'

    s1 = ''

    i = 0

    while i < len(s0):

    s1 += s0[i] # i-tes Zeichen von s0

    if s0[i] == '!': break

    6Aktuell (2015) ist nicht bekannt, ob die Collatz-Vermutung tatschlich gilt. berprft wurde siefr alle Zahlen bis in die Gegend von 21018 (Stand Februar 2015), aber das beweist natrlich berhauptnichts.

  • 42 3 Verzweigungen und Schleifen

    i += 1

    print s1

    liefert die Ausgabe

    Habe nun, ach!

    weil das if in der Schleife die Schleife mit break beendet, wenn das aktuell betrach-tete Zeichen ein Ausrufungszeichen ist.

    B Sie knnen mit break in Python (wie in C) immer nur die innerste Schleifebeenden7. Wenn Sie ein break haben wollen, das auch aus umschlieendenSchleifen herausspringen kann, mssen Sie die Bourne-Again Shell (Bash)benutzen oder Perl (dort heit es last).

    B while-Schleifen in Python knnen einen else-Zweig haben (wir hatten ja ge-while und elsesagt, dass if und while sich nicht besonders voneinander unterscheiden).Wie bei if wird die Kommandofolge hinter else ausgefhrt, wenn die kon-trollierende Bedingung falsch liefert.

    B Sie werden sich mglicherweise und mit einiger Berechtigung fragen,was das soll. Schlielich ist

    i = 1

    while i

  • 3.2 Schleifen mit while 43

    knnen Sie aus der Mitte einer Schleife heraus wieder an deren Anfang springenund den nchsten Durchlauf beginnen wobei bei while dafr zuallerst die Bedin-gung getestet wird.

    Das Beispiel dafr benutzt ein paar Sachen, die Sie noch nicht kennen: Sie kn-nen Daten von der Standardeingabe lesen, indem Sie das Modul sys importieren: Standardeingabe lesen

    >>> import sys

    Anschlieend liest die Methode sys.stdin.readline() die nchste Zeile von derStandardeingabe ein:

    >>> s = sys.stdin.readline()

    foobar

    >>> s

    'foobar\n'

    B Methoden sind ein Konzept aus der objektorientierten Programmierung, Methodenauf das wir spter noch zurckkommen. Falls es Sie interessiert: sys.stdinist ein Dateiobjekt, das fr die Standardeingabe steht, und die Methodereadline() ist fr Dateiobjekte erklrt. Mit dieser Methode bringen Sie dasDateiobjekt dazu, die nchste Zeile zu holen und als Ergebnis zurckzulie-fern.

    B Die gelesene Zeile endet immer mit einem Zeilentrenner (\n)8. Nur amDateiende ist das nicht der Fall, dann liefert die Funktion die leere Zeichen-kette zurck.

    Ob eine Zeichenkette nur aus Ziffern besteht, knnen Sie mit der Methodeisdigit() prfen. (Zeichenketten sind auch Objekte.) isdigit()

    >>> "123".isdigit()

    True

    >>> "abc".isdigit()

    False

    Der Zeilentrenner an gerade frisch gelesenen Zeilen ist dabei mglicherweise st-rend. Ihn knnen Sie mit der Methode strip() loswerden: strip()

    >>> "abc\n".strip()

    'abc'

    B Genaugenommen entfernt strip() beliebigen Freiplatz auer Zeilentren-nern also auch Leerzeichen, Tabulatorzeichen, Wagenrcklaufzeichen, For-mularvorschbe und so weiter von beiden Enden einer Zeichenkette. Also:

    >>> " \t \n xyz 123 \f\r ".strip()

    'xyz 123'

    (Freiplatz im Inneren einer Zeichenkette bleibt unberhrt).

    Alle diese Ntzlichkeiten knnen wir jetzt verwenden, um eine Zahl von der Stan-dardeingabe einzulesen und sicherzustellen, dass es sich um eine Zahl handelt:

    number = None

    while number is None:

    line = sys.stdin.readline()

    8Jedenfalls allerallermeistens. Wenn die letzte Zeile in einer Datei keinen Zeilentrenner am Endehat, dann hat sie auch keinen, wenn sie von Python gelesen wurde. Damit das passiert, mssen Siesich aber schon ein bisschen anstrengen.

  • 44 3 Verzweigungen und Schleifen

    if line == '':

    print "Dateiende!"

    break

    line = line.strip()

    if not line.isdigit():

    print "Bitte geben Sie eine Zahl ein!"

    continue

    number = int(line)

    else:

    print number

    Wir benutzen hier None als Startwert fr die Variable number. None ist ein speziellerWert, der fr kein Wert steht.

    B Normalerweise knnte man statt while number is None auch nur while notnumber schreiben. Allerdings knnte es sein, dass der Benutzer die Zahl 0eingibt und wie wir in Abschnitt 3.1.2 gelernt haben, gilt der numeri-sche Wert 0 als falsch, so dass while not number einen weiteren Schleifen-durchlauf bewirken wrde. while number is None prft hingegen auf Iden-titt mit dem Objekt None (das es nur einmal gibt).

    B Der Vergleichsoperator is ist eine verschrfte Form des Operators == wh-rend == auf Wertgleichheit testet (wobei Sie theoretisch sogar bestimmenknnen, wie das genau funktionieren soll), testet is auf Objektidentitt. aObjektidentittis b ist genau dann wahr, wenn a und b fr dasselbe Python-Objekt ste-hen. (Statt not a is b knnen und sollten Sie a is not b schreiben; isnot verhlt sich zu is wie != zu ==.

    bungen

    C 3.5 [!3] Schreiben Sie ein einfaches Zahlen-Ratespiel: Der Computer erzeugteine Zufallszahl zwischen 1 und 100 und fordert den Benutzer auf, dieseZahl zu erraten. Dazu gibt der Benutzer eine vermutete Zahl ein, und derComputer antwortet mit Zu gro oder Zu klein, bevor er nach einerneuen Vermutung fragt. Das Spiel endet, wenn die Zufallszahl erraten wur-de oder der Benutzer eine leere Eingabe macht. (Tipp: Nach dem Komman-do import random liefert die Funktion random.randint(,) eine ganzzahligeZufallszahl mit .)

    Zusammenfassung

    Python nutzt Einrckung zur Darstellung der Programmstruktur. In Python gibt es einen Booleschen Datentyp, der aber bis auf die Werte True

    und False dem ganzzahligen Datentyp entspricht. Python untersttzt diverse Vergleichsoperatoren, die Boolesche Ergebnisse

    liefern. Die logischen Operatoren sind not, and und or. Python erlaubt die bedingte Ausfhrung von Programmteilen mit if und

    else. Ketten von Vergleichen lassen sich oft mit elif vereinfachen. Python untersttzt keine CASE- bzw. switch-Verzweigung.

  • 4Strukturierte Datentypen: Folgen

    Inhalt4.1 Strukturierte Daten: Tupel. . . . . . . . . . . . . . . . . 464.2 Strukturierte Daten: Listen . . . . . . . . . . . . . . . . 514.3 Mehr ber Zeichenketten . . . . . . . . . . . . . . . . . 564.4 Schleifen mit for und Ranges . . . . . . . . . . . . . . . . 624.5 List Comprehensions . . . . . . . . . . . . . . . . . . 66

    Lernziele Tupel und Listen einsetzen knnen Mehr ber Zeichenketten erfahren Schleifen mit for verwenden knnen List comprehensions einsetzen knnen

    Vorkenntnisse Einfache Datentypen in Python (Kapitel 2) Verzweigungen und Schleifen in Python (Kapitel 3) Erfahrung mit anderen Programmiersprachen ist von Vorteil

    pyth-seqs.tex (4294f89813971178)

  • 46 4 Strukturierte Datentypen: Folgen

    4.1 Strukturierte Daten: Tupel

    Pythons einfache Datentypen sind bequem und ntzlich, aber reichen nicht fralle Anwendungen aus. Wenn wir zum Beispiel ein Programm schreiben wollen,das sich mit Punkten im dreidimensionalen Raum befasst, dann ist es ntzlich, die-, - und -Koordinaten eines Punkts gemeinsam behandeln zu knnen. Schlie-lich ist eine Zuweisung wie

    p1 = p0

    wesentlich bequemer als

    p1_x = p0_x; p1_y = p0_y; p1_z = p0_z

    Python erlaubt es, mehrere Datenobjekte zu einem Tupel zusammenzufassen.TupelEinen Punkt im Raum knnten Sie zum Beispiel darstellen wie

    p0 = 1, 2, 3 -, - und -Koordinate

    Das heit, bei Tupel-Literalen werden die einzelnen Komponenten (nennen wirsie Elemente) durch Kommas getrennt. Oft schreibt man Tupel in Klammern,um deutlicher zu machen, dass die Komponenten zusammengehren:

    p0 = (1, 2, 3)

    B Wenn Sie aufgepasst haben, werden Sie sich jetzt sicherlich fragen, ob es Tu-Tupel mit einemeinzigen Element pel mit einem einzigen Element geben kann und wenn ja, wie Python solche

    Tupel von mathematischen Ausdrcken unterscheidet, die in Klammernstehen. Ist (4711) ein literales Tupel mit dem einzigen Element 4711, oderist es einfach die literale Ganzzahl 4711 in Klammern? Die Antwort daraufist: Letzteres. Um ein Tupel mit einem einzigen Element hinzuschreiben,mssen Sie ein Komma hinter das Element setzen, so wie (4711,). (4711,wrde es auch schon tun.)

    B Allgemein gesagt: Ein Komma hinter dem letzten Element macht nichts undwird ignoriert. Dies hilft nicht nur bei der Unterscheidung zwischen ein-elementigen Tupeln und mathematischen Ausdrcken, sondern erleichtertzum Beispiel auch das Schreiben von Programmen, die Python-Code gene-rieren.

    B Als nchstes werden Sie vermutlich darber nachgrbeln, ob es auch TupelLeere Tupelganz ohne Elemente geben kann? Natrlich das leere Tupel ist einfach einPaar von Klammern ohne Inhalt:

    empty = ()

    (Hier drfen die Klammern selbstverstndlich nicht fehlen.)

    B Statt ber die runden Klammern knnen Sie Tupel auch mit der Funktiontuple() konstruieren (genauer gesagt ist tuple() der Aufruf des Konstruktorstuple()fr die tuple-Klasse, aber objektorientierte Programmierung haben wir nochnicht besprochen). Fr literale Tupel im Programmtext ist das vermutlich et-was berkandidelt, aber mit tuple() knnen Sie Objekte anderer Datentypenin Tupel umwandeln, was manchmal ntzlich ist. Der Unterschied ist, dasstuple() einen einzigen Parameter erwartet, der zum Beispiel eine Liste oderZeichenkette sein kann (einzelne Zahlen sind nicht zulssig).

    Die Elemente eines Tupels mssen nicht zwingend einfache Datenobjekte sein,Elemente eines Tupelssondern sind ziemlich beliebig. Es hindert Sie zum Beispiel niemand daran, einTupel als Element eines anderen Tupels zu benutzen:

  • 4.1 Strukturierte Daten: Tupel 47

    square = ((0,0), (1,0), (1,1), (0,1))

    Generell mssen nicht alle Elemente eines Tupels vom selben Typ sein:

    tage = ((1, 1, "Neujahr"), (18, 4, "Velociraptor Awareness Day"),

    (1, 5, "Maifeiertag"), (25, 5, "Towel Day"))

    (Hier sehen Sie auch, dass Sie innerhalb eines Tupels die Quelltextzeilen beliebigumbrechen drfen.)

    Sie knnen Tupel als Ganzes an andere Variable zuweisen (Duh) oder kompo- Tupel-Zuweisungnentenweise verteilen:

    >>> p = (1, 2, 3)

    >>> (a, b, c) = p

    >>> b

    2

    B Die Klammern auf der linken Seite sind hier auch nicht ntig Sachen wie>>> a, b, c = p

    >>> a, b, c = 1, 2, 3

    wrden auch funktionieren.

    In jedem Fall muss die linke Seite der Zuweisung zur rechten passen. Das heitkonkret, auf der linken Seite muss entweder eine einzige Variable stehen (sie be-kommt dann das komplette Tupel zugewiesen) oder aber genau so viele Variable,wie das Tupel auf der rechten Seite Elemente hat. Ansonsten gibt es rger:

    >>> a, b = p

    Traceback (most recent call last):

    File "", line 1, in

    ValueError: too many values to unpack (expected 2)

    >>> a, b, c, d = p

    Traceback (most recent call last):

    File "", line 1, in

    ValueError: need more than 3 values to unpack

    Tupel benehmen sich in vielerlei Hinsicht wie Zeichenketten: Operationen

    >>> 3, + 4, Aneinanderhngen

    (3, 4)

    >>> 3 * (7,) Vervielfachung

    (7, 7, 7)

    >>> (7,) * 3 Dito andersrum

    (7, 7, 7)

    >>> len((1, 2, 3)) Lnge ist Anzahl der Elemente

    3

    B An dieser Stelle zeigt sich, dass es in der Regel besser ist, Tupel in Klammerneinzufassen. Gerade in den letzten drei Beispielen passieren sonst merkwr-dige und wundersame Dinge:

    >>> 3 * 7,

    (21,)

    >>> 7, * 3

    File "", line 1

  • 48 4 Strukturierte Datentypen: Folgen

    SyntaxError: can use starred expression only as assignment target

    >>> len(1, 2, 3)

    Traceback (most recent call last):

    File "", line 1, in

    TypeError: len() takes exactly one argument (3 given)

    B Man knnte sich auf den Standpunkt stellen, dass man die Klammern nurweglassen darf, damit Sachen wie

    a, b = 1, 2

    x, y = y, x

    schner aussehen. berstrapazieren sollten Sie das nicht, sondern im Zwei-fel lieber die Klammern setzen.

    Wenn Sie aus einem Tupel ein bestimmtes Element herauspicken mchten,Element herauspickenknnen Sie das tun, indem Sie dessen Index in eckigen Klammern an den Namendes Tupels anhngen:

    >>> t = ("Hund", "Katze", "Maus", "Baum")

    >>> t[2]

    Maus

    (Das erste Element des Tupels hat den Index 0.) Negative Indizes zhlen vom Endedes Tupels (das letzte Element hat den Index 1):

    >>> t[-1], t[-3]

    ('Baum', 'Katze')

    Wenn ein Element eines Tupels selber ein Tupel ist, knnen Sie auf eines vondessen Elementen zugreifen, indem Sie mehr eckige Klammern benutzen:

    >>> tt = ("A", ("B", "C"))

    >>> tt[1]

    ('B', 'C')

    >>> tt[1][0]

    'B'

    Zusammenhngende Stcke aus einem Tupel bekommen Sie mit etwas wieStcke aus einem Tupel

    >>> t[1:3]

    ('Katze', 'Maus')

    Der erste Index ist dabei der des ersten zu bernehmenden Elements, und derzweite Index ist der des ersten nicht mehr zu bernehmenden Elements. Ist derzweite Index grer als die Anzahl der Elemente im Tupel, dann macht das nichts:

    >>> t[1:999]

    ('Katze', 'Maus', 'Baum')

    Wenn Sie den linken Index weglassen, dann wird mit dem ersten Element desTupels angefangen. Wenn Sie den rechten Index weglassen (oder der rechte Indexgrer ist als die Anzahl der Elemente, wie gesehen), dann wird mit dem letztenElement des Tupels aufgehrt:

    >>> t[:3]

    ('Hund', 'Katze', 'Maus')

    >>> t[2:]

    ('Maus', 'Baum')

    >>> t[:]

    ('Hund', 'Katze', 'Maus', 'Baum')

  • 4.1 Strukturierte Daten: Tupel 49

    (Wie Sie sehen knnen, ist [:] eine geschickte Methode, um ein Tupel komplettzu kopieren.) Ein Konstrukt der Form linker Index:rechter Index nennen wirauch slice (Scheibe). Slices

    B Das auf den ersten Blick etwas merkwrdig anmutende Verhalten mit demzweiten Index, der der des ersten nicht mehr zu bernehmenden Elementsist statt der des letzten noch zu bernehmenden (was einem mglicherweisenaheliegender vorkme), hat den Vorteil, dass ein Ausdruck wie

    t[:i] + t[i:]

    das komplette Tupel liefert.

    Die Indizes mssen vernnftig sein in dem Sinne, dass der zweite Index sichauf ein Element weiter rechts im Tupel beziehen muss als der erste. Ist das nichtder Fall, dann bekommen Sie ein leeres Tupel als Ergebnis:

    >>> t[2:1]

    ()

    >>> t[2:2]

    ()

    >>> t[2:-1] 1 ist hier dasselbe wie 3('Maus',)

    Mit Slices knnen Sie nicht nur zusammenhngende Teilfolgen von Elementenaus einem Tupel herausholen, sondern auch Elemente berspringen, indem Sie alsdritten Bestandteil (hinter einem weiteren Doppelpunkt) noch eine Schrittweite Schrittweiteangeben. Wenn Sie zum Beispiel das zweite, vierte, Element haben mchten,dann geht das mit

    >>> t[1::2]

    ('Katze', 'Baum')

    Natrlich knnen Sie auch hier eine Obergrenze angeben:

    >>> t1 = t + ("Stein", "Fisch", "Auto")

    >>> t1[0::2]

    ('Hund', 'Maus', 'Stein', 'Auto')

    >>> t1[0:4:2]

    ('Hund', 'Maus')

    Negative Schrittweiten durchlaufen das Tupel von rechts nach links. Damit dasklappt, muss der zweite Index sich auf ein Element weiter links im Tupel bezie-hen als der erste:

    >>> t[::-1]

    ('Baum', 'Maus', 'Katze', 'Hund')

    >>> t1[-2:0:-1]

    ('Fisch', 'Baum', 'Katze')

    Einzelne Elemente eines Tupels knnen Sie zwar lesen (denken Sie an die ecki- Tupel: Unvern