Sie sind auf Seite 1von 97

Konzepte des

scriptsprachenorientierten
Programmierens
Prof. Dr. Manuel Mayer

Teil 1
© FOM Hochschule für Oekonomie & Management
gemeinnützige Gesellschaft mbH (FOM), Leimkugelstraße 6, 45141 Essen

Dieses Werk ist urheberrechtlich geschützt und nur für den persönlichen Gebrauch im Rahmen der Veranstaltungen der FOM
bestimmt.
Die durch die Urheberschaft begründeten Rechte (u.a. Vervielfältigung, Verbreitung, Übersetzung, Nachdruck) bleiben dem
Urheber vorbehalten.
Das Werk oder Teile daraus dürfen nicht ohne schriftliche Genehmigung der FOM reproduziert oder unter Verwendung
elektronischer Systeme verarbeitet, vervielfältigt oder verbreitet werden.
Dank geht an Dr.-Ing. M. B. Endejan für die Inspiration und teilweise inhaltliche Übernahme des Skripts.
https://xkcd.com/1319/

0b1. Einleitung
Prüfung und Benotung

Die Modulnote setzt sich folgendermaßen zusammen:

100 % Klausur (90 Minuten)

4
Modulziele (in knapper Form)

v Die Eigenschaften der Programmierung von Skriptsprachen erklären und anwenden.

v Erkennen, dass die Sprachen typischerweise interpreterbasiert sind und eine oft
ausrichtungstypische bemerkenswerte Sprachmächtigkeit aufweisen.

v Vorteile skriptorientierter Sprachkonzepte herausstellen – z.B. flexible Sprachkonzepte.

v Hohe Entwicklungsperformanz und Plattformunabhängigkeit und die in der Regel


untergeordnete Bedeutung der Ausführungsperformanz nachvollziehen.

v Anhand von Beispielen zeigen, wie die skriptorientierte Programmierung sinnvoll


eingesetzt werden kann.

5
Curriculum

v Compiler/Interpreter

v Typen, Datenstrukturen, Operatoren und Kontrollstrukturen

v Funktionen

v Ein-/Ausgabe

v Reguläre Audrücke

v Pakete und Module

v Anbindung an das Betriebssystem und andere Applikationen

v Optional: Typische Anwendungsfelder dynamischer Sprachen

6
Aufgabe der Vorlesungen
Die Vorlesungen und themenbezogenen Diskussionen dienen der
Erläuterung von Konzepten, Techniken, Methoden und Hintergründen. Sie
sollen zu den Übungen hinführen und zum Erkenntnisgewinn beitragen.

Übungen
Im Wechsel zwischen Vorlesung und Übung sollen die theoretisch
behandelten Inhalte praktisch umgesetzt und vertieft werden. In den
Übungen soll umfangreich Gelegenheit bestehen, Probleme aufzudecken
und sie zu lösen. Es wird mit Nachdruck eine veranstaltungsbegleitende
Eigenarbeit empfohlen.
7
Basisliteratur

Die offizielle Python-Dokumentation: https://docs.python.org/3/

Die Slides alleine sind keine gute Vorbereitung. Das Programmieren und
das Verinnerlichen von Konzepten ist nur mit Üben sinnvoll möglich.

Es gibt Unmengen an einführenden und weiterführenden Tutorials zu


bestimmten Themen frei verfügbar im Netz. Nutzen!

8
Hilfreiche Ressourcen

v Offizielle Python-Webseite:
https://www.python.org

v Hier wird Ihnen geholfen:


https://stackoverflow.com

v PEP 8 – Style-Guide für Python-Code:


https://www.python.org/dev/peps/pep-0008/
v Python package index:
https://pypi.org

9
Weiterführende Literatur

v Van Roy, Peter & Haridi, Seif (2004): Concepts, Techniques, and
Models of Computer Programming, 1. Auflage, The MIT Press.

v Kaiser, Peter & Ernesti, Johannes (2018): Python 3: Das umfassende


