Kapitel 2: Python: Ausdrücke und Typen Grundlagen der Programmierung 1 Holger Karl Wintersemester 2016/2017 Inhaltsverzeichnis Inhaltsverzeichnis 1 Abbildungsverzeichnis 2 Liste von Definitionen u.ä. 2.1 Überblick . . . . . . . . . . . . . 2.2 Python interaktiv . . . . . . . . 2.3 Zahlen . . . . . . . . . . . . . . 2.4 Ausdrücke . . . . . . . . . . . . 2.5 Typen . . . . . . . . . . . . . . . 2.6 Typen in Programmiersprachen 1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2 . 3 . 3 . 4 . 6 . 8 . 14 2.7 Zusammenfassung . . . . . . . . . . . . . . . . . . . . . . . . . 15 Abbildungsverzeichnis 2.1 2.2 Read-Evaluate-Print-Schleife . . . . . . . . . . . . . . . . . . . Syntax-Fehler . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4 5 Liste von Definitionen u.ä. 2.1 2.2 2.3 2.4 2.1 2.2 2.3 2.4 2.5 2.1 2.5 2.6 2.7 Definition (Interpreter) . . . . . . . . . . . . . . . . Definition (Arithmetischer Ausdruck) . . . . . . . . Definition (Semantik von + bei Zeichenketten) . . . Definition (Datentyp) . . . . . . . . . . . . . . . . . Beispiel (Datentyp: Ganze Zahlen) . . . . . . . . . . Beispiel (Datentyp: Reelle Zahlen) . . . . . . . . . . Beispiel (Datentyp: str) . . . . . . . . . . . . . . . . Beispiel (Datentyp: bool) . . . . . . . . . . . . . . . Beispiel (Datentyp: Ganze Zahlen (ergänzt)) . . . . . Achtung (Semantik von Operatoren ist typabhängig) Definition (Typisierte Programmiersprache) . . . . . Definition (Schwach typisierte Programmiersprache) Definition (Stark typisierte Programmiersprache) . . 2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3 7 8 9 9 9 10 10 11 13 14 14 15 2.1. Überblick 2.1 2.1.1 Überblick Dieses Kapitel • • • • 2.2 2.2.1 Erste Schritte mit Python Interaktive Nutzung Grundkonzepte: Zahlen, Ausdrücke, . . . Fehler Python interaktiv Interaktiv? • Interaktive Software: Eingabe während der Ausführung entgegennehmen und verarbeiten • Interaktive Programmierung? – Die Sprache wird ausgeführt? – Genauer: Ein Interpreter Definition 2.1 (Interpreter). Ein Interpreter ist ein Programm, das Programme (oder Programmfragmente) entgegennimmt und ausführt. Die Ergebnisse der Ausführung werden unmittelbar ausgegeben. Beispiele für Interpreter Beispiele für Interpreter gibt es viele, wenn man den Begriff des eingegebenen Programms etwas weiter fasst. Tabellenkalkulationen sind typische Beispiele: Man gibt ein Programm ein, das aus Formeln besteht. Die Berechnungsergebnisse werden sofort angezeigt. Fasst man den Begriff noch offener, dann ist auch eine Textverarbeitung (wie etwa OpenOffice oder Word) ein Interpreter. 2.2.2 Python als Interpreter • Graue Box erwartet Eingaben: In • Result wird darunter erscheinen: Out • Mit # werden Kommentare markiert 3 4 Liste von Definitionen u.ä. 1 2.2.3 # Ihre Anweisungen? Read-Evaluate-Print (REP) Verhalten des Interpreters: • • • • Warte auf Eingabe, lies sie ein (read) Werte die Eingabe aus, berechne ein Ergebnis (evaluate) Gib das Ergebnis aus (print) Beginne wieder von vorne (Schleife, loop) Abbildung 2.1: Read-Evaluate-Print-Schleife Abbildung 2.1 zeigt die Read-Evaluate-Print-Schleife eines Interpreters. Beachten Sie die Analogie zu einem Maschinenmodell: Ein Interpreter ist in gewissem Sinne eine (sehr abstrakte) Form einer Maschine. 2.3 2.3.1 1 Zahlen Eingaben? Zahlen # Zahlen ? Gültige Zahlen (Version 1) • Jede Ziffer ist eine Zahl: 0, 1, . . . , 9 • Jede Folge von Ziffern ist eine Zahl – Aber nicht mit einer Null beginnen • Eine Zahl darf einen Dezimalpunkt . enthalten • Eine Zahl darf mit einem Vorzeichen + oder - beginnen 2.3. Zahlen 2.3.2 5 Ungültige Zahlen Mehrere Dezimalpunkte 1 234.3451.213 Fehlermeldung SyntaxError: Eine Regel der Sprache wurde verletzt Abbildung 2.2: Syntax-Fehler 2.3.3 Ungültige Zahlen Führende Null 1 2.3.4 0464 Ungültige Zahlen Mehrere Vorzeichen 1 1+2+3 Ungültig? Nein. . . aber unerwartet? • Text wie 1+2+3 wird nicht als Zahl interpretiert • Sondern als arithmetischer Ausdruck • Wert wird ausgerechnet 2.4 Ausdrücke 6 Liste von Definitionen u.ä. 2.4.1 Arithmetischer Ausdruck – Syntax • Jede Zahl ist ein arithmetischer Ausdruck • Verbindet man zwei arithmetische Ausdrücke durch +, -, * oder ’/’, so entsteht ein arithmetischer Ausdruck • Setzt man um einen arithmetischen Ausdruck ein Klammerpaar ( . . . ), so entsteht ein arithmetischer Ausdruck Beispiel 1 2.4.2 (5*3)+5 Arithmetischer Ausdruck – Syntax Was ist dann ((627)(223++-+)) ? • Definition vorherige Folie: Keine Aussage Was fehlt? Und nur das sind arithmetische Ausdrücke • Typische rekursive Definition – Details: VL Modellierung 2.4.3 Arithmetischer Ausdruck – Semantik? Bis jetzt: Nur Syntax, aber keine Bedeutung der Ausdrücke • Was ist der Wert eines Ausdrucks? • Beispiel: – Ist 5 + 2 · 3 = 21? – Oder 5 + 2 · 3 = 11? 1 2.4.4 5+2*3 Arithmetischer Ausdruck – Semantik • Klar für Zahlen: Der Wert einer Zahl ist die Zahl • Klar für binäre Ausdrücke – Sind a1 und a2 arithmetische Ausdrücke und besteht der arithmetische Ausdruck a aus a1 + a2 , so ist der Wert von a die Summe der Werte von a1 und a2 . 2.4. Ausdrücke – Und analog für -, *, / 2.4.5 Eindeutigkeit? • Ist 5 + 2 · 3 ein binärer Ausdruck? – Ja, mit zwei möglichen Interpretationen * Einerseits: a1 = 5 * Andererseits: a1 = 5 + 2 • Problem: tertiäre Ausdrücke a1 ◦ a2 ◦ a3 – Vorrangregeln: Punkt vor Strich * Also: 5 + (2 · 3) – Links-nach-rechts: Bei gleichem Vorrang, von links lesen • Formal durch Vorrangregeln festgelegt – Details: Kompliziert; später 2.4.6 Arithmetischer Ausdruck – Definition Definition 2.2 (Arithmetischer Ausdruck). Arithmetische Ausdrücke verknüpfen Zahlen und arithmetische Ausdrücke zu neuen arithmetischen Ausdrücken. Dazu legt eine Programmiersprache syntaktisch Verknüpfungen fest und beschreibt semantisch den Wert eines solchen verknüpften Ausdrucks. Verknüpfungen werden häufig durch spezielle Zeichen wie +, * u.ä. angegeben. Diese Zeichen heißen Operatoren. 2.4.7 Nur Zahlen? Text? • Zahlen sind toll, aber was ist mit Text? Text direkt? 1 Hallo Text mit Anführungszeichen 1 "Hallo" 1 ’Hallo’ 2.4.8 Syntaxregel: Text als Zeichenkette • Text wird durch eine Kette von einzelnen Zeichen, kurz Zeichenkette, dargestellt 7 8 Liste von Definitionen u.ä. • Zeichenkette muss in Anführungszeichen eingeschlossen sein 2.4.9 Ausdrücke mit Zeichenketten? Zahlen kann man addieren - was ist mit Zeichenketten? Erwartung? 1 "Hallo" + " GP1" Definition 2.3 (Semantik von + bei Zeichenketten). Sind t1 und t1 Zeichenketten, so ist t1 +t2 eine Zeichenkette. Der Wert von t1 +t2 ist die Zeichenkette die entsteht, indem an t1 unmittelbar t2 angehängt wird. 2.4.10 Andere Verknüpfungen für Zeichenketten Subtraktion? 1 "Hallo" - " GP1" Multiplikation? 1 "Hallo" * " GP1" Division? 1 "Hallo" / " GP1" Nein, nur Addition! • Keine sinnvolle Semantik, also Fehler 2.5 2.5.1 Typen Fehlermeldungen: TypeError Bei den sinnlosen Kombinationen gab es die Fehlermeldung: • TypeError: unsupported operand type(s) • TypeError: can’t multiply sequence by non-int 2.5. Typen Type? • Was könnte ein Typ bedeuten? • Die Fehlermeldung bei Multiplikation klingt interessant 2.5.2 Datentypen • Offenbar sind Zahlen und Zeichenketten ja etwas unterschiedliches – Unterschiedliche Werte, unterschiedliche Verknüpfungen erlaubt, unterschiedliche Interpretation (+ bei Zahlen vs. bei Zeichenketten) • Beobachtung formalisiert in der Vorstellung eines Datentyps Definition 2.4 (Datentyp). Ein Datentyp oder kurz Typ legt eine Menge möglicher Werte fest. Literale sind die konkreten Notationen möglicher Werte. Zusätzlich legt ein Datentyp erlaubte Verknüpfungen fest. Er erklärt sowohl die Syntax als auch die Semantik dieser Verknüpfungen. 2.5.3 Datentyp: Ganze Zahlen Beispiel 2.1 (Datentyp: Ganze Zahlen). Ganze Zahlen haben den Wertebereich { -∞, . . . , -3, -2, -1, 0, 1, 2, 3, . . . + ∞ }. Die Verknüpfungen +, -, * sind nach üblichen Rechenregeln erklärt. Die Verknüpfung / ist als ganzzahlige Division erklärt. 2.5.4 Literale für ganze Zahlen • Üblicherweise bestehen Literale für ganze Zahlen aus arabischen Ziffern: 0, 1, 2, . . . , 4711, . . . • Denkbar wäre auch, römische Zahlen zu benutzen: I, II, III, IV, . . . 2.5.5 Datentyp: Reelle Zahlen Beispiel 2.2 (Datentyp: Reelle Zahlen). Reelle Zahlen sind die rationalen, algebraischen und transzendenten Zahlen. Die arithmetischen Verknüpfungen sind wie üblich erklärt. 2.5.6 Datentypen: Zahlen in Rechnern Problem: Die gerade definierten Datentypen können in einem realen Rechner nicht dargestellt werden • Jeder Rechner ist endlich 9 10 Liste von Definitionen u.ä. • Kann keine unendlich großen Zahlen speichern Endliche Ausschnitte Datentypen in vielen (nicht allen) Programmiersprachen sind immer nur endliche Ausschnitte aus entsprechenden, konzeptionellen Datentypen. • Oft ist die Unterscheidung egal • Aber manchmal wichtig: Endliche Präzision, endliche Werte • Verletzung von Rechenregeln – Beispiel: Assoziativitätsgesetz gilt nicht mehr! 2.5.7 Zahldarstellung • Darstellung von numerischen Datentypen in Rechnern nicht trivial – Vorzeichen? – Genauigkeit? – Platzbedarf? – ...? • Details: Vorlesung Grundlagen technische Informatik 2.5.8 Datentyp: str Beispiel 2.3 (Datentyp: str). Strings (kurz: str) sind Aneinandereihungen einzelner Zeichen; sie formalisieren Zeichenketten. Die leere Reihe ist ebenfalls ein String. Zeichen sind durch eine Aufzählung definiert (a, b, c, . . . ). Zwei Strings können durch Addition miteinander verknüpft werden. 2.5.9 Datentyp: bool Beispiel 2.4 (Datentyp: bool). Der Datentyp bool kennt nur die beiden Werte wahr und falsch, notiert als Literale True bzw. False. Zwei Werte dieses Types können mit and, or, != verknüpft werden; dies liefert einen Wert vom Typ bool. Auf einen Wert bool kann not angewendet werden. Die Semantik dieser Verknüpfungen ist in den folgenden Tabellen definiert. 2.5. Typen 2.5.10 11 Datentyp: bool – Semantik der Verknüpfungen Verknüpfung: and b1 False False True True b2 False True False True b1 and b2 False False False True Siehe auch Vorlesung Modellierung. 2.5.11 Vergleiche zwischen Werte • Viele Datentypen erlauben Vergleiche zwischen Werten • Meist: Gleichheit ==, Ungleichheit != • Oft: Kleiner/größer Vergleich – Strikt: < , > – Mit Gleichheit: <=, >= • Definition der Datentypen von oben: ergänzen! 2.5.12 Datentyp mit Vergleich Beispiel 2.5 (Datentyp: Ganze Zahlen (ergänzt)). Ganze Zahlen haben den Wertebereich { -∞, . . . , -3, -2, -1, 0, 1, 2, 3, . . . + ∞ }. Die Verknüpfungen +, -, * sind nach üblichen Rechenregeln erklärt. Die Verknüpfung / ist als ganzzahlige Division erklärt. Zwei Zahlen können mit <, <=, >, >=, ==, != miteinander verglichen werden. Das Resultat eines Vergleichs ist ein Wert des Datentyps bool. 2.5.13 1 2 3 4 Beispiel: Vergleich arithmetischer Ausdrücke pingo_title = "Was ist ((5+3*2) < 17-5) and ((1*1) > -1)" pingo_type = "single" pingo_questions = ["Wahr (True)", "Falsch (False)"] pingo_duration = "30" 5 6 2.5.14 %pingo Vereinfachen? • Darf man das vereinfachen zu: 12 Liste von Definitionen u.ä. 1 5+3*2 < 17-5 and 1*1 > -1 Was fehlt? • Welche Festlegung fehlt für so eine Vereinfachung? 2.5.15 Zusammenfassung: Einfache Datentypen • Numerisch: int, float, complex – Mit üblichen arithmetischen Operationen – Unterschiedliche Repräsentation im Speicher – Und bit-für-bit Operationen für int – Siehe Details • Zeichenkette: str – Folge von Unicode-Zeichen – Siehe Details • Folgen von Bytes, . . . 2.5.16 Verknüpfungen unterschiedlicher Typen? • Bisher: nur typreine Verknüpfungen betrachtet – str und str, int und int • Was passiert, wenn wir mischen? Beispiel: Zeichenkette und Zahl 1 2.5.17 "Hallo GP1" + 5 Sinnvolle Verknüpfungen? Was wären denn Verknüpfungen mit sinnvoller Semantik? • Zeichenkette und Zahl? – Multiplikation: Zeichenkette mehrfach hintereinander • Zeichenkette oder Zahl und bool? – ??? • Zahl und Zahl, genauer: unterschiedliche Zahlen? – Ja. . . 2.5.18 Zeichenkette und Zahl str und int 1 "Hallo GP1!" * 5 2.5. Typen str und float 1 "Hallo GP1!" * 3.1415 Semantik? Sinnlose Semantik, also Fehler 2.5.19 Operatoren: Verschiedene Semantik! Achtung 2.1 (Semantik von Operatoren ist typabhängig). Der gleiche Operator kann in Kombination mit unterschiedlichen Typen auftreten. Dadurch erhält der Operator jeweils eine andere Semantik. Man spricht dann von Operator Overloading. Beispiel: Multiplikation 1 3 * 5 1 "Hallo" * 5 2.5.20 Arithmetik? int und float ? • Implizite Umwandlung, weitgehend problemlos – In Python3; andere Programmiersprachen hier ggf. kompliziert • Explizite Umwandlung: Runden u.ä. – später 1 10 * 0.3 1 10 / 3 1 10 // 3 13 14 Liste von Definitionen u.ä. 2.6 2.6.1 Typen in Programmiersprachen Typen in Python 3 Alles hat einen Typ in Python 3 • Literale haben stets einen eindeutigen Typ • Verknüpfungen zwischen zwei Werten produzieren Wert mit Typ – Eindeutig durch Typ der Werte und Verknüpfung bestimmt • Folge: Man kann nichts ohne Typ hinschreiben. . . • Typ eines Werts wird im Interpreter explizit repräsentiert – Man muss den Typ aber nicht explizit hinschreiben 2.6.2 Typisierte Programmiersprache Definition 2.5 (Typisierte Programmiersprache). Eine Programmiersprache heißt typisiert wenn für jeden Wert und Ausdruck nicht nur der Wert selbst sondern auch der Datentyp bekannt ist. Beispiel • Python (2 & 3) • Java • ... 2.6.3 Konvertierung zwischen Typen • Typen sind unterschiedlich, aber was, wenn das gleiche Datum repräsentiert wird? • Beispiel: – int: 9 – string: ’9’ • Wie kommt man von string ’9’ zu int 9? Umgekehrt? – Möglich – Details: später 2.6.4 Bemerkung: Starke vs. schwache Typisierung Definition 2.6 (Schwach typisierte Programmiersprache). Eine Programmiersprache ist schwach typisiert wenn Werte unterschiedlicher, nicht verwandter Typen miteinander verknüpft werden können, ohne dass sie explizit konvertiert werden müssen. 2.7. Zusammenfassung Beispiel • Eine schwach typisierte Sprache würde 9 + ’9’ erlauben. • Aber bedeutet das dann ’99’ oder 18? • Sprache: Perl, C (alte Versionen) 2.6.5 Bemerkung: Starke vs. schwache Typisierung (2) Definition 2.7 (Stark typisierte Programmiersprache). Eine Programmiersprache ist stark typisiert wenn Werte unterschiedlicher, nicht verwandter Typen nur dann miteinander verknüpft werden können, wenn sie explizit konvertiert werden. Beispiel • Bei starker Typisierung ist 9 + ’9’ nicht möglich • Beispiel: Python, Java 2.6.6 Ausdrücke und Zustand? • Und was ist mit Zustand? – Vorheriges Kapitel: Lange Diskussion, Ausführungsmodell, . . . • Ausdrücke verändern den Zustand nicht • Und nun? 2.7 Zusammenfassung 2.7.1 Zusammenfassung • Datentypen legen Werte und Verknüpfungen fest – Werte werden durch Literale angegeben • Durch Verknüpfungen werden Ausdrücke gebildet – Ausdrücken erzeugen neue Werte aus vorhandenen Werten • Python ist ein Beispiel für – eine Sprache/Umgebung mit einer read-evaluate-print-Schleife – eine stark typisierte Programmiersprache 15