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 zu 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 Gruppp

  • oder uns zu wenden. Probieren Sie die Dinge ernsthaft aus, 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:

  • 9:00: Start mit kurzem Input

  • 9:30: 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 quelloffene, objekt-orientierte höhere Programmiersprache und wird häufig auch als Scripting-Sprache bezeichnet. Python wurde Ende der 1980er von Guido van Rossum entwickelt und ist bis heute eine der wichtigsten und am weitesten verbreiteten Programmiersprachen.

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

Das höher bezieht sich auf die Nähe zur Hardware, den physischen Teilen eines PCs. Sprachen wie beispielsweise C++ oder Java sind etwas näher an der Hardware als höhere Sprachen wie Python. Diese sind näher an unserer natürlichen Sprache und damit etwas 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. Der geschriebene Code wird also Zeile für Zeile während der Ausführung eines Programms interpretiert. Es gibt somit keine vorrangehende notwendige Kompilerung.

FEHLER SIND OKAY!

Programme stürzen ab, wenn sie Code enthalten, den der Computer nicht interpretieren kann (was leider häufig der Fall ist), was dazu führt, dass Python eine Fehlermeldung anzeigt. Fehlermeldungen machen Ihren Computer aber nicht kaputt, sondern gehören zum Alltag beim Programmieren. Haben Sie also 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 int - Ganzzahlen wie 1,2,3, …

  • Floats float - Kommazahlen wie 3.14, 4.59836532, …

  • Strings string - Zeichenketten, also Buchstaben und Wörter

  • Boolean bool - Wahrhheitswerte, also True und False

  • None None - also nichts

Später kommen dann komplexe, zusammengesetzte Datentypen hinzu, etwas:

  • list - Listen, auch als Arrays bekannt

  • dict - Dictionary, also sog. Key-Value-Stores

  • tupel - Tupel von werten,

  • datetime zur Verarbeitung von Datums-Angaben

Letztlich sind diese Datentypen quasi 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. Somit sind, wie bei den unterliegenden Skalenniveaus, nicht alle Datentypen mit allen anderen Datentypen 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.

Praxis#

Starten Sie nun ein Commandline-Interface (bspw. Terminal, cmd oder die Windows PowerShell). Geben Sie python in die Commandline ein, um die Python-REPL (Read-Eval-Print Loop) zu starten. Tipp: Um die REPL wieder zu verlassen geben Sie exit() in die Eingabezeile ein.

Ein REPL ist 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, vergleichende und logische) verarbeitet werden? Welche Kombinationen funktionieren gar nicht? Welche dieser Kombinationen geben unerwartete Ausgaben? (testen Sie zum Beispiel int + int oder string / int usw.)

Das könnte dann zum Beispiel so aussehen:

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
type(kilometer)
# Datentyp on anzahl ausgeben
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?
type(kilometer_neu)
# Haben sich durch die Addition von anzahl zu kilometer 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. Dies kann wie in der Mathematik durch Klammersetzung beeinflusst werden.

Anmerkung

Fragen können zum einen jederzeit gestellt oder in den Anfang des offenen Markdown-Padlets getippt werden.

Variablen#

Es gibt in Python einen weiteren, sehr zentralen Operator: den Zuweisungsoperator.

Dieser wird verwendet, um Variablen Werte zuzuweisen:

flavour = "vanilla"

Der Zuweisungsoperator (=) weist einem Variablennamen (hier flavour) einen Wert (hier der String vanilla) 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 also 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:

# 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.

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.

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 sogenannte Stacktrace zeigt Ihnen nun detaillierte Information darüber, in welcher Datei und in welchem Modul der Error vorkam (geworfen wurde). Im Beispiel wurde im File <stdin>, 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 der Namensgebung handelt. Im Weiteren können wir dann lesen, dass der Name not defined ist. 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 (_) oder Grossbuchstaben (z.B. spassAmProgrammieren) verbunden sein.

Dynamische Typisierung#

Die Tatsache, dass Variablen automatisch den Datentypen des ihnen zugewiesenen Werts annehmen, dass also die Deklaration automatisch passiert, bezeichnet man als dynamische Typisierung. Python ist dynamisch typisiert, andere Sprachen wie etwa Java oder C++ nicht. Ein Variablentyp kann im Verlauf eines Programms auch geändert werden. Das ist bspw. in Java so einfach nicht möglich (explizite Deklaration notwendig).

Beispiel:

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


# 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. Zuweisungen wie n = 42 funktionieren. Was ist mit 42 = n?

  2. Kann man mehrere Sachen gleichzeitig zuweisen? Etwa x = y = 1

  3. In der Mathematik kann man x und y mit xy multiplizieren. Geht das in Python auch?

  4. Nutzen Sie Python als Taschenrechner.
    Eine Kugel mit Radius \(r\) hat Volumen \(\frac{4}{3}\pi r^3\). Welches Volumen hat eine Kugel mit Radius 5?
    Eine Temperatur von \(x\) Fahrenheit entspricht einer Temperatur von \(\frac{5}{9}(x-32)\) Grad Celsius. Bei wieviel Fahrenheit kocht Wasser?