Handbuch: Sprachgrundlagen, Objektorientierung, Modularisierung,
5. aktualisierte Auflage, Rheinwerk Computing.

v Ramalho, Luciano (2015): Fluent Python: Clear, Concise, and Effective


Programming, O ́Reilly.

v Slatkin, Brett (2015): Effektiv Python programmieren: 59 Wege für


bessere Python-Programme, mitp Professional.
10
Sie sind gefragt J

v Name, Tätigkeit

v Welche Programmiersprachen setzen Sie privat und beruflich ein?

v Für welche Zwecke setzen Sie die Sprachen ein?

v Wie charakterisieren Sie die Programmiersprachen?

v Ihre Erwartungen, Befürchtungen, Wünsche, Anmerkungen...

11
https://www.tiobe.com 12
https://www.tiobe.com

13
Khoirom, Mrs. Selina, Moirangthem Sonia, Borishphia Laikhuram, Jaeson
Laishram and Tekcham Davidson Singh. “Comparative Analysis of Python and
Java for Beginners.” (2020).
→ https://bit.ly/3JyYkc9

14
DISKUSSION

v Was sind Ihre ”Key-Takeaways” von diesem Paper?

v Waren und falls ja, welche Begriffe waren Ihnen nicht geläufig?

v Stimmen Sie den Schlussfolgerungen der Autoren zu?

v ...

15
https://xkcd.com/1270/

0b10. Programmierparadigmen
Multiparadigmen-Programmiersprachen:
Eine Programmiersprache kann die begriffsbestimmenden Merkmale
mehrerer Paradimen unterstützen. 17
Imperative Programmierung

v Das wohl bekannteste Programmierparadigma


v Programme bestehen aus Anweisungen (lat. imperare = befehlen).
v Die Anweisungen geben die Reihenfolge vor.
v Die Befehlsausführung wird mit Kontrollstrukturen (Sequenzen,
Schleifen, Verzweigungen) gesteuert.
v Jedes Programm besitzt einen Startzustand, der während des
Programmablaufs modifiziert wird.
v Seiteneffekte modifizieren den Zustand, wie z.B. die Veränderung von
Speichereinheiten, I/O, ...

18
Prozedurale Programmierung

v Spezielle Form der imperativen Programmierung


v Prozeduren zerlegen das Programm in Unterprogramme, die über eine
definierte Schnittstelle aufrufbar sind.
v Prozeduren werden auch Routinen oder Funktionen genannt.

Beispiele: Basic, Fortran, Cobol, C, Pascal, ...

19
Objektorientierte Programmierung

v Spezielle Form der imperativen Programmierung


v Programme sind Mengen interagierender Objekte.
v Objekte sind Instanzen von Klassen.
v Eine Klasse ist ein “Bauplan” für eine Reihe ähnlicher Objekte.
v Eine Klasse beinhaltet Attribute und Methoden.
v Der Datentyp eines Objekts entspricht seiner Klasse.
v Objektorientierung ist oft ein “Aufsatz” prozeduraler Prog.sprachen.

Beispiele: C++, Java, Smalltalk, Eiffel, ...

20
Deklarative Programmierung

v Zustandsfreie Programmiersprachen (immutable states)


v Programme enthalten Beschreibungen (lat. declarare = erklären) des
zu lösenden Problems.
v Der Lösungsweg wird automatisch (also algorithmisch) ermittelt.
v Deklarative Programme sind oft kürzer (im Sinne der LOC = lines of
code). Ob sie leichter zu verstehen sind, ist Ansichtssache.

Beispiele: XSLT (Transformationssprache), SQL (Abfragesprache), ...

21
Funktionale Programmierung

v Erweiterung der deklarativen Programmierung


v Programme bestehen ausschließlich aus Funktionen.
v Funktionen sind partielle Abbildungen von Eingabe- auf Ausgabedaten.
v Die Funktionen sind idempotent (= frei von Seiteneffekten). D.h. bei
jedem identischen Aufruf wird das gleiche Ergebnis zurückgeliefert.
v Es werden ausschließlich Berechnungen mit Eingabedaten
durchgeführt und Ergebnisse geliefert (→ Modularität).

