Kapitel 2: Python: Ausdrücke und Typen

Werbung
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
Herunterladen