Tag 1 - Datentypen, Operatoren & Variablen#

Herzlich Willkommen beim ersten Tag des Blockkurses Einführung in Python!

Im Folgenden werden sich Erklärungen und Aufgaben abwechseln. Die Einzelnen Kapitel werden wir zunächst immer einmal gemeinsam durchgehen um dann durch Gruppen und Einzelarbeit eine individuell angepasstere Einarbeitung ermöglichen. Wenn Sie auf Probleme oder Herausforderungen stoßen, versuchen Sie erst 10 Minuten selbst eine Lösung zu finden, sich dann an Ihre Gruppe oder uns zu wenden. Geben Sie der Sache einen ernsten Versuch, lassen Sie sich jedoch auch nicht zu lange aufhalten. Gemeinsamer Austausch ist wichtig und Fragen sind jederzeit herzlich willkommen!

Generell werden die kommenden Tage recht ähnlich strukturiert sein. Unten sehen Sie eine erste grobe Übersicht:
9:00 Start mit kurzem Input
9:30/45 Review (vorangegangener Tag) und Überblick neuer kurzer Input
10:40 Pause
11:00 Review und Überblick neuer kurzer Input
11:30 Hands on!
12:30 Mittagspause
13:00 Review und Überblick neuer kurzer Input
13:30 Hands on!
14:30 kurzes Kaffee Päuschen
15:30 Review und abschließende Fragen klären
16:00 Offizielles Ende. Bis 16:30 bleiben wir noch anwesend für individuelle Fragen und Co.\

Was ist Python?#

Python ist eine open source, high level, objekt-orientierte Programmiersprache und ist häufig auch als ‘scripting Sprache’ bezeichnet. Python wurde ~1990 von Guido van Rossum entwickelt und ist bis heute eine der wichtigsten und weitreichend angewandte Programmiersprache.

In einem Script (ein Dokument) können wir als Geographen häufig eine Funktion oder Algorithmus zusammenstellen um entsprechend Probleme automatisiert zu lösen. (für geoscripting siehe Prof. Dr. Höfle’s Kurs).

‘high’ oder ‘low’ level bezieht sich auf die Nähe zur Hardware (den physischen Teilen des PCs). Sprachen wie C++ oder Java sind bspw. näher an der Hardware also high-level Sprachen wie Python. Diese sind näher zu unserer natürlichen Sprache und damit einfacher zu erlernen. Allerdings sind das nur grobe Kategorisierungen und keine klaren Abgrenzungen und beide Arten bringen ihre Vor- und Nachteile mit sich.

Python ist eine ‘interpretierte’ Programmiersprache. Python interpretiert somit den geschriebenen Code Zeile für Zeile während der run-time. Es gibt somit keine vorrangehende Complier-Instanz.

ERRORS ARE OKAY!

Programme stürzen ab, wenn sie Code enthalten, den der Computer nicht versteht (was er leider häufig nicht tut), was dazu führt, dass Python eine Fehlermeldung anzeigt. Eine Fehlermeldung macht Ihren Computer aber nicht kaputt, also haben Sie keine Angst davor, Fehler zu machen. Ein Absturz bedeutet nur, dass das Programm unerwartet aufgehört hat zu laufen.

Wenn Sie mehr über einen Fehler wissen möchten, können Sie den genauen Text zuerst Stück für Stück genau lesen und sonst die Fehlermeldung online suchen, um weitere Informationen zu erhalten.

Datentypen#

Rekapitulation aus der Vorbereitung: Es gibt simple und komplexe Datentypen. Heute beschäftigen wir uns zunächst einmal nur mit den simplen Datentypen. Hierzu gehören:

  • Integer (Ganzzahlen wie 1;2;3;…)

  • Float (Dezimalzahlen: 3,14; 4,59836532; …)

  • String (Buchstaben und Wörter)

  • Boolean (True, False)

  • None type (None - ‘nichts’)

und komplexe Datentypen (morgen) wären dann:

  • Liste

  • Array

  • Dictionary (key:value)

  • Tupel

  • Datetime (Datum)