Beispiele: Haskell, Scala, make, ...

22
Logische Programmierung

v Erweiterung der deklarativen Programmierung


v Baut auf der Prädikatenlogik auf (= eine Erweiterung der Aussagenlogik).
Die Prädikatenlogik untersucht auch die innere Struktur.
v Besteht aus einer Menge von Axiomen (Fakten, Annahmen, Regeln).
v Wird vom Anwender eines Logikprogramms eine Anfrage gestellt,
versucht der Interpreter die Lösungsaussage aus den Axiomen zu
berechnen (erfüllbar / nicht erfüllbar).

Beispiel: Prolog

23
Auswahl einiger Programmiersprachen

* im Sinne “functional-style”, nicht vollwertig.

24
Python und funktionale Programmierung

Funktionale Programmierung über Funktionen wie lambda, map, filter


oder reduce zu rechtfertigen, ist etwas zu vereinfacht.

Warum?
Ein wesentliches Merkmal funktionaler Programmiersprachen ist das
Fehlen von Seiteneffekten und Zustandsänderungen.

Beispiel: Iterationen (z.B. for loop) sind nicht Teil des Konzepts
funktionaler Programmierung. Wer weiß warum?

25
https://xkcd.com/303/

0b11. Compiler und Interpreter


Maschinensprache

Der Rechner versteht nur Maschinensprache. Daher muss der Quellcode


zu maschinenlesbaren Instruktionen transformiert werden. Es existieren
zwei grundsätzliche Ansätze:

Compiler und Interpreter

Hybride Lösungen:
- Bytecode-Interpreter
- Just-in-Time-Compiler (JIT-Compiler)

27
Compiler

v Übersetzt das Programm in eine Ausgabesprache.


v Überprüft den Quellcode auf korrekte Syntax.
v Bei Fehlerfreiheit wird ein Zwischencode erzeugt
(Objektcode).
v Zusammenführung des Objektcodes mit den
benötigten Bibliotheksinhalten zum ausführbaren
Maschinencode durch den Binder.

Beispiele: C, C++, Fortran, ...


28
Interpreter

v Der Quellcode des Programms bleibt bis zur


Ausführung unbearbeitet.
v Der Interpreter übersetzt nicht zur Laufzeit in
Maschinencode.
v Er ist ein Programm, das für einen Befehl einen
passenden Codeabschnitt aufruft.
v Analyse des Quellcodes nur zur Laufzeit.

Beispiele: BASIC, bash, PHP (< v8), ...


29
Und Java?

Nun, da ist es etwas komplizierter:


javac kompiliert den Java-Code zu Bytecode.
JVM hat verschiedene Implementierungen, beispielhaft:
HotSpot, Dalvik: interpreter + JIT-Compiler
JamVM: interpreter

Der Interpreter führt jede Bytecode-Instruktion einzeln aus.


Der JIT-Compiler übersetzt Bytecode-Blöcke zu Maschinencode,
falls es sich rentiert. Daher auch “HotSpot”.

30
31
Hybrid: Bytecode-Interpreter

v Der Compiler übersetzt das Programm zuerst in einen Zwischencode


(Bytecode = maschinennaher Code).
v Der Interpreter liest den Bytecode zur Laufzeit ein und führt den
Code aus.
v Die Bytecode-Instruktionen werden einzeln verarbeitet.

Beispiele: Python (cpython), Lua, Perl, Java, ...

32
Hybrid: Just-in-Time-Compiler

v Das Programm wird zur Laufzeit teilweise in Maschinencode


übersetzt.
v Einsatz meist innerhalb von virtuellen Maschinen
v Es werden in der Regel verfügbare Informationen genutzt, die
entscheiden, ob ein Programmteil kompiliert und für weitere Aufrufe
zwischengespeichert werden soll.

Beispiele: Python (PyPy), PHP (>= v8), C#, Java, ...

