Programme mit Benutzerinput

Block 6

In der ersten Hälfte dieses Kurses hast du gelernt, wie du mit Python Grafiken erstellen und Rechnungen lösen kannst. In der zweiten Hälfte wenden wir uns nun komplexeren Programmen zu. Mit den Funktionen im letzten Block, haben wir bereits erste Schritte in diese Richtung unternommen.

Input

Als Erstes möchten wir unseren Programmen Input übergeben können. Kopiere folgende Zeile in eine Python-Shell.

my_var = input("Eingabe: ")

Wenn du sie ausführst verlangt Python von dir eine Eingabe und speichert diese dann in die Variable my_var. Teste verschiedene Eingaben, Text, Integer, Floats, und schau dir danach jeweils my_var an.

An den '' siehst du, dass die Eingabe immer als String gespeichert wird.

Aufgabe 1

Erstelle eine Kopie deines "Hallo Welt"-Skripts. Passe dein neues Skript so an, dass es den Benutzer zuerst nach seinem Namen fragt und ihn dann begrüsst.

Lösung anzeigen

name = input("Wie heisst du? ") print("Hallo", name)

Zahlen einlesen

Meist möchtest du wohl nicht Text sondern Zahlen einlesen. Das klappt, indem du mit input einen String einliest und diesen anschliessend in eine Zahl umwandelst

my_var = input("Kommazahl: ") f = float(my_var) # oder in einem Schritt my_var = int(input("Ganzzahl: "))

Aufgabe 2

Erstelle ein Programm, das zwei Zahlen einliest und ihre Summe und Differenz ausgibt.

Lösung anzeigen

a = float(input(" a = ")) b = float(input(" b = ")) print("a+b =", a+b) print("a-b =", a-b)

Fehler

Test dein Programm mit verschiedenen Inputs, auch mit Buchstaben. Wenn Python deine Eingabe nicht wie gewünscht umwandeln kann, stürzt dein Programm mit einem Fehler ab.

ValueError: could not convert string to float

Das sollte nicht so sein. Du kannst nie davon ausgehen, dass der Benutzer sich so verhält wie er sollte. Du solltest dein Code so absichern, dass es bei einer unerwarteten Eingabe nicht einfach abstürzt. Dafür kannst du einen try-except-Block verwenden.

import sys try: my_var = float(input("Eingabe: ")) except ValueError: sys.exit() print(my_var)

Du siehst die Struktur eines try-except-Blockes. Der Block beginnt mit try: und endet mit except ErrorType:. Dazwischen ist der Block mit den Code-Zeilen, die einen Error vom Typ ErrorType verursachen könnten. In unserem Fall könnte bei der Umwandlung von String zu Float ein ValueError ausgelöst werden. Nach der except-Zeile folgt ein Block mit den Anweisung für den Fall, dass der Fehler auftritt. Wir verwenden hier die exit() Funktion aus dem sys-Modul um das Programm einfach zu beenden.

Wie bei den Funktionen sind die Code-Blöcke auch hier eingerückt. Im Beispiel wird print(my_var) deshalb nur ausgeführt, wenn kein ValueError aufgetreten ist. Ich empfehle dir immer vier Leerschläge fürs Einrücken zu verwenden.

Hinweis: Welchen ErrorType du abfangen musst, bestimmst du am Einfachsten in dem du den Fehler absichtlich provozierst und dann die Fehlermeldung anschaust.

Aufgabe 3

Passe dein Programm aus der letzten Aufgabe so an, dass der Input abgesichert ist. Gib im Falle eines Fehlers eine nützliche Fehlermeldung aus. Ergänze die Ausgabe ausserdem um Produkt und Quotient. (Achtung: Kümmere dich um die neue Fehler-Quelle.)

Lösung anzeigen

import sys try: a = float(input(" a = ")) b = float(input(" b = ")) except ValueError: print("Fehler: Keine Zahl eingegeben.") sys.exit() print("a+b =", a+b) print("a-b =", a-b) print("a*b =", a*b) try: print("a/b =", a/b) except ZeroDivisionError: print("Fehler: Division durch 0")

if else

Im letzten Abschnitt hast du gesehen, wie der Programmablauf durch Fehler gesteuert werden kann. Doch oft ist es nützlich den Programmablauf ganz allgemein von Bedingungen abhängig zu machen. Dafür gibt es if. Dieser Befehl erzeugt einen Code-Block, der nur ausgeführt wird, wenn eine Bedingungen erfüllt ist. Im folgenden Beispiel fragen wir den Nutzer auch nach der gewünschten Operation und rechnen dann nur das entsprechende Resultat aus.

