Modul: Programmierung B-EPI Einführung in die Programmierung EPR WS 2021/2022 VE00 Programmieren – (Aller-)Erste Schritte in Python Prof. Dr. Franziska Matthäus / Prof. Dr. Matthias Kaschube / Dr. Karsten Tolle Institut für Informatik Fachbereich Informatik und Mathematik (12)
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
Modul: Programmierung B-PRG Grundlagen der Programmierung 1 – Teil
1 – V0WS 2021/2022
VE00 Programmieren – (Aller-)Erste Schritte in Python
Prof. Dr. Franziska Matthäus / Prof. Dr. Matthias Kaschube / Dr.
Karsten Tolle
Institut für Informatik
Prof. Dr. Franziska Matthäus
Prof. Dr. Matthias Kaschube
Wichtig für Anfänger*innen und auch „Könner*innen“.
Erste grundlegenden Mechanismen der
Erste Syntaxregeln kennenlernen.
2. Beginnen wir mit einem Programmier-Beispiel!
3. Regeln und Konventionen beim Programmieren
4. Kernkonzepte: Variable – Zuweisung – Literal
a. Variable
b. Zuweisungsoperator
7. Zusammenfassung und Ausblick
Prof. Dr. Franziska Matthäus
Prof. Dr. Matthias Kaschube
Wichtig für Sie:
objektorientiertes Programmieren
Interpreter- und Compiler-(Sprachen) kennenlernen.
erarbeitet, sie erlernt – Docs lesen (und verstehen)!
Gefühl für einen guten Programmier-Stil entwickeln.
Programme so zu schreiben, dass sie von anderen verstanden
werden können ( Teamarbeit).
Wissen erwerben: Wie lese ich größere Programme (was ist
wichtig,
was unwichtig).
gelesen – analysiert – ausgeführt genau in der angegebenen Folge
der Zeilen.
Python hat dynamisches Typing.
Sehr wichtig inzwischen für Bioinformatiker, Naturwissenschaftler,
… Data Science.
Python wird aktiv weiterentwickelt (lebende Sprache!).
Zitat: „Python ist in der Tat eine aufregende und mächtige Sprache.
Sie hat die
richtige Kombination von Leistung und Funktionsumfang, die das
Schreiben von
Python-Programmen zugleich einfach und zu einem Vergnügen
macht.“
aus: A Byte of Python … Deutsche Übersetzung:
http://abop-german.berlios.de/
Aber ACHTUNG: Die deutsche Version übersetzt V.1.2 aktuell V.3.7
.
Release version Release date
End of Development!
Python 2.7.17 2019-10-19
Python 2.7.16 2019-03-04
Python 2.7.15 2018-05-01
Python 2.7.14 2017-09-16
Python 2.7.13 2016-12-17
Python 2.7.12 2016-06-25
Python 2.7.11 2015-12-05
Python 2.7.10 2015-05-23
Python 2.7.0 2010-07-03
3.7.4
Revisionsnummer (patch level) häufig für Fehler-
behebungen genutzt
Aber: dies sind lediglich grobe Hinweise. Marketing- und
Release-Timing-
Aspekte, etc. verändern diese ggf. Während der Entwicklung und
Pflege meist
noch weitere Nummerierungen, z.B. sogenannte „Build-Nummern“.
Prof. Dr. Franziska Matthäus
Prof. Dr. Matthias Kaschube
2. Beginnen wir mit einem Programmier-Beispiel!
3. Regeln und Konventionen beim Programmieren
4. Kernkonzepte: Variable – Zuweisung – Literal
a. Variable
b. Zuweisungsoperator
7. Zusammenfassung und Ausblick
Prof. Dr. Franziska Matthäus
Prof. Dr. Matthias Kaschube
Wir lösen unser Problem indem wir Software und Hardware
nutzen!
Ein Programm zu schreiben heißt:
0. das “Problem” (die Aufgabe) zu beschreiben.
1. Die Beschreibung analysieren und eine Lösungsidee entwickeln mit
Auswahl /
Entwicklung und Beschreibung der benötigten Algorithmen und
Datenstrukturen.
2. Umsetzung (das eigentliche Programmieren) in einer
Programmiersprache =
"Coden“ (Programmieren im engeren Sinn).
3. Test des Programms.
4. Dokumentation des Programms (zusätzlich zu den Kommentaren im
Code).
IMMER diese Schritte!
beschreiben]:
Beispiel: "Schreiben Sie ein Programm, dass den Flächeninhalt eines
Kreises
berechnet. Der Radius des Kreises soll vom Benutzer eingegeben
werden.“
In unseren Übungsfällen macht dies i.d.R. der Aufgabensteller. Das
steht so im
Übungsblatt.
festlegen und dokumentieren Schritt 1.
Sie haben auch immer die Zeit um nachzufragen!
Nicht wie in der Schule: Alles vollständig angegeben (manchmal
sogar: jede
Angabe ist notwendig zu benutzen).
Prof. Dr. Franziska Matthäus
Prof. Dr. Matthias Kaschube
„Analyse“ auf Papier.
Typische Ergänzungen: Woher einlesen?
1. Erfrage die Größe des Radius beim Benutzer über die
Konsole.
Kreisfläche = Radius * Radius * π
der Konsole an.
wie/womit soll sie erfolgen?
wie/womit soll sie erfolgen?
• Was ist die Verarbeitung
• Was muss zwischen-
So entsteht Python-Code, die Software
E
V
A
area = radius * radius * 3.141
print("Die Kreisfläche ist: ", area)
Erstellen, verändern und ausführen kann man solche Dateien
mit
Texteditor (und Interpreter)
Integrated Development Environment
Texteditoren gibt es sehr viele:
aber Word, Writer (Open Office) etc. sind NICHT geeignet
sind Textverarbeitungsprogramme mit Formatierung, …
Notepad++, Emacs, Atom, Sublime Text, …
wenn, dann mit Syntax (Sprachregeln)-Highlighting, …
IDE = Integrated Development Environment
Linter, usw. sind in einem System einheitlich verfügbar
gemacht.
Häufig für eine Programmiersprache entwickelt.
Beispiele:
und eignet sich für Anfänger. Kaum komplizierte
Funktionalitäten.)
PyCharm (für Python, (Edu Edition))
Spyder (für Python, insbesondere im naturwiss. Umfeld)
IDLE
eines Programms:
Zuweisung =
Datentyp Float (Gleit-)Punktzahl 3.141
haben ggf. Parameter
Ergebnisse zu dokumentieren.
(Donald Knuth, 1984) genutzt.
grammteilen einer oder mehrerer Programmiersprachen,
Visualisierungen,
usw. In sogenannten “Zellen” unter einer
Benutzungsoberfläche.
Jupyter Notebook (früher IPython Notebook) ist eine
Web-basierte
interaktive Umgebung um Jupyter-Notebook-Dokumente zu
erstellen.
Ein Jupyter Notebook File kann in diversen Formaten ausgegeben
werden:
(HTML, presentation slides, LaTeX, PDF, ReStructuredText,
Markdown,
Oftmals unter Entwicklern ein ungeliebter Job – leider!
unvollständig
Eine betrübliche Wahrheit: Den Nachweis, dass keine Fehler
(mehr)
vorhanden sind, kann das Softwaretesten nicht erbringen. Edsger W.
Dijkstra
schrieb hierzu: „Program testing can be used to show the presence
of bugs,
but never show their absence!“
Aus diesem Grund beschäftigen sich verschiedene Teststrategien und
-
konzepte mit der Frage, wie mit einer möglichst geringen Anzahl
von
Testfällen eine große Testabdeckung zu erreichen ist.
Professionell erfolgt dies mit entsprechenden Testsystemen.
Zunächst
machen wir dies aber von Hand (genauer: „durch scharfes
Denken“).
Kurzgefasst aus Schritt 2 dieser Anleitung: Das Besondere
kurz
darstellen: Das was man wissen sollte, um das Programm
weiterzuentwickeln: Bei größeren Programmen entsteht ein
Handbuch.
Wenn Sie ein interaktives Programm schreiben, gehört ein
Nutzerhandbuch / eine Benutzungsanleitung dazu. (oft ist dies
der
alleinige Teil des Handbuchs).
Quelltext (Programmtext) zu halten, also oft im Programm selbst
zu
dokumentieren, damit die Dokumentation aktuell gehalten wird.
Ggf. eine README-Datei, häufig einfache Textdateien, die das
absolut
Notwendige enthält, um das Programm zu installieren und zu
nutzen.
Prof. Dr. Franziska Matthäus
Prof. Dr. Matthias Kaschube
Entwurfsmuster finden. Auswahl / Entwicklung und Beschreibung
der
benötigten Algorithmen und Datenstrukturen (Design).
2. Umsetzung des Konzepts in eine Programmiersprache –
"coden".
3. Test des Programms (auch dieses dokumentieren).
4. Dokumentation des Programms
immer dazu!
Integrated Software Development Environment IDE
IDLE Integrated Development and Learning Environment
NEIN Jupyter Notebook (werden als Lösung nicht akzeptiert: nur
.py)
IDLE Shell nennt man die "Konsole" der IDLE (Funktionen wie
der
Interpreter, nur dass der Editor Syntax-gesteuert ist)
etwas mehr Komfort, weniger Tippfehler, Autocompletion.
Oft weißer Hintergrund
2. Beginnen wir mit einem Programmier-Beispiel!
3. Regeln und Konventionen beim Programmieren
4. Kernkonzepte: Variable – Zuweisung – Literal
a. Variable
b. Zuweisungsoperator
7. Zusammenfassung und Ausblick
Prof. Dr. Franziska Matthäus
Prof. Dr. Matthias Kaschube
Es besteht aus einer Folge von Anweisungen (statements),
dem Programm! Dies nennt man Quelltext (Source Code).
Die Anweisungen sind eine logische Zeile lang (häufig auch eine
physikalische Zeile
lang); bestimmt durch die Art der Anweisung.
Die Anweisungen werden durch ein Trennsymbol (<return> oder
Semikolon)
voneinander getrennt.
Diese Anweisungen werden bei der Programmausführung der Reihe nach,
von der
ersten bis zur letzten Anweisung ausgeführt. … man coded also das
„wie“.
Dies ist die Regel: Abweichungen davon kommen später!
Nach der Ausführung der letzten Anweisung im Programm(-text) hält
der Interpreter an –
das Programm ist beendet.
Prof. Dr. Franziska Matthäus
Prof. Dr. Matthias Kaschube
Zwischen zwei Anweisungen steht meist einfach das „Return-Zeichen“
als
Trennsymbol.
Beispiel:
Anweisung2 Anweisung3;
Syntaxregel in Python: Trennsymbol
Prof. Dr. Franziska Matthäus
Prof. Dr. Matthias Kaschube
(Hauptziel: Programme müssen eindeutig sein!)
Interpreter (Compiler) überwacht dies, meldet ggf. Verletzungen
(Fehler).
Konventionen sind Vereinbarungen zwischen Programmierern, um
die
Lesbarkeit und Übersichtlichkeit eines Programms zu
verbessern.
Insbesondere für die Teamarbeit wichtig: Sie müssen auch
Programme
anderer Programmierer*innen lesen.
Proposal), siehe https://www.python.org/dev/peps/pep-0008/ oder
besser
für uns Menschen aufbereitet: https://pep8.org/ (derselbe
Text).
Regeln und Konventionen
Unter der Syntax einer Programmiersprache (formale Syntax),
versteht man
ein System von Regeln, nach denen wohlgeformte (=
„syntaktisch
korrekte“) Sprachkonstrukte (= Ausdrücke, Formeln, …,
Programmtexte)
aus einem grundlegenden Zeichenvorrat gebildet werden.
Die Regeln können in natürlicher Sprache formuliert sein, sind
meist
aber formal in einer Metasprache, z.B. einer Variante der BNF
(=
Backus-Naur-Form) formuliert.
Die Semantik (= Bedeutungslehre) einer Programmiersprache
beschreibt
die Bedeutung der wohlgeformten Sprachkonstrukte:
Sie kann formal erfolgen, wird meist aber informal (als
Freitext)
formuliert.
… als Source (Quelle):
1. Ein Textfile das den Syntax- und Semantik-Regeln der
Programmiersprache Python
entspricht.
2. Wir fordern zusätzlich: Das Programm muss unseren Konventionen,
d.h. PEP 8
entsprechen.
3. Ein Source-File ist sowohl vom Menschen ( der Programmierer*in)
als auch von der
Maschine (dem Computer) les- und verstehbar.
4. Das Programm soll so wenig wie möglich falsche Resultate
oder
unerwartetes/unerwünschtes Verhalten (Abbrüche, Abstürze, „hängen“
bleiben, …)
zeigen.
Begrenzen Sie eine Anweisungszeile auf maximal 79 (oder 99
Zeichen).
(Man darf diskutieren! - Bitte die Anmerkungen in PEP 8
beachten).
Falls nötig (SELTEN) \ (Backslash) am Ende einer Zeile.
Verlängert
diese Zeile „logisch“ mithilfe der nächsten Zeile
Diese zwei Zeilen sind dann eine
„logische“ Zeile.
Für den Python Interpreter haben Leerzeilen (Achtung: sehr wohl
aber
manchmal Leerzeichen) keine Bedeutung. Er überliest diese
einfach.
Also: Strukturieren Sie Ihren Programmtext in „logische
Blöcke“,
gewissermaßen „Absätze“, durch die Verwendung von „Leerzeilen“,
aber
angemessen, bitte auch nicht zu viele!
Zeilenlänge und Leerzeilen
2. Beginnen wir mit einem Programmier-Beispiel!
3. Regeln und Konventionen beim Programmieren
4. Kernkonzepte: Variable – Zuweisung – Literal
a. Variable
b. Zuweisungsoperator
7. Zusammenfassung und Ausblick
Prof. Dr. Franziska Matthäus
Prof. Dr. Matthias Kaschube
Zuweisung =
Operatoren *
Datentyp Float (Gleit-)Punktzahl 3.141
haben ggf. Parameter print()
Prof. Dr. Franziska Matthäus
Prof. Dr. Matthias Kaschube
Zwischenspeicher(-zelle) im EVA-Prinzip
… ist ein Tripel:
name: oder Bezeichner (identifier). Darunter versteht man einen in
einem
Namensraum (hier zunächst das gesamte Programm) eindeutiges
Wort
(eindeutig = wohlunterscheidbar von allen anderen), unter dem die
Variable
im Programmtext angesprochen werden kann … gleich mehr!
Typ oder Datentyp (type): Zusammenfassung konkreter Wertebereiche
von
Variablen (z.B. ganze Zahlen) und darauf definierten Operationen zu
einer
Einheit.
Wert: „Inhalt“ (value) der Variable – wird durch die Angabe des
Typs
eindeutig: DIX (Nachnamen von Otto DIX oder „römische Zahl“ =
509?)
name Typ Wert
Für jeden Datentyp müssen wir genau betrachten:
den zulässigen Wertebereich,
die spezifisch definierten Literale,
(= Zeichenfolgen, die zur Darstellung der Werte im Programm benutzt
werden: Wie
schreibe ich Daten dieses Typs in meiner Programmiersprache),
die für diesen Typ definierten Operatoren,
die spezifischen Funktionen auf diesem Datentyp,
die spezifischen Eigenarten.
Float „Kommazahlen" Bsp. -5.38, 0.0, 1.0
Rationale Zahlen: Dezimalbrüche,
String Zeichenkette (=Text) Bsp. "Hallo Welt", 'Hallo‘
gekennzeichnet durch die Anführungszeichen " oder
Apostrophs '
Diese und einige weitere Typen behandeln wir in GPR im
Detail!
Im wesentlichen verhalten sich diese Typen aber wie gewohnt,
als
Ganze Zahlen, Kommazahlen oder Zeichenketten (unformatierter
Text).
Prof. Dr. Franziska Matthäus
Prof. Dr. Matthias Kaschube
ist der Zuweisungsoperator
Literal (Typ + Wert)
Durch den Zuweisungsoperator = wird in Python der Typ und der Wert
einer
Variablen verändert, d.h.
ersetzen ggf. den alten Wert.
nach Ausführung unseres Beispiels: anton = 5
In Python müssen Sie nichts weiter machen: Jegliche
Speicherverwaltung
(anlegen, freigeben, …) von Speicherbereichen macht der
Python-Interpreter
für Sie.
>>> anton = 5
die Adresse der Variablen im Speicher –
dies ist "eigentlich" unbedeutend, weil über den
Namen zugegriffen wird. Wichtig ist die
Eindeutigkeit).
Fortsetzung:
File "<pyshell#3>", line 1, in <module>
Anton
Prof. Dr. Franziska Matthäus
Prof. Dr. Matthias Kaschube
dürfen sein:
Ausdrücke (expressions) (in der Mathematik Terme genannt)
Beispiele: 3+5, 7*3, B*3 … (=einfache Ausdrücke, Achtung B*3 ≠
B3)
Diese bestehen aus:
Gültigen Operanden sind Literale wie 3, 5.0, 7 oder
Variablen(-namen) wie B
Gültige Operatoren: +, -, *, / : siehe Auszug aus
Programmierhandbuch (in Moodle) aber auch Funktionen (Prozeduren)
wie input(), eval() oder
mathematische Funktionen wie math.sin(0.5)
(sin() nur verfügbar nach dem Import des Moduls math …
später)
Aber ≠,≤,
, , , …
können wir nicht tippen werden zu Zeichenketten, z.B. != , <=,
** … oder zu Funktionen, wie math.sqrt(x).
Prof. Dr. Franziska Matthäus
Prof. Dr. Matthias Kaschube
g e r
(...) (Vorrang) Klammerung x x x f(...) Funktionsaufruf x x x x **
y Exponential-Bildung xy
(Achtung: rechts-assoziativ)
x x
x * y
x / y
x % y
x // y
Multiplikation (Wiederholung)
Division 1)
x x
x x
Anmerkungen: Oben stehen die Operatoren mit höherer Priorität. x
bedeutet zulässig für diesen Typ.. 1) In Python 3 ist das Ergebnis
der Division / (immer) vom Typ »float«.. 2) siehe Folgefolie.
Bei Ausdrücken:
Etwas tricky!
Achtung: Dies ist in C, C++, Java, usw. anders geregelt.
q = x // y ist die Ganzzahldivision (Division mit Rest).
r = x % y nennt man die Modulo-Operation und
dieser Operator liefert den Rest r
und zwar in Python so, dass
x = q∗y + r mit 0 ≤ r < y für y > 0 (also positiv)
y < r ≤ 0 für y < 0 (also negativ) (floor division)
>>> 4 // 3
-2
2
-2
-2
wie bei der normalen Division.
Der Rest r hat dasselbe Vorzeichen wie y. Siehe Tabelle.
Also: Es wird in Richtung - auf den nächsten
ganzzahligen Wert gerundet (floor division).
q ist wertmäßig eine ganze Zahl z.B. 4 oder 4.0:
x y q r
Die ganzzahlige Division und Modulo ergeben int-Werte,
wenn beide Operanden den Typ »int« haben,
aber float-Werte, wenn mindestens einer der Operanden den Typ
»float« hat.
Achtung!
Rundung Rundung
dem Modulo-Operator %
Achtung: Dies ist in C, C++, Java, usw. anders geregelt,
siehe
https://en.wikipedia.org/wiki/Modulo_operation
warum er dies so gewählt hat.
>>> 4 // 3
2
-2
-1
bei mehreren Operatoren: „Punkt vor Strichrechnung“, im Handzettel
Vorrang von
oben nach unten
die Strichoperatoren (+ und - ).
Bei gleichstark bindenden Operatoren im allgemeinen von links nach
rechts
(linksassoziativ)
aber die Vereinbarung „linksassoziativ“ sichert Eindeutigkeit
aber (leider) eine Ausnahme hierzu: 4**3**2 = 4**(3**2) =
262144
≠ (4**3)**2 = 4096 , also
rechtsassoziativ, wie in der Mathematik üblich (?!!)
Prof. Dr. Franziska Matthäus
Prof. Dr. Matthias Kaschube
ziel1, ziel2, ... = ausdruck1, ausdruck2, ...
Dabei werden zunächst die Werte beider Ausdrücke berechnet und dann
den
Zielen zugewiesen, also:
Python verfügt über weitere Varianten der Zuweisung, nämlich die
sogenannte
„erweiterte Zuweisung“
Vor dem Gleichheitszeichen steht dabei ein zweistelliger (binärer,
binary) Operator ?
(siehe unten). Folgende Anweisungen liefern dasselbe
Ergebnis:
x ?= y entspricht x = x ? y
Die Nutzung der erweiterten Zuweisung ist etwas effizienter, weil
der Interpreter den
Namen x nur einmal „auflösen“ muss.
Prof. Dr. Franziska Matthäus
Prof. Dr. Matthias Kaschube
Vor und nach einem Operator (=, +,-, …) steht ein Blank
(Leerzeichen).
Nach einem Komma steht ein Leerzeichen.
Vor und nach einer Klammer () steht kein Leerzeichen.
Wenn in einem Ausdruck Operatoren verschiedener
Bindungsstärke
(Prioritäten) genutzt werden, so sollte man die höhere
Bindungsstärke
dadurch visualisieren, dass man das Blank weglässt, also
Bitte so:: x = x*2 - 1 oder c = (a+b) * (a-b)
und nicht so: x = x * 2 - 1 oder c = (a + b) * (a - b)
Prof. Dr. Franziska Matthäus
Prof. Dr. Matthias Kaschube
2. Beginnen wir mit einem Programmier-Beispiel!
3. Regeln und Konventionen beim Programmieren
4. Kernkonzepte: Variable – Zuweisung – Literal
a. Variable
b. Zuweisungsoperator
7. Zusammenfassung und Ausblick
Prof. Dr. Franziska Matthäus
Prof. Dr. Matthias Kaschube
Namen / Bezeichner (Regeln)
Von der Programmierer*in definierte Namen beginnen mit einem
Buchstaben (a, ..., z, A,
... Z) oder einem Unterstrich (underscore) (_). Namen können
beliebig lang sein und ab
dem 2. Zeichen zusätzlich auch Ziffern (0,...,9) enthalten.
Kommentar hierzu: Groß- und Kleinschreibung ist immer relevant,
also spam und
Spam sind verschiedene Namen.
andere Sonderzeichen wie !,§,$, ...
Prof. Dr. Franziska Matthäus
Prof. Dr. Matthias Kaschube
EPI - OrganisatorischesNamen / Bezeichner (2)
In Python sind die folgenden 35 Wörter (für die Sprache als
Schlüsselworte
(Keywords)) reserviert und als Variablennamen verboten, weil diese
eine
spezielle Bedeutung in der Sprachsyntax haben:
False await else import pass None break except in raise True class
finally is return and continue for lambda try as def from nonlocal
while assert del global not with async elif if or yield
Fehlermeldung:
Prof. Dr. Franziska Matthäus
Prof. Dr. Matthias Kaschube
Variable nomen_mit_unterstrich
Beispiel: current_index
In Python gibt es keine syntaktische Möglichkeit Konstanten zu
deklarieren (wie „final“ in
Java). Konstanten sind in Python Variablen, die zur Laufzeit des
Programmes nicht
verändert werden sollen/dürfen.
Englisch ist nun einmal die "Lingua Franca" (Umgangssprache) der
Informatik.
Prof. Dr. Franziska Matthäus
Prof. Dr. Matthias Kaschube
und Konstanten (2)
Machen Sie den Datentyp nicht zum Teil des Namens (dieses
sieht
man manchmal als „falsch verstandene“ „Ungarische Notation“,
also
benutzen Sie nicht int_number, currency_string.
Underscore am Namensanfang oder CamelCasing (Großbuchstaben)
in der Wortmitte sind in Python für spezielle Nutzungsfälle
(Sichtbarkeit
und Klassennamen – kommt später) reserviert, also für normale
Variablen/Konstante nicht benutzen.
the Hobgoblin of Liitle Minds.“ (PEP 8)
Wir halten uns trotzdem dran!
Prof. Dr. Franziska Matthäus
Prof. Dr. Matthias Kaschube
Wählen Sie Namen, aus denen das Bezeichnete wahrscheinlich
richtig
erraten wird: current_line ist viel besser als c oder cl. Dies ist
sicher nicht
immer leicht. Wer weiß, in ein paar Monaten sind Sie es vielleicht
selbst,
die/der die Bedeutung dieses Namens erraten muss?
Benutzen Sie den Singular für einzelne Objekte (Variablen) und den
Plural
für Kollektionen (z.B. Listen, kommt später). Ich nehme an, wenn
Sie
name lesen erwarten Sie einen Namen, wenn Sie names lesen
mehrere.
Wählen Sie die Namen so präzise wie möglich: Wenn eine Variable
eine
eingelesene Zahl ist, nennen Sie diese readin_value oder in_value
und
nicht nur input oder value.
Prof. Dr. Franziska Matthäus
Prof. Dr. Matthias Kaschube
Ein-Buchstaben Bezeichner sollten nur in sehr überschaubaren
Zusammenhängen
vorkommen (wo die Variable i oder k) nur eine oder zwei Zeilen
„überlebt“, das heißt
Bedeutung hat und dann nicht mehr, zum Beispiel als einfacher
Index.
Strenger: Benutzen Sie NIE „l“ (kleines L) oder I (großes i) oder O
(großes o) als „Ein
Buchstaben Bezeichner“. In einigen Fonts sind diese Zeichen nicht
oder kaum
unterscheidbar von den Ziffern „1“ (Eins) oder „0“ (Null).
Prof. Dr. Franziska Matthäus
Prof. Dr. Matthias Kaschube
Benutzen Sie so wenig wie möglich Abkürzungen, insbesondere
keine
selbst erfundenen wie zum Beispiel: finutowo für „final number to
work on“.
Aber allgemein übliche Abkürzungen sind erlaubt, wie
curr für „current“,
„Ich habe keinen Namen
dafür! Gefühl ist alles;
[aus Faust: Eine Tragödie - Kapitel 19 Marthens Garten],
aber nicht so in der Programmierung.
Prof. Dr. Franziska Matthäus
Prof. Dr. Matthias Kaschube
2. Beginnen wir mit einem Programmier-Beispiel!
3. Regeln und Konventionen beim Programmieren
4. Kernkonzepte: Variable – Zuweisung – Literal
a. Variable
b. Zuweisungsoperator
7. Zusammenfassung und Ausblick
Prof. Dr. Franziska Matthäus
Prof. Dr. Matthias Kaschube
Sobald Sie programmieren, wird es sicher sehr bald zu
Fehlermeldungen
kommen, d.h. der Interpreter (oder das zugehörige
Laufzeitsystem)
erkennen, dass etwas an ihrem Code nicht richtig sein kann.
Diese vom Interpreter gemeldeten Fehler sind meist nicht
schlimm
und nicht problematisch!
oder Logische Fehler.
Sie müssen lernen, diese zu lesen. – Der Interpreter versucht,
genaue
Hinweise zu den Fehlern zu geben (,das muss nicht immer
gelingen).
Beispiel für eine Fehlermeldung zu dem folgenden Quelltext:
Radius = 5
area = 3.14 * radius
In der IDLE Shell erscheint nach dem Starten dieses Moduls
folgendes:
Traceback (most recent call last):
File "C:/Users/kroemker/example_2.py", line 2, in
<module>
area = 3.14 * radius
NameError: name 'radius' is not defined
von hinten lesen! 1. Welcher? Wiederholt die Fehlerhafte Zeile: 2.
Was? 3. Wo?
Eine Interpretation des gemeldeten
Fehlers ist immer nötig!
Prof. Dr. Franziska Matthäus
Prof. Dr. Matthias Kaschube
Je nach aktueller Situation und auch Sichtweisen unterscheidet
man:
1. Funktions-(Analyse)
stufen eines
Interpreters / Compilers
• Lexikalischer Fehler
• Syntaktischer Fehler
• Semantischer Fehler
Die Compiler und Laufzeitsysteme oder Interpreter haben in der
Regel
ihre eigene Fehler-Klassifikation. In Python gibt es dazu eine
Hierarchie.
Alle Fehlermeldungen sind in die Exception-Hierarchie
eingeordnet
Hier nur die Wichtigsten. Exception
ArithmeticError OverflowError ZeroDivisionError
EOFError ImportError LookupError
1. lexikalische Analyse
2. syntaktische Analyse
3. (statische) sematische Analyse
Ziel ist es, mögliche Fehler so früh wie möglich zu finden.
V
Zeichen im Programmtext enthalten sind.
Die lexikalische Analyse setzt den Quelltext (mit einem
Scanner/Lexer/Tokenizer) in
sogenannte Token um: Schlüsselwörter, Bezeichner, Zahlen,
Zeichenketten oder
Operatoren.
Nur sehr einfache Fehler erkennbar, z.B. im Quelltext nicht
erlaubte Zeichen, wie §, ², €.
Python subsummiert diese unter Syntax Fehler.
Sind oft Tippfehler: z.B. bei Variablennae
V
Anzahl Parameter bei Funktionen u.s.w..
Z.B. geben die Schlüsselworte oft eine bestimmte Struktur
vor.
Der syntaktische Analysierer wird oft auch Parser genannt.
Falls der Quellcode nicht zur Grammatik der Quellsprache passt,
gibt der Parser einen
Syntaxfehler aus.
Übrigens: Syntaxfehler gibt es auch in natürlichen Sprachen: „Hund
Katze Pferd grün“
ist kein deutscher Satz (Grammatik), es fehlt mindestens ein
Verb.
V
der syntaktisch/lexikalisch fehlerhaften Stelle ab.
Das Verstehen und Korrigieren von Fehlern ist ein notwendiger und
wichtiger Teil des
Programmierens, leider am Anfang manchmal mühsam!
Der Python-Interpreter wird - soweit möglich - alles ausführen, was
er meint
"verstanden" zu haben. Nur wenn es nicht mehr weitergehen kann,
versucht Python
zumindest ein paar Informationen über den Fehler zu nennen, damit
die
Programmierer*in den Fehler möglichst einfach findet!
Prof. Dr. Franziska Matthäus
Prof. Dr. Matthias Kaschube
Beachten Sie bitte die leicht verschiedenen Ausgaben, insbesondere
auch die Stelle, wo
der Interpreter den Fehler erkannt hat: ^ links und "roter Balken"
rechts. Die Vermutung
muss nicht immer stimmen. Der Fehler kann vorher erfolgt sein! …
liegt aber meist kurz davor.
Prof. Dr. Franziska Matthäus
Prof. Dr. Matthias Kaschube
die syntaktische Analyse hinausgehende Bedingungen an das
Programm.
Anweisung zwar syntaktisch fehlerfrei ist (also der Grammatik
entspricht),
aber inhaltlich fehlerhaft ist. Wir unterscheiden:
Fehler der statischen Semantik (können zur Übersetzungszeit
entdeckt werden). Sind ggf. schwer von syntaktischen Fehlern
zu
trennen. „Gute Übersetzer finden und melden diese!“, z.B.
Andere Fehlerursachen, wie beispielsweise das Auftreten einer
Division durch 0 sind in der Regel zur Compilezeit nicht zu
erkennen
und werden den dynamischen Semantikfehlern zugeordnet. –
liefern fehlerhafte Ergebnisse.
die Verwendung eines vorher nicht definierten Bezeichners erzeugt
in
Python einen (NameError).
die Anwendung eines Operators auf eine Variable, für deren Typ
dieser
Operator nicht definiert ist (TypeError). >>>
print(value)
Traceback (most recent call last):
File "<pyshell#52>", line 1, in <module>
print(value)
>>> b = 'Beispiel'
>>> b - 1
File "<pyshell#54>", line 1, in <module>
b - 1
V
Division durch Null (ZeroDivisionError)
Versuch auf nicht vorhandene Werte in der Liste zuzugreifen
(ValueError)
Versuch über einen Index zuzugreifen der nicht belegt ist
(IndexError). >>> a = 0
>>> b =10 / a
File "<pyshell#56>", line 1, in <module>
b =10 / a
File "<pyshell#59>", line 1, in <module>
liste.remove(4)
>>> liste = [0, 1, 2]
File "<pyshell#61>", line 1, in <module>
liste[3]
V
Die statischen semantischen Fehler können vom Übersetzer
abgefangen werden und sind damit vergleichsweise harmlos, weil
sie
gut lokalisiert (Zeilennummer) werden können und damit auch
schnell
behebbar sind.
Beanstandung übersetzt;
"Laufzeitfehler“:
Die Grenze zwischen statischer und dynamischer Semantik ist
fließend,
weil bestimmte Zusammenhänge theoretisch vom Compiler
entdeckt
werden könnten, wenn er nur „gründlich genug“ zu Werke ginge;
V
Die Behandlung von Laufzeitfehlern ist oft problematisch, weil
z.B.
der Fehler nicht immer auftritt, sondern nur in einem
bestimmten
Kontext (Benutzereingaben, Kommandozeilen-Parameter, Eingabe-
daten, Uhrzeit und Datum etc.). Ist dann ggf. nicht
reproduzierbar.
der Fehler an ganz anderer Stelle zum tragen kommt (sich auswirkt)
als
an der eigentlich fehlerhaften Stelle.
Der Bezug zwischen Quelltext und z.B. Absturzstelle durch die
Übersetzung „verloren“ gegangen ist. (Ist bei einem Interpreter
wie
Python nicht der Fall: Man weiß immer, welche Quellzeile
aktuell
ausgeführt wird, aber ggf. bei übersetzten Programmen.) Da muss
aber
nicht der Fehler liegen!
Programmieranfänger*innen.
semantisch korrektes Programmliefert kann falsche Ergebnisse
liefern.
Solche Fehler sind logische Fehler
Sie bestehen in einem im Detail falschen
Problemlösungsansatz,
beispielsweise auf Grund eines Fehlschlusses, einer falsch
interpretierten Aufgabe oder einfach eines Versehens oder
Schreibfehlers.
falschen Resultaten oder unerwartetem/unerwünschtem
Verhalten.
Beispiele: plus statt minus getippt, kleiner statt kleiner-gleich
usw.
Logische Fehler sind adhoc oft nicht von dynamischen
semantischen
Fehlern zu unterscheiden.
Laufzeitfehler (runtime error) sind Fehler, die während der
Laufzeit eines
Computerprogramms auftreten.
diese Unterscheidung adhoc manchmal schwer entscheidbar!).
Das Programm zeigt bei Laufzeitfehlern unerwünschtes (=
fehlerhaftes) Verhalten:
Falsche Ergebnisse aber auch:
im Extremfall Abbruch der Ausführung (Fehlermeldung, „Absturz“ wg.
z.B. „Division
durch Null“),
das Programm geht in einen Zustand über, in dem es keine
Benutzereingaben mehr
akzeptiert („Einfrieren“, „Hängen“).
Lesbarkeit, Verständlichkeit und Wartbarkeit von Software zu
sichern.
Regelt „wie“ ein Programm, d. h. sein Quellcode, in formaler
und
struktureller Hinsicht gestaltet sein soll.
Dies führen wir Zug-um-Zug ein … immer zusammen mit der
Grammatik.
Für Python machen wir das Dokument PEP 8 (Python Enhancement
Proposal) für EPI verbindlich:
so wie „echte“ Programmierfehler!
aus PEP 8), also unseren Konventionen, werden durch ein
Zusatzprogramm sichtbar, z.B. pylint oder flake8 (Behandeln wir
später!)
2. Lexikalische Fehler Kennzeichen: Der Python-Interpreter
Syntaktische Fehler gibt eine detaillierte Fehlermeldung,
Statische Semantikfehler Interpreter bricht Bearbeitung ab.
Oft als Semantikfehler zusammengefasst.
Logische Fehler wartetes Verhalten melden, z.B. ‚Division
durch Null‘ (+ Abbruch), oft aber auch
nicht: Da gibt es „nur“ falsche Ergebnisse.
Nur durch methodisches und ausführliches Testen auffindbar.
Prof. Dr. Franziska Matthäus
Prof. Dr. Matthias Kaschube
2. Beginnen wir mit einem Programmier-Beispiel!
3. Regeln und Konventionen beim Programmieren
4. Kernkonzepte: Variable – Zuweisung – Literal
a. Variable
b. Zuweisungsoperator
7. Zusammenfassung und Ausblick
Prof. Dr. Franziska Matthäus
Prof. Dr. Matthias Kaschube
Jeden Montag um 12-14 Uhr in ZOOM.
Prof. Dr. Franziska Matthäus
Prof. Dr. Matthias Kaschube
… Lernmaterialien in Moodle ansehen:
…
„Happy Pythoning“