In diesem Kapitel lernen Sie, mit Python einfache mathematische Fragestellungen zu beantworten und die Ergebnisse in Variablen zu speichern. Außerdem lernen wir einige weitere Grundlagen kennen.
Am Ende können Sie:
- Grundrechenarten, Potenzieren und Ganzzahldivision in Python anwenden.
- Zahlen in andere Zahlensysteme umrechnen.
- Die Grundlagen von Datentypen in Python verstehen.
- Ergebnisse in Variablen speichern.
- Eingaben vom Benutzer entgegennehmen und Ausgaben auf dem Bildschirm ausgeben.
Ab diesem Teil des Kurses sollten Sie ihre eigene Programmierumgebung eingerichtet haben. Am Ende von @lialink(Kapitel 1: Einführung) finden Sie dazu Hinweise.
Für einen Gesamtüberblick über den Kurs geht es @lialink(hier zurück zur Kursübersicht).
Wie der Name Computer – oder auf Deutsch Rechner – zeigt, ist das Beantworten arithmetischer Fragestellungen eine Grundfunktion aller Computer. So kann auch Python Rechenaufgaben für uns lösen.
Hier stellen wir Python die Rechenaufgabe
2+12*2
@Pyodide.eval
Den Python Code in diesem Kurs können Sie direkt in Ihrem Browser ausführen, in dem Sie auf den mit </>
beschrifteten Knopf drücken. Die "Antwort" von Python erscheint dann direkt darunter.
Sie können den Code auch verändern, korrigieren oder damit herumexperimentieren.
Rechts unten haben Sie die Möglichkeit, mit den Pfeilen zu den vorherigen Versionen des Codes zurückzukehren.
Dieser Code gibt uns das Ergebnis für
Man bezeichnet nun 2+12*2
als einen Ausdruck der Programmiersprache Python. Das bedeutet, dass Python es interpretieren und auswerten kann.
Wie man sieht, verwendet Python Operatoren, spezielle Symbole für die Grundrechenarten. In diesem Beispiel steht der Operator +
für die Addition und der Operator *
für die Multiplikation.
In Python gilt wie in der Mathematik, dass Multiplikation und Division Vorrang vor Addition und Subtraktion haben. Deshalb erhalten wir hier
(2+12)*2
@Pyodide.eval
Dieser Ausdruck entspricht nun
Natürlich können wir auch subtrahieren und dividieren:
5-4/2
@Pyodide.eval
Hier steht -
für die Substraktion und /
für die Division.
Sie lesen den Wetterbericht für New York:
In den USA wird die Temperatur in Fahrenheit gemessen. Man rechnet von Celsius nach Fahrenheit mit folgender Formel um:
Setzen Sie diese Formel in Python um, und berechnen Sie so, wie warm es in New York ist (gerundet auf zwei Nachkommastellen):
[[23.33]]
round((5/9)*(74-32),2)
@Pyodide.eval
@pyconsole
+
|\
| \
| \
a| \c
| \
+-----+
b
Links sehen Sie die Skizze eines rechtwinkligen Dreiecks mit den Seiten
Ein rechtwinkliges Dreieck hat die Kathetenlängen
[[1305]]
[[?]] Der Satz des Pythagoras ist
eine einzeilige Lösung in Python könnte so aussehen:
(900**2 + 945**2)**0.5
@pyconsole
Verschiedene Typen von Daten werden in einem Computer unterschiedlich gespeichert. Während man in sogenannten statischen Programmiersprachen den jeweiligen Datentyp als Programmierer selbst festlegt, wählt Python als dynamische Programmiersprache1 einen passenden Typ selbst aus.
Welchen Datentyp ein Ausdruck hat, lässt sich durch die Funktion type()
herausfinden. Wir erhalten als Antwort den Datentyp des Ausdrucks, der sich zwischen den Klammern befindet.
type()
ist eine in Python eingebaute Funktion 2. Wir übergeben ihr einen Ausdruck und erhalten dann einen Rückgabewert.
type(20)
@Pyodide.eval
Der Wert 20
hat die Klasse int
, das steht für Englisch integer, also ganze Zahlen.
Das Ergebnis einer Division ist nicht unbedingt eine ganze Zahl, weshalb auch das Resultat einer Division in Python von einem anderen Typ ist:
type(5-4/2)
@Pyodide.eval
Das Ergebnis der Division ist also von der Klasse float
; kurz für Fließkommazahl.
Selbst wenn das Ergebnis als int
dargestellt werden könnte, erhalten wir hier eine solche Fließkommazahl zurück.
Sie werden bald noch viele weitere Datentypen kennenlernen. Probieren Sie doch einmal die Funktion type
mit verschiedenen Ausdrücken aus. Können Sie neue Datentypen finden?3
Schreiben wir in Python eine Zahl mit Dezimalpunkt, versteht Python sie automatisch als Fließkommazahl.
type(2.0 + 3)
@Pyodide.eval
Beachten Sie, dass Python einen Punkt als Dezimaltrennzeichen verwendet und nicht wie im Deutschen üblich ein Komma.
Rechnen wir mit Fließkommazahlen, können überraschende Ergebnisse auftreten:
0.1 + 0.2
@Pyodide.eval
Auch wenn hier nur eine kleine Abweichung vom richtigen Ergebnis 0.3 auftritt, können solche Fehler zu Problemen führen. Bei der Nutzung von Fließkommazahlen sollten ihre Beschränkungen immer mit bedacht werden.
Eine nützliche Funktion in Python ist round()
, die eine Fließkommazahl auf eine bestimmte Anzahl von Dezimalstellen rundet:
round(0.1 + 0.2, 2)
@Pyodide.eval
Wir übergeben hier zuerst die Fließkommazahl, die wir runden wollen und dann die Anzahl der Dezimalstellen, auf die gerundet werden soll. Diese Funktion nimmt also zwei Argumente, die durch Komma getrennt werden.
Was passiert wenn Sie die Funktion round
mit nur einem Argument aufrufen?
- [[ ]] Sie rundet auf die nächste ganze Zahl ab.
- [[X]] Sie rundet auf die nächste ganze Zahl auf oder ab.
- [[ ]] Sie rundet auf die nächste ganze Zahl auf.
- [[ ]] Es gibt einen Fehler.
Python erlaubt es auch, Fließkommazahlen in wissenschaftlicher Notation zur Basis 10 anzugeben. Die Avogadro-Konstante1
6.02214076e23
9e-31
Man schreibt also zunächst die sogenannte Mantisse2, dann ein e gefolgt vom Exponenten zur Basis 10.
Neben den Operatoren für die Grundrechenarten bietet Python noch weitere Operatoren an. Potenzieren können wir mit **
.
So ist
2**8
@Pyodide.eval
Das Potenzieren hat Vorrang vor den Grundrechenarten, so erhalten wir:
2**3*2
@Pyodide.eval
Also korrekt
Dividieren wir ganze Zahlen, können wir das Ergebnis immer als einen ganzzahligen Quotient und einen ganzzahligen Rest schreiben.
Zum Beispiel ist bei
In Python erhalten wir den ganzzahligen Quotienten mit dem Operator //
:
10 // 3
@Pyodide.eval
Wir überprüfen mit der Funktion type()
, dass es sich tatsächlich um ein ganzzahliges Ergebnis (vom Typ int
) handelt:
type(10 // 3)
@Pyodide.eval
Den Rest bei der ganzzahligen Division erhält man mit dem Modulo-Operator %
:
10 % 3
@Pyodide.eval
Asymmetrische Verschlüsselung benutzt einen öffentlichen Schlüssel um Nachrichten an eine Person zu verschlüsseln, die diese dann mit einem privaten Schlüssel entschlüsseln kann.
Als einfaches Beispiel kann man
Verschlüsselt wird dann nach der Formel
Verwenden Sie Python um die folgenden Aufgaben zu lösen:
Verschlüsseln Sie die Nachricht
[[855]]
[[?]] Versuchen Sie die obige Formel in Python umzusetzen.
[[?]] Der Modulo-Operator in Python ist %
.
nach der obigen Formel setzen wir einfach ein:
123**17 % 3233
so erhalten wir
Entschlüsseln Sie die codierte Nachricht
[[377]]
wir setzen ein:
2573**2753 % 3233
so erhalten wir
@pyconsole 2
Python erlaubt uns nicht nur einfache Berechnungen im Dezimalsystem, es hilft uns auch, gebräuchliche Zahlensysteme zu verwenden.
Beginnt man eine Zahl mit den Zeichen 0b
, wird sie von Python als Binärzahl verstanden. So ist 0b10
eine andere Schreibweise für
0b10101
@Pyodide.eval
Das Ergebnis erhalten wir immer als Dezimalzahl. Die Funktion bin()
gibt eine Zahl als Binärzahl zurück.
So kann man auch das Ergebnis der Rechnung $$ 11011_2 + 101_2$$ als Binärzahl ausgeben:
bin(0b11011+0b101)
@Pyodide.eval
Auf gleiche Weise kann man in Python auch mit Oktalzahlen und Hexadezimalzahlen rechnen.
Eine Oktalzahl beginnt mit den Zeichen 0o
und die Funktion oct()
stellt einen Ausdruck als Oktalzahl dar.
Hexadezimalzahlen beginnen mit den Zeichen 0x
und die dazugehörige Funktion ist hex()
Was ist die Summe der Oktalzahl
[[6789]]
@pyconsole
So wie wir in der Mathematik Variablen nutzen, denen wir Werte zuweisen können, verwendet auch ein Computerprogramm Variablen. Variablen sind in der Informatik nichts anderes als benannte Speicherplätze für Werte. Mit dem Operator = für die sogenannte Zuweisung können wir eine neue Variable einführen:
x = 5
x + 2
@Pyodide.eval
Variablennamen können Zahlen, Buchstaben und den Unterstrich _ enthalten. Sie dürfen aber nicht mit einer Zahl beginnen.
Folgende Variablennamen sind gültig:
vorname
vorname2
mein_Alter
WARNUNGSTEXT
_temp
Folgende Variablennamen sind aber ungültig:
27_feld
WARNUNG!
name-2
$alter
Welche der folgenden Variablennamen sind gültig?
[[x]] __intern__
[[ ]] 20%discount
[[x]] Größe
[[x]] _
[[x]] m5L2K3
[[ ]] first.name
Ab Python Version 3.0 ist es möglich, Schriftzeichen nicht-englischer Sprachen zu verwenden. So kann 姓名, радиус oder π als Variable verwendet werden.
Auch wenn kurze Variablennamen praktisch sein können, sollte man als Programmierer darauf achten, dass die Variablennamen informativ sind.
Diese beiden Codebeispiele machen das gleiche, das auf der linken Seite ist aber für einen Menschen leichter zu verstehen:
betrag_euro = 20
wechselkurs = 1.1
betrag_dollar = betrag_euro * wechselkurs
e = 20
k = 1.1
d = e * k
In allen bisherigen Beispielen haben wir Python direkt die Ausdrücke gegeben, die es auswerten sollte. Im Normalfall schreibt man aber Programme, die mit dem Benutzer interagieren.
Dafür müssen wir Python dazu bringen, Eingaben vom Benutzer entgegenzunehmen und Ausgaben auf dem Bildschirm auszugeben.
Wir beginnen mit einem einfachen Beispiel, das den Benutzer nach seinem Namen fragt und ihn dann begrüßt:
name = input()
print("Hallo", name)
@Pyodide.eval1
Der Befehl input()
wartet auf eine Eingabe des Benutzers und gibt diese als Zeichenkette zurück. Optional kann als Argument auch ein Text angegeben werden, der als Eingabeaufforderung angezeigt wird.
Der Befehl print()
gibt die Argumente auf dem Bildschirm aus. Er nimmt beliebig viele Argumente und gibt diese durch Leerzeichen getrennt aus.
In Python werden Zeichenketten oder Strings2 in Anführungszeichen geschrieben. Man kann entweder einfache Anführungszeichen '
oder doppelte Anführungszeichen "
verwenden. Strings die von drei Anführungszeichen begrenzt werden, können auch Zeilenumbrüche enthalten.
Aber auch in normalen Zeichenketten kann man durch die Sequenz3 \n
einen Zeilenumbruch erzeugen.
Hier ein paar Beispiele für gültige Strings:
"Das ist ein String"
'Das ist auch ein String'
'Man kann die jeweils "anderen" Anführungszeichen in einem String verwenden'
"""Das ist ein String, der
über mehrere
Zeilen
geht"""
"Auch dieser String\nenthält einen Zeilenumbruch"
Es gibt noch zahlreiche spezielle Schreibweisen für Strings, die Sie später kennenlernen werden. Für einfache Ein- und Ausgabe reichen diese aus.
Im letzten Abschnitt haben wir Euro in Dollar umgerechnet, sehr viel mehr Sinn macht ein Programm, das den Benutzer nach dem Betrag in Euro fragt und dann den Betrag in Dollar ausgibt.
eingabe = input()
betrag_euro = float(eingabe)
wechselkurs = 1.1
betrag_dollar = round(betrag_euro * wechselkurs, 2)
print("Der Betrag in Dollar ist:", betrag_dollar)
@Pyodide.eval
Dieses Codebeispiel verwendet die bereits bekannten Befehle input()
und print()
für die Ein- und Ausgabe.
float()
verwenden wir hier um den eingegebenen Wert in eine Fließkommazahl umzuwandeln4. Da input()
immer eine Zeichenkette zurückgibt, müssen wir den Wert umwandeln, um damit rechnen zu können.
Auch runden wir das Ergebnis auf zwei Dezimalstellen, wie das bei Währungen üblich ist.
Jede Zeile in Python, die mit einem #
beginnt, wird von Python ignoriert. Diese Zeilen werden als Kommentare bezeichnet und dienen dazu, den Code zu dokumentieren.
Das Programm aus dem letzten Abschnitt könnte auch so aussehen:
# lese die Eingabe des Benutzers als String ein
eingabe = input()
# konvertiere den String in eine Fließkommazahl
betrag_euro = float(eingabe)
# setze den Wechselkurs
wechselkurs = 1.1
# berechne den Betrag in Dollar und runde auf zwei Stellen
betrag_dollar = round(betrag_euro * wechselkurs, 2)
# gebe den Betrag in Dollar aus
print("Der Betrag in Dollar ist:", betrag_dollar)
Der Code ist für Python völlig gleichwertig zu der Version ohne Kommentare, aber die Kommentare sind nützlich, um den Code zu dokumentieren und ihn damit anderen Programmierern zu erklären.
Dennoch ist Code, der so verständlich ist, dass er sich selbst erklärt, besser als Code, der viele Kommentare benötigt. Bevorzugen Sie im Zweifelsfall also immer sprechende Variablennamen und klare Strukturen.
Wie lautet das Ergebnis der folgenden Ausdrücke und von welchem Typ ist das Ergebnis?
(13 % 3) * 2
ergibt [[0|1|(2)|4]] und ist vom Typ [[(int)|float]]2 * 0b100
ergibt [[1|2|4|(8)|200]] und ist vom Typ [[(int)|float]]4 * float("2.5")
ergibt [[0|4|(10)|20]] und ist vom Typ [[int|(float)]]1 + 2 * 3/2
ergibt [[2|(4)|4.5|9]] und ist vom Typ [[int|(float)]]
x = 2
y = x * 2
z = 1
z = z + 1
x = y + z
print (x+y)
Welchen Wert gibt das Programm aus? (versuchen Sie die Aufgabe im Kopf zu lösen!)
[[6|7|8|9|(10)]]
Am Ende des Programms ist x=6
, y=4
und z=2
. Das Programm gibt also
Titrationsrechner✍1
Bei einer Titration wird die Konzentration einer unbekannten Lösung bestimmt, indem man eine Lösung bekannter Konzentration (Titrant) in kleinen Mengen zu der unbekannten Lösung gibt, bis z.B. ein Indikator umschlägt.
Es gilt die Formel
Schreiben Sie ein Programm, das die Konzentration der unbekannten Lösung berechnet.
Volumen der unbekannten Lösung, sowie Konzentration und Volumen des Titranten sollen vom Benutzer eingegeben werden.
Eine Gleichung der Form
Schreiben Sie ein Programm, das die Lösungen einer quadratischen Gleichung berechnet. Die Koeffizienten
Footnotes
-
Java, C, C++ und Pascal sind Beispiele für statische Programmiersprachen. Python, Javascript, PHP und Lua sind dynamisch. ↩ ↩2 ↩3 ↩4 ↩5
-
Später werden Sie auch lernen, eigene Funktionen zu programmieren. ↩ ↩2 ↩3 ↩4
-
Was ist
type("Hallo")
? Und wastype(int)
odertype(bin)
? Können Sie sich die Ergebnisse erklären? ↩ ↩2 -
auf ähnliche Weise können Sie auch
int()
verwenden, um eine Zeichenkette in eine ganze Zahl umzuwandeln, oder umgekehrt mitstr()
eine Zahl in eine Zeichenkette. ↩