Modul: Programmierung B-EPI Einführung in die ...

79
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)

Transcript of Modul: Programmierung B-EPI Einführung in die ...

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“