import sys try: a = float(input(" a = ")) b = float(input(" b = ")) except ValueError: print("Fehler: Keine Zahl eingegeben.") sys.exit() op = input("Operator (+, -): ") if op == "+": print("a+b =", a+b) if op == "-": print("a-b =", a-b)

Die Addition wird also nur ausgeführt, wenn der Benutzer + eingegeben hat. In diesem Fall ist der Wert von op gleich + und damit die Bedingung op == "+" wahr. Die Bedingung op == "-" ist dann natürlich falsch und die Subtraktion wird deshalb nicht ausgeführt.

Wahr und falsch werden in Python durch die Werte True und False ausgedrückt. Du kannst diese Werte auch Variablen zuordnen

a = True b = op == "+"

oder auch direkt mit if verwenden

if True: print("Wahr")

Letzteres ist aber wohl nur in Spezialfällen sinnvoll.

In unserem Beispiel oben testen wir zwei Mal ob eine Bedingung zutrifft. Falls nicht, überspringen wir den Code-Block und setzen das Programm einfach danach fort. Mit else können wir aber auch einen Code-Block definieren der Ausgeführt wird wenn die Bedingung falsch ist. Schliesslich erlaubt elif (else if) eine weitere Bedingung zu testen.

import sys try: a = float(input(" a = ")) except ValueError: sys.exit() if (a > 0): print('positiv') elif (a == 0): print('null') else: print('negativ') print("Tschüss und bis zum nächsten Mal")

Für if und elif kannst du alle Ausdrücke verwenden die sich zu True oder False vereinfachen lassen. Vergleichsoperatoren sind uns bereits bei der where-Funktion für Arrays begegnet. Wie du oben gesehen hast, kannst du nicht nur Zahlen sondern auch Strings oder allgemein Objekte vergleichen. Ausserdem kannst du mehrere Dinge gleichzeitig testen, indem du die einzelnen Tests mit and oder or verknüpfst.
if (a == 1) and (b == 2):

Aufgabe 4

Passe dein "Hallo"-Programm so an, dass es nach Namen und Geschlecht (m,M,f,F) fragt und dann je nach Eingabe passen grüsst.

Lösung anzeigen

name = input("Wie heisst du?\n") sex = input("Was ist dein Geschlecht (m,f)?\n") if (sex == "m") or (sex == "M"): print("Lieber", name) elif (sex == "f") or (sex == "F"): print("Liebe", name) else: print("Hallo", name)

Strings

In den letzten Beispielen haben wir immer wieder mit Strings gearbeitet. Wie alles in Python sind auch Strings Objekte. Stringobjekte haben sehr viele nützliche Methoden und verhalten sich ähnlich wie Listen.

s = "hallo welt" print(s.title()) print(s[0:5].upper())

Aufgabe 5

Schau dir die Hilfe zu Strings an (pydoc3 "STRINGMETHODS" oder help("STRINGMETHODS")). Verwende dein neues Wissen dann, um die Geschlechtskontrolle im Programm der letzten Aufgabe anzupassen. Das Programm soll jedes Wort das mit einem m (oder M) beginnt als Männlich interpretieren (und analog für f und F).

Lösung anzeigen

name = input("Wie heisst du?\n") sex = input("Was ist dein Geschlecht?\n") if sex[0].lower() == "m": print("Lieber", name) elif sex[0].lower() == "f": print("Liebe", name) else: print("Hallo", name)

Aufgaben zur Vertiefung

Vektorrechnung

Schreibe ein Programm, dass zwei Vektoren mit 3 Komponenten einliest und dann folgende Grössen berechnet.

Verwende dabei die Funktionen aus dem letzten Block und definiere wo nötig weitere Funktionen.

Was ist True

Definiere die folgenden Variablen: a = -1, b = 2, c = 0, d = "2", foo="foo". Kontrolliere nun welche der folgenden Bedingungen als True ausgewertet wird, indem du jeweils einen if-Block schreibst.

Quiz

Implementiere folgende Quiz-Frage in einem Programm.

Wann war der erste Mensch auf dem Mond?

Eine mögliche Programmstruktur ist:

  1. Frage nach dem Jahr 19[00...99].
  2. Frage nach dem Monat [1..12].
  3. Frage nach dem Tag [1..31].
  4. Kontrolliere, ob die Antworten richtig oder falsch sind.
  5. Gib das Ergebnis aus.

(Lösung der Quiz-Frage: 20. Juli 1969)

Quiz 2

Überlege dir andere Quiz-Fragen und implementiere sie.