33
0b11. Typisierung

https://xkcd.com/1537/
35
Typisierung (etwas ausführlicher)

Der Datentyp einer Variablen bestimmt

v den Wertebereich,
v durchführbare Operationen und
v den Speicherbedarf.

Aber wie wird mit den Datentypen in einer Programmiersprache


umgegangen?

36
Die Typisierung bestimmt die Art und Weise, wie Variablen* an Datentypen
gebunden werden.

Dabei unterscheidet man


v zwischen statischer und dynamischer Typisierung,
v zwischen starker und schwacher Typisierung,
v zwischen impliziter und expliziter Typisierung und
v zwischen optionaler und erzwungener Typisierung.

* auch Objekte und Funktionen

37
Nicht typisiert vs. typisiert

LDR r0,[r4]
ADR r4,r2
LDR r1,[r4] a = [1, 'hi', 3.14]
SUBGE r0,r0,r1 a.each { |item| puts item }
ADRGE r4,r3
STRGE r0,[r4]

38
Statisch vs. dynamsich typisiert

double const limit = config["xlimit"]; i = iter(m);


map<int,string>::iterator i = m.begin(); limit = config["xlimit"]
Sensor& s = locator:::create("alpha"); s = locator.create("alpha")

39
Stark vs. schwach typisiert

def add(a, b): function add(a, b) {


return a + b return a + b;
}
add(5, 3) add(5, 3)

8 8

add("5", 3) add("5", 3)
Traceback (most recent call last):
File “<stdin>”, line 1, in <module> ‘53’
File “<stdin>”, line 2, in add
TypeError: Can’t convert ‘int’ object to
str implicitly

40
Explizit vs. implizit typisiert

SimpleBeanFactoryAwareAspectFactory s = var s =
new SimpleBeanFactoryAwareAspectFactory(); new DynamicUrlManagerDataRepositoryFactory();

41
Optionale vs. erzwungene Typisierung

function add(a, b) {
return a + b;
} int add(int a, int b) {
return a + b;
function sub(a: number, b: number): number {
return a - b; }
}

42
o u t . . . t h e
w l e d g e ab
l y a n y k no
e r e i s h a rd m s o n t h e
” . . . th t i c t y p e s y s te
a l i t y f o r a
p a c t o f s ta s u l t i n g q u
im t t i m e o r re
v e l o p m e n
de a r e”
s o f t w
p ie c e o f

Hanenberg, Stefan. (2010). An Experiment About Static and Dynamic Type Systems Doubts About the Positive
Impact of Static Type Systems on Development Time. Proceedings of the Conference on Object-Oriented 43
Programming Systems, Languages, and Applications, OOPSLA. 45. 22-35. 10.1145/1869459.1869462.
44
Debug-Zeit der

<
Exceptions, die von Zeit, die benötigt wird,
einem statischen um mit dem Type-
Type-Checker Checker umzugehen
erkannt worden
wären

Eine Untersuchung* ergab, dass nur (?) ca. 2%


der Github-Issues von Python-Projekten TypeErrors,
AttributeErrors oder NameErrors sind.

* von R. Smallshire, 1,7 Mio. Repositories, 15 Mio. Dateien, 3,6 Mio. Issues

Hanenberg, Stefan. (2010). An Experiment About Static and Dynamic Type Systems Doubts About the Positive
Impact of Static Type Systems on Development Time. Proceedings of the Conference on Object-Oriented
Programming Systems, Languages, and Applications, OOPSLA. 45. 22-35. 10.1145/1869459.1869462.

45
rl, P y tho n,
ra m in Pe
g th e pro g c h ti m e as
n d w riti n a lf a sm u
n g a an h
“Designi ta k es n o m o r e th
h e re sulting
Tc l and t
Rexx, or C , C + +, o r J a v a
i n
writing it n lyh a lf as lo ng.”
m is o
progra

