Programmieren für Ingenieure
Typische Fehler
Inhaltsverzeichnis
- 1) Willkommen
- 2) Mindset
- 3) Kursübersicht
- 4) Download und Installation
- 5) Hello World
- 6) Entwicklungsumgebung
- 7) Informationen finden
- 8) Variablen
- 9) String
- 10) Integer, Float
- 11) Boolean
- 12) Abfragen
- 13) while Schleifen
- 14) for Schleifen
- 15) List
- 16) Dictionary
- 17) None
- 18) Datentypen umwandeln
- 19) Funktionen
- 20) Module
- 21) Debugging
- 22) Übungen
- 23) Übung 1: Zahlen addieren
- 24) Übung 2: Groesseren Wert finden
- 25) Übung 3: Kreis Fläche und Umfang berechnen
- 26) Entwicklungsprozess
- 27) Beispielprogramm Prozessdaten 1: kopieren
- 28) Beispielprogramm Prozessdaten 2: auswerten
- 29) Einstellungen über Settings.xml
- 30) Logging
- 31) Exceptions
- 32) Übung 4: Praxisvorbereitung
- 33) Typische Fehler
- 34) Code Optimierung
- 35) Ausführung
- 36) Ausführung 1: IDE py cmd bat
- 37) Ausführung 2: Windows exe
- 38) Ausführung 3: Aufgabenplanung
- 39) Ausführung 4: Setup Raspberry Pi
- 40) Ausführung 5: Raspberry Pi Ausführung
- 41) Danke
In dieser Lektion möchte ich dir eine Reihe von typischen Fehlern zeigen, die den meisten Entwicklern beim Programmieren passieren. Die häufigsten Fehler zumindest schon einmal gesehen zu haben hilft dir hoffentlich dabei sie zu vermeiden oder wenigstens schneller zu finden, wenn sie dir selbst passieren.
Der Erste ist, dass du auf eine Variable zugreifst, die nicht definiert ist oder du einen Tippfehler im Namen der Variable oder einer Funktion hast.
In diesem Fall wirst du eine NameError Exception erhalten.
# Tippfehler / Variable nicht definiert
zahl1 = 1
zahl2 = 2
print(zah1l + zahl2)### ERGEBNIS / AUSGABE ###
NameError: name ‚zah1l‘ is not defined
Viele IDEs, wie auch Visual Studio Code, werden dich bereits vor der Ausführung deines Codes auf einen solchen Fehler hinweisen.
Das ist sehr hilfreich, aber aus eigener Erfahrung kann ich dir sagen, dass es sich leider trotzdem nicht vermeiden lassen wird von Zeit zu Zeit in einen solchen Fehler zu laufen.
Wenn du einer Funktion zu wenig oder viele Parameter übergibst wirst du eine TypeError Exception erhalten.
# zu wenig / zu viele Parameter übergeben
def Addieren(zahl1, zahl2):
print(zahl1 + zahl2)Addieren(1, 2, 3)
### ERGEBNIS / AUSGABE ###
TypeError: Addieren() takes 2 positional arguments but 3 were given
Auch wenn du versuchst auf ein leeres Objekt (None) zuzugreifen wirst du eine TypeError Exception erhalten.
Häufig wird in diesem Fall auch von einer Null Reference Exception gesporchen.
# Objekt None
text1 = „Hello World =)“
text2 = Noneprint(text1 + text2)
### ERGEBNIS / AUSGABE ###
TypeError: can only concatenate str (not „NoneType“) to str
Wenn du versuchst ein Modul zu importieren das entweder nicht installiert ist oder dessen Name einen Tippfehler enthält, wirst du einen ModuleNotFoundError erhalten.
# Modul nicht gefunden
import loggin### ERGEBNIS / AUSGABE ###
ModuleNotFoundError: No module named ‚loggin‘
Ein Fehler, der dir vor allem häufig passieren kann, wenn du dich an den offiziellen Python PEP8 Style Guide hältst und deinen Code mit Leerzeichen einrückst, ist eine falsche Einrückung.
Andere Programmiersprachen umgehen dieses Problem elegant mit Klammern, aber auch das ist wieder eine persönliche Geschmacksfrage.
Nach meiner Erfahrung lässt sich dieses Problem auch mit Python durch die Verwendung von Tabs anstatt Leerzeichen minimieren, aber auch bei der Frage, ob das den „Verstoß“ gegen die Richtlinien Wert ist, scheiden sich die Geister.
Bei Interesse findest du den kompletten PEP8 Style Guide übrigens unter:
https://www.python.org/dev/peps/pep-0008/
# Falsche Einrückung
for i in [1, 2, 3]:
for k in [1, 2, 3]:
print(i)print(i + k)
### ERGEBNIS / AUSGABE ###
IndentationError: unexpected indent
Auch auf diesen Fehler wirst du von vielen IDEs bereits vor der Ausführung deines Codes hingewiesen.
Auch wenn Python weitestgehend auf die Nutzung von Klammern verzichtet lassen sie sich natürlich nicht gänzlich vermeiden und können bei ungleicher Anzahl öffnender und schließender Klammern zu einem SyntaxError führen.
# Fehlende Klammer
for i in [1, 2, 3]:
print(((i**2/2))### ERGEBNIS / AUSGABE ###
SyntaxError: unexpected EOF while parsing
Auch auf diesen Fehler wirst du allerdings bereits vor der Ausführung deines Codes von vielen IDEs hingewiesen.
Ein Fehler, vor dem dich keine IDE warnen wird, ist eine Endlosschleife.
# Endlosschleife
i = 1
while i < 10:
print(i)### ERGEBNIS / AUSGABE ###
1
1
1
…
Solltest du dich einmal ausversehen in den Fängen einer Endlosschleife wiederfinden, kannst du die Ausführung deines Codes jederzeit mit der Tastenkombination „Strg + c“ beenden.
Häufig kommt es auch vor, dass du beim Arbeiten mit Schleifen um eine Ausführung daneben liegst, wenn du zum Beispiel ausversehen nur „<“ anstatt „<=“ verwendest.
Nicht weniger tückisch ist es übrigens, dass beim Programmieren immer vom 0 mit dem Zählen angefangen wird und nicht wie in vielen anderen Lebenslagen bei 1.
Eine Typische Falle ist hier zum Beispiel die Nummerierung von Elementen in einer Liste, wo das erste Element den Index 0 hat, das zweite Index 1 und so weiter.
# Off by 1
i = 1
while i < 10:
print(i)
i += 1### ERGEBNIS / AUSGABE ###
1
2
…
8
9
Das besonders tückische an diesem Fehler ist, dass du keine Fehlermeldung erhalten wirst, sondern deine Schleife fälschlicherweise anstatt 10000 Durchläufen nur 9999 ausführt, ohne dich explizit darauf hinzuweisen.
Ein letzter Fehler, der nach meiner Erfahrung nicht gerade häufig passiert, allerdings trotzdem so viel diskutiert wird, dass ich ihn zumindest einmal erwähnen möchte, ist die Verwendung von „=“ anstatt „==“.
An dieser Stelle also noch einmal kurz die Erinnerung: „=“ ist ein Operator, der für Zuweisungen verwendet wird, und „==“ hingegen zum Vergleichen.
# = statt ==
i = 21
if i = 21:
print(„i ist 21“)### ERGEBNIS / AUSGABE ###
SyntaxError: invalid syntax
Sollte dir dieser Fehler tatsächlich einmal passieren, wirst du von den meisten IDEs vermutlich schon vor der Ausführung deines Codes darauf hingewiesen.
Ich wünsche dir, dass du den Problemen aus dieser Lektion so selten wie möglich begegnest, und sie bei den unvermeidlichen Begegnungen schnell und mit wenig Kopfzerbrechen lösen wirst.
Vielen Dank fürs zuschauen und freue mich schon darauf dich gleich in der nächsten Lektion wiederzusehen =)