Letztlich sorgen diese Datentypen als Interpretationsanweisung für den Computer wie die unterliegenden Bits (0,1) und Bytes (8 Bits) verstanden werden sollen. Die verschiedenen Datentypen geben die Möglichkeit Daten unterschiedlicher Skalenniveaus darzustellen. Datentypen, so wie die unterliegenden Skalenniveaus, sind somit nicht alle mit allen kompatibel.

Operatoren#

Operatoren in Python sind Symbole oder Wörter, die verwendet werden, um Operationen auf Werten und Variablen durchzuführen. Diese sind zu Teilen identisch zu allgemein bekannten mathematisch arithmetischen Operatoren (+, -, *, /), zu anderen Teilen gehen sie darüber hinaus. Insgesamt gibt es:

Arithmetische Operatoren: Diese werden verwendet, um mathematische Operationen wie Addition (+), Subtraktion (-), Multiplikation (*), Division (/) und andere auszuführen. (Bonus: Modulo (%), ganzzahlige Division (//), Potenz (**))

Vergleichsoperatoren: Diese werden verwendet, um Werte zu vergleichen, und geben entweder “True” oder “False” zurück. Beispiele sind Gleichheit (==), Ungleichheit (!=), Größer-als (>) und Kleiner-als (<).

Logische Operatoren: Diese werden verwendet, um logische Operationen wie “und” (and), “oder” (or) und “nicht” (not) durchzuführen. Sie sind hilfreich, um Bedingungen zu kombinieren und komplexe Ausdrücke zu erstellen.

Starten Sie nun dafür ein Commandline interface (bspw. Terminal, cmd). Geben Sie python in die commandline ein, um das REPL (Read-Eval-Print Loop) zu starten. Tipp: Um das REPL wieder zu verlassen geben Sie exit() in die Eingabezeile ein.

REPL Erklärung

Read (Lesen): Die REPL wartet darauf, dass Sie Python-Code eingeben.

Eval (Auswerten): Sobald Sie eine Zeile Code eingeben und die Eingabetaste drückst, wertet die REPL diesen Code aus und führt ihn aus.

Print (Ausgabe): Die Ergebnisse der Ausführung des Codes werden dann direkt im Terminal ausgegeben. Das können beispielsweise berechnete Werte, Text oder andere Ausgaben sein.

Loop (Schleife): Danach kehrt die REPL zurück zum Anfang und wartet erneut darauf, dass Sie neuen Code eingeben. Dieser Prozess wiederholt sich so lange, bis Sie die REPL beenden.

In der Praxis bedeutet das, dass Sie Python-Code Zeile für Zeile eingeben können und sofort sehen können, was er bewirkt. Das ist besonders nützlich, um kleine Code-Schnipsel auszuprobieren, mathematische Berechnungen durchzuführen, Daten zu untersuchen oder um einfach nur schnell etwas zu testen, ohne ein ganzes Skript schreiben zu müssen.

REPL im Terminal REPL in Thonny

Ein REPL ist somit eine interaktive Umgebung, die es ermöglicht, Python-Code direkt im Terminal einzugeben und sofort auszuführen. Hier können Sie einfache Befehle ausprobieren und direkt evaluieren.

Erste Knobeleien

Bearbeiten Sie diese Aufgaben zusammen mit Ihrer Gruppe und diskutieren Sie die einzelnen Ausgaben gemeinsam. Schreiben Sie dann Ihre Erkenntnisse als Gruppe in das allgemeine Markdown padlet. Achten Sie auf ordentliche Darstellung und Formatierung. Geben Sie Ihrer Gruppe zudem noch einen Namen.

  • Welche der simplen Datentypen stellen welche Skalenniveaus dar?

  • Welche Datentypen (string, int, float, boolean, None) können wie mit welchen Operatoren (arithmetische, vergleichs und logische) verarbeitet werden? Welche Kombinationen funktionieren gar nicht? Welche dieser Kombinationen geben unerwartete Ausgaben? (testen Sie e.g. int + int, oder string / int, etc.) bspw.:

kilometer = 100.001
name = 'Jacky'
anzahl = 1
paar = 2
Paar = 2 # Konvention ist Kleinschreibung von Variablen - was passiert nun hier?
bool = True
# usw. - denken Sie sich gern noch eigene aus.

# Datentyp von kilometer ausgeben
print(type(kilometer))
# Datentyp on anzahl ausgeben
print(type(anzahl))
# anzahl und kilometer addieren und einer neuen Variable hinzufügen
kilometer_neu = kilometer + anzahl
# Wert ausgeben
print(kilometer_neu)
# Datentyp - was erwarten Sie?
print(type(kilometer_neu))
# Haben sich durch die Addition von anzahl zu kilomter auch diese Variablen geändert? Warum? 

# Versuchen Sie es nun auch mit den anderen Werten und Datentypen und den Operatoren +, -, /, *, %, //, >, <, ==, >=, <=, !=, and, or, not
  • Wie stehen die Operatoren bzgl. des Operatorenvorranges zueinander? -> Probieren Sie es aus! Hat bspw. ‘%’ Vorrang vor ‘+’ oder ‘*’?

  • Frage zum Bonusinhalt der bitweisen Operatoren: Warum ist ‘75 & 90’ gleich 74? Und was/warum ergibt ‘42 & 404’?

Operatorenvorrang bezieht sich auf die Reihenfolge, in der Operatoren in einem Ausdruck ausgewertet werden, basierend auf ihrer Priorität oder Rangordnung. Diese Priorität bestimmt, welche Operation zuerst ausgeführt wird, wenn ein Ausdruck mehrere Operatoren enthält. Beispielsweise gilt auch hier bspw. Multiplikation vor Addition. Notiz: Dies kann wie in der Mathematik durch Klammersetzung beeinflusst werden.

Note: Fragen können zum einen jederzeit gestellt oder am Anfang des offenen Markdown padlets gestellt und formuliert werden.


## Variablen

Es gibt einen weiteren Operator, den **Zuweisungsoperator** Dieser wird verwendet, um Werte Variablen zuzuweisen. Der Zuweisungsoperator (=), weißt somit einem Variablennamen einen Wert zu.

Variablen in Python sind generell gesprochen Platzhalter für Werte, die sich auch im Weiteren verändern können. Sie ermöglichen es, Daten in einem Programm zu speichern und später darauf zuzugreifen, indem man ihren Namen (wieder)verwendet. Eine Variable besteht somit aus einem Namen, der es ermöglicht nach einer ersten Zuweisung auf einen ihr gegebenen Wert zuzugreifen.

### Deklaration, Initialisierung und Zuweisung von Variablen

Variablen in Python werden bei ihrer ersten Einführung deklariert und initialisiert, indem man ihnen einen Namen gibt (Deklaration) und ihnen das erste Mal einen Wert zuweist (Initialisierung). Die Deklaration, Zuweisung eines Datentypes, geschieht in Python automatisch (implizit) und muss nicht extra ausgeführt werden. Zur Initialisierung der Variable, also um der Variable das erste Mal einen Wert zuzuweisen, wird der Zuweisungsoperator `=` verwendet. Hierbei wird der Teil rechts vom `=` dem Teil links zugewiesen. Zuweisung ('Assignement') bezeichnet den Prozess einer Variable einen neuen Wert zuzuweisen, nachdem sie schon mal initialisiert wurde. Dies kann genutzt werden, um der Variable während der Laufzeit einen neuen Wert zuzuweisen.

Beispiel:

```python
# Deklaration und Initialisierung von Variablen
x = 5
y = "Hallo Welt"

In diesem Beispiel werden zwei Variablen deklariert (implizite Zuweisung eines Datentyps) und initialisiert (Zuweisung des Wertes): x und y. x wird der Wert 5 zugewiesen und damit der Datentyp int zugewisen. y wird der Zeichenkette “Hallo Welt” und somit der Datentyp String zugewiesen.

Note: Variablen dürfen keine Leerzeichen enthalten, können nur Buchstaben, Zahlen und den Unterstrich (_) enthalten und dürfen nicht mit einer Zahl beginnen. Zudem werden sie generell immer klein geschrieben (nur Konvention, kein Gebot).

Verwendung von Variablen#

Nachdem eine Variable initialisiert (einem Wert zugewiesen) wurde, kann sie in einem Programm verwendet werden, indem man ihren Namen aufruft.

Beispiel:


a = 5
b = 3
a + b # Ausgabe: 8

print(x)  # Ausgabe: 5
print(y)  # Ausgabe: Hallo Welt

In diesem Beispiel werden die Werte der Variablen x und y mit der Funktion print() ausgegeben. Zu Funktionen kommen wir generell erst in den kommenden Tagen. Für Heute reicht es aus, dass print() eine Möglichkeit darstellt, um Informationen auszugeben - sozusagen, auf die Ausgabe zu drucken.

Warning

Wichtig!

Nutzen Sie keine schon in Python definierten key words als Variablennamen.

Wenn Sie eine noch nicht initialisierte Variable aufrufen werden Sie in einen Error bekommen. Dieser sieht in etwa so aus:

spass_am_programmieren  # try to access an undefined variable
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
NameError: name 'spass_am_programmieren' is not defined

Hier (im REPL) wurde versucht auf die Variable ‘spass_am_programmieren’ zuzugreifen, ohne, dass sie zuvor initialisiert wurde. Die anschließende Nachricht, der Traceback zeigt Ihnen nun eine detaillierte Ausgabe in welcher Datei und in welchem Modul der Error vorkam, auch ‘geworfen’ gennant, wurde. Im Beispiel wurde im File , was die Standardeingabe bedeutet, in Zeile 1 der Fehler lokalisiert. Der Fehler wird dann, wenn möglich, weiter spezifiziert um eine Ursachenfindung zu vereinfachen. Hier erfahren wir nun, dass der Error ein NameError ist. Somit ist schon mal klar, dass es sich um einen Fehler in einer Namensgebung handelt. Im Weiteren können wir dann lesen, dass der Name not defined ist. D.h. Dieser Name wurde im vorherigen Verlauf des Programmes nicht initialisiert. Wenn wir somit bspw. einen Boolean mit spass_am_programmieren = True definieren, würden wir diesen Fehler beheben.

Im oberen Fall sehen Sie auch ein Beispiel für einen längeren Variablennamen. Namen für Variablen sollten im Generellen so kurz wie möglich aber so lang wie nötig sein und mit Unterstrichen (_) verbunden sein.

Dynamische Typisierung#

Python ist dynamisch typisiert, was bedeutet, dass Variablen automatisch den Datentypen ihrer zugewiesenen Werte entsprechen (-> Deklaration passiert automatisch). Dieser kann im Verlauf auch wieder geändert werden. Das ist bspw. in Java so einfach nicht möglich (explizite Deklaration notwendig).

Beispiel:

# Dynamische Typisierung
x = 5      # x ist vom Typ int (Ganzzahl)
y = "hi" # y ist vom Typ str (Zeichenkette)

# Was passiert jeweils bei:
x + y
x * y
x = y
x + y

und:

a = 1
b = 2
c = 3

a = c
b = a
a + b + c # welchen Wert haben jeweils a,b, und c und wie ist die insgesamte Ausgabe?

In diesem Beispiel ändert sich der Datentyp der Variablen x und y je nachdem, welcher Wert ihnen zugewiesen werden. Variablen in Python ermöglichen somit eine flexible Handhabung von Daten und sind ein grundlegendes Konzept in der Programmierung. Den Datentyp einer Variable kann mit type(x) rausgefunden werden.

Weitere Tüfteleien

  1. Temperatur umrechnen

Temperatur von Celcsius zu Fahrenheit und zurück.

Koordinaten umrechnen (?)

Weiterführende Fragen#

Wenn Sie die bisherigen Inhalte alle verstanden haben und damit umgehen können, können Sie sich in diesem Abschnitt in die genannten Thematik weiter vertiefen. Diese Themen sind für jetzt optional und werden teilweise in den kommenden Tagen noch angeschnitten.

  • Was bedeutet es wenn Datentypen mutable oder unmutable sind? Wie kann das praktisch getestet werden?

  • Es gibt noch weitere Operatoren wie bspw. +=, -=, *=, /=, %= und in und not in. Was tun diese und wozu sind sie nützlich?

  • Wie können Sie mit den Operatoren in und not in überprüfen, ob ein String in einem anderen String enthalten ist? Bspw. ob ‘geo’ in ‘Geodaten’ enthalten ist - worauf ist zu achten?.

  • Worin liegt der Unterschied zwischen dynamischer und statischer Typisierung? Was sind die Vor- und Nachtteile?

  • Wie kann ich eine Variable mit einem bestimmten Datentyp zu einem anderen Datentyp casten? Worauf ist zu achten?