Lutz Prechelt, An empirical comparison of C, C++, Java, Perl, Python, Rexx, and Tcl, IEEE Computer, Vol. 30, (10), p. 23-29, Oct 2000.
46
Eine Handvoll veröffentlichter Studien ist eine
miserable Grundlage für Entscheidungen zur
Technologieauswahl in einer Billionen-Euro-Industrie.

47
48
Statische Typisierung kann die Modularität erschweren...

BookingApplikation BookingService
uses

IBooking booking = bookingService.makeBooking()

“An interface describes wheter two


components will fit together”
Freeman/Price 2010: Growing Object Oriented Software Guided By Tests

49
Und wenn wir darauf verzichten...

BookingApplikation BookingService
uses

booking = booking_service.make_booking()

“A protocol describes wheter two


Dokumentation statt components will work together”
Freeman/Price 2010: Growing Object Oriented Software Guided By Tests
komplexer Typisierung?
50
Große, verteilte Systeme vermeiden sie oft gezwungenermaßen...

HTTP + JSON + Protokoll


BookingApplikation BookingService
uses

“A protocol describes wheter two


components will work together”
Freeman/Price 2010: Growing Object Oriented Software Guided By Tests

51
Oft ist nicht die Typisierung das Problem

function convertJsonToCsv(filename, target, callback) {


readFile(filename, function (err, content) {
if (err) {
return callback(err);
}
parseJson(content, function (err, data) {
if (err) {
return callback(err);
}
convertToCsv(data, function (err, csv) {
if (err) {
return callback(err);
}
writeFile(target, csv, callback);
});
});
});
}
52
Skriptsprachen in a Nutshell

v Primär interpreterbasiert, ansonsten zu einem Zwischencode kompiliert, der in einer VM


interpretiert oder zu Maschinencode “ge-jitted” wird

v Explizite Deklaration von Variablen meist unnötig à dynamisch

v Besitzen Formen komplexer Datenstrukturen (RegEx-Strukturen, Dictionaries, Closures,


Lookup Tables, List Comprehensions, Iteratoren, ...)

v Automatische Speicherverwaltung und plattformunabhängigkeit bzw. -abstraktion


(tatsächlich wird oft sogar die feste Größe von Integern vernachlässigt)

v Sind meist erweiterbar (Module, Bibliotheken)

v Besitzen oft eine interaktive Shell


53
Laufzeitenvergleich CPython 3.7.2 vs. PyPy 3.6 v7.0.0

n # Lösungen Dauer zur Berechnung in Sekunden


CPython PyPy
8 92 0.018 0.040
10 724 0.466 0.095
12 14.200 15.29 0.928
14 365.596 647.2 29.94

Quelle: Dr.-Ing. M. B. Endejan

(ausgeführt auf einem MacBook Pro 2,6 GHz, Intel ore i5, 16 GB RAM) n=8, 1 von 92 möglichen Lösungen

54
https://xkcd.com/1987/

0b100. Installation
Installation von Python

v Aktuellen Versionen: https://www.python.org/downloads/

v OSX und Linux haben zwar oft Python vorinstalliert, oft ist es eine ältere
Version, teilweise ist Python 2 gelinkt.

v Folgende Komponenten werden installiert:


v Python-Interpreter

v Python (Kommandozeile, interaktiv)

v IDLE (Entwicklungsumgebung)

v Dokumentation
56
OSX: Alternativ mit Homebrew (für Fortgeschrittene)

Homebrew-Installation:
$ xcode-select –-install
$ ruby -e "$(curl -fsSL
https:///raw.githubusercontent.com/Homebrew/install/master/install)"

Python-Installation:
$ brew install python

Pip (Paketmanager):
$ brew install pipenv

57
Entwicklungsumgebungen

Neben IDLE, das mit dem Installer standardmäßig installiert wird, gibt es eine
Reihe weitere Entwicklungsumgebungen (IDEs) für Python. Auswahl:

PyCharm (vollwertige IDE, für Studierende kostenlos)

Eclipse (der Klassiker) mit PyDev-Plugin

VS Code mit VS-Code-Python-Extension (für die Hipster)

Spyder (IDE optimiert für Data Scientists)

JupyterLab (Notebook-Feeling)
58
Interaktive Nutzung mit der Python Shell

Nutzen Sie die Shell als Taschenrechner: +, -, *, /

Was bewirken folgende Operatoren: //, %, **, <<, >>, &, |, ^, ~

59
https://xkcd.com/2497/

0b101. Erste Schritte mit Python


Die 35 Schlüsselwörter (Keywords) in Python
Hello, World!
Mehrzeilige Anweisungen

v Der Kopf wird mit einem abschließenden Doppelpunkt vom Körper getrennt.

v Die Tiefe der Einrückung definiert den Block.

v Die Einrückung kann mit Tabulatoren oder Leerzeichen erfolgen.

v Es schadet nicht, die IDE anzuweisen, Tabulatoren durch Leerzeichen zu ersetzen.


Eingaben (Input)

PV01

v Testen Sie das Programm (gerne auch in der interaktiven Shell)

v Welches Ergebnis erhalten Sie? Warum?

v Welche Modifikationen schlagen Sie vor?


Challenges (1)

C01:
Fragen Sie nach dem Vornamen und
danach nach dem Nachnamen des C02:
Benutzers und geben Sie folgende Schreiben Sie ein Programm, das
Ausgabe aus: nach der Anzahl an Tagen fragt
Hallo {Vorname} {Nachname} und die Stunden, Minuten und
Sekunden ausgibt.

C03:
Lassen Sie den Benutzer eine Zahl über 100 eingeben und danach
eine Zahl kleiner 10. Geben Sie aus, wie oft die kleinere Zahl in die
größere passt (ohne Nachkommastellen).
Variablen

v In der Python-Welt ist alles ein Objekt (object)


Well... fast alles, Keywords sind keine Objekte.

v 2 wichtige Programmierkonzepte: State und Mutation

v Objekte haben einen Zustand (state) und können verändert werden (mutation)

v Variablen halten den Zustand eines Objektes fest.

status = “on”
status = “on”

Id: 335892234058947
status Value: “on”
Type: str

Id: Unveränderliche, eindeutige Objektkennzeichnung

Do it yourself:
Type: Unveränderlicher Objekttyp, bestimmt den Wertebereich und erlaubte Operationen

Objekt Typ
String str

Integer int

Fließkommazahl float

Liste list

Wörterbuch dict

Tupel tuple

Funktion function

Instanz einer Klasse (Subklasse von class) class

Built-In-Funktion builtin_function_or_method
Casting (Konvertierung von Datentypen)

v Wie bereits bei dem Input-Beispiel gesehen, ist es manchmal notwendig, Daten zu
konvertieren.

v Python stellt Built-In-Klassen zur Verfügung, z. B. str, int, float, list, .....
Duck Typing

v Duck Typing ist ein typisches J


Konzept der dynamischen
Typisierung.

v In a nutshell: Mich kümmert


nicht, welchen Typ/welche Klasse
ein Objekt hat, sondern mehr,
welche Methoden definiert sind.

If it looks like a duck, walks like


a duck and quacks like a duck,
then it’s a duck.
Veränderlichkeit

Mutable Immutable

v Listen: list v Numerisch: int, float, complex, bool

v Mengen: set v Zeichenketten: str

v Wörterbücher: dict v Tupel: tuple

v Byte-Felder: bytearray v Mengen: frozenset

v Bytes: bytes

Wörterbücher, Tupel, Byte-Felder...?


🧐 Keine Sorge, wir werden die einzelnen Datenstrukturen noch detailliert behandeln.
Immutable (Beispiel 1: Integer)
639692234058947
a = 1000 a 1000
Type: int

639692234058947
b = a a 1000
b Type: int

877585340589475
a = a + 1 a 1001
Type: int

639692234058947
b 1000
Type: int
Immutable (Beispiel 2: Garbage Collector)
796792234058947
c = ‘ab‘ c “ab”
Type: str

796792234058947
c += ‘c‘ c “ab”
Type: str

407885804967933
“abc”
Type: str
Das nicht mehr referenzierte Objekt
wird “garbage-collected”.
Immutable (Beispiel 3: Indirekte Seiteneffekte)
985830895727395
x = (1, [20, 21], 3) x (1, [20,21], 3)
Type: tuple

x 985830895727395
y = x
(1, [99,21], 3)
x[1][0] = 99 y Type: tuple

Immutables verhindern direkte Seiteneffekte. Indirekte Seiteneffekte können


jedoch weiterhin auftreten, denn im Objekt befindliche Referenzen auf
veränderliche Objekte können verändert werden.
Mutable (Beispiel 1: Liste)
950668743968328
a = [1, 2, 3] a [1,2,3]
Type: list

a 950668743968328
a += [4]
[1,2,3,4]
Type: list
Mutable (Beispiel 2: Seiteneffekt)
458765495689543
x = [1, 2, 3] x [1,2,3]
Type: list

x 458765495689543
y = x
y [1,2,3]
Type: list

x 458765495689543
x += [4]
y [1,2,3,4]
Type: list

Seiteneffekt
Null, ähm, None
v Das Keyword None wird verwendet, um einen Null-
Wert zu definieren oder überhaupt keinen.

v None ist weder 0 noch False noch eine leere

Zeichenkette. None ist ein eigener Datentyp


(NoneType) und nur None ist None.

v Void-Funktionen liefern None.

v None ist ein falsey value, d. h. der Wahrheitswert

ist False.

v Andere Sprachen verwenden auch Audrücke wie


nil, null oder undefined.
?
Die Krux mit der Gleichheit

v Prüfung der Gleichheit/Ungleichheit von Werten verschiedener Objekte:


== bzw. !=

v Die Prüfung auf Gleichheit ist typsicher (strikt),


mit Ausnahme von 1 zu True bzw. 0 zu False.

v Prüfung der Gleichheit/Ungleichheit von Objektidentitäten


(sprich, zeigen 2 Variablen auf dasselbe Objekt?):
is bzw. is not
Seit Python v3.8 wird eine Warnung erzeugt, wenn Literale
(Zeichenketten, Zahlen) mit is/is not verglichen werden.
Siehe Issue im Python-Bugtracker: https://bugs.python.org/issue34850
Grundlegende Kontrollstrukturen

Genau genommen beinflussen Funktionsaufrufe und die Ausnahmebehandlung


ebenfalls den Kontrollfluss eines Programms. Diese behandeln wir später.
Sequenz
v Eine Anweisung nach der anderen

v In der Regel eine Anweisung pro Zeile

v Es ist kein Zeichen (z.B. Semikolon) für den Zeilenabschluss notwendig!

v Falls mehrere Anweisungen pro Zeile, mit Semikolon trennen

v Sollte man vermeiden!

v Mehrzeilige Anweisungen sind möglich:

v Explizit trennen mit \

v Implizite Trennung innerhalb von Klammerungen


Auswahl

v if

v if ... else

v if ... elif ... else

v {A} if {condition} else {B}


Kein Switch-Case-Statement in Python?
v Python < 3.10:
Nein, nutze if .. elif .. else.

v Python >= 3.10:


Siehe “Pattern Matching” https://peps.python.org/pep-0636/

match http_status:
case 400:
return “Bad request“
case 200:
return “Ok“
.....
case _:
return “What‘s wrong with the internet?“
Vergleichsoperatoren (Überblick)

Operator Beschreibung
>, < Größer als, Kleiner als
>=, <= Größer gleich als, Kleiner gleich als
== Wert gleich
!= Wert ungleich
is Gleiches Objekt
is not Verschiedene Objekte

Das Ergebnis ist ein boolscher Wert.


Boolsche Operatoren (Überblick)

Dienen der Verknüpfung von Bedingungen nach der boolschen Algebra.

Operator Beschreibung
x and y x und y müssen wahr sein, damit der Ausdruck wahr
wird.
x or y Falls x oder y wahr ist, ist auch der Ausdruck wahr.
not x Umkehrung des Wertes von x:
Wahr wird Falsch und Falsch wird Wahr.
Truthy and falsey values (Überblick)

Truthy Falsey
True False
Die meisten Objekte None
1 0
4.1 0.0
[1, 2] [] (leere Liste)
{‘a’: 1, ‘b’: 2} {} (leeres Wörterbuch)
‘eine Zeichenkette’ “” (leere Zeichenkette)
‘False als Zeichenkette’
‘0’
Empty bodies
v Python erlaubt keine leeren Blöcke bei zusammengesetzten Anweisungen.

v Wenn nun eine Anweisung syntaktisch benötigt wird, jedoch nichts


(tatsächlich) ausgeführt werden soll, kann das pass-Statement verwendet
werden.
if x <= 5:
do_something()
elif x > 5 and x < 10:
pass
else:
do_something_different()

In Python 3 ist auch ... möglich, das ist etwas weniger “noisy”.
Iteration
v while

v while ... else

v for

v for ... else

v continue

v break
while
while ... else
break und continue

v Mit break wird eine Schleife vorzeitig abgebrochen.

v Nach Abbruch mit break wird der else-Zweig nicht ausgeführt!

v Mit continue wird der aktuelle Schleifendurchlauf vorzeitig abgebrochen.

v Das continue-Statement hat keinen Einfluss auf die Ausführung des


else-Zweigs!
for ... else

break verhindert
die Ausführung des
else-Zweiges
range
v Zählschleifen können sehr einfach mit range realisiert werden.

v Der Generator* range erzeugt ein iterierbares Objekt mit ganzen Zahlen
aus einem definierten Bereich.

* Später behandeln wir genauer, was ein Generator ist.


Operatorenrangfolge (-wertigkeit, -präzedenz, -prio, you name it)
Operator Beschreibung Assoziativität
() Klammerung links - rechts
**
hoch
Potenzierung rechts - links
+x, -x, ~x Positiv, negativ, bitweises Nicht links - rechts
*, @, /, //, % (Matrix-)Multiplikation, Division, Ganzahldivision, Modulo links - rechts
+, - Addition und Subtraktion links - rechts
<<, >> Shifts links - rechts
& Bitweises Und links - rechts
^ Bitweises exklusives Oder links - rechts
| Bitweises Oder links - rechts
in, not in, is, is not, <, <=, Vergleichsoperatoren, Tests auf Identität und Mitgliedschaft links - rechts
>, >=, !=, ==
not x Boolsches/Logisches Nicht links - rechts
and Boolsches/Logisches Und links - rechts
or Boolsches/Logisches Oder links - rechts
if - else Bedingter Ausdruck links - rechts
lambda Lambda-Ausdruck links - rechts niedrig
=, +=, -=, *=, /= Zuweisungen rechts - links

Hier nur ein Ausschnitt, siehe


https://docs.python.org/3/reference/expressions.html
Challenges (2)

C04:
Fragen Sie den Benutzer nach einer Zahl. C05:
Wenn sie kleiner 10 ist, geben Sie “Zu klein” Fragen Sie den Benutzer nach dem Vornamen
aus, wenn sie zwischen 10 und 20 liegt und nach einer Zahl. Geben Sie danach den
erwidern Sie “in Ordnung” und ansonsten Namen entsprechend oft aus.
“Zu hoch”.

C06:
Erzeugen Sie eine Variable mit einer Zufallszahl folgendermaßen:
import random
random_number = random.randint(1, 50)
Bitten Sie den Benutzer, die Zahl zu erraten. Geben Sie aus, ob die Zahl zu groß oder
zu klein ist, falls sie nicht erraten wurde und lassen Sie den Benutzer erneut raten.
Sobald er Sie errät, geben Sie die Anzahl der Versuche aus.
Coming next:

https://xkcd.com/835/

0b110. Datentypen im Detail

Das könnte Ihnen auch gefallen