Читать книгу Python. Der Sprachkurs für Einsteiger und Individualisten - Willemer Arnold V., Arnold V. Willemer - Страница 6

Kapitel 3 Speicherwerke für Rechenkünstler

Оглавление

Inhalt

• In Variablen merkt sich das Programm seine Werte.

• Variablen haben Namen

• Variablen speichern Zahlen und Zeichenketten

Die ersten Vorläufer der Computer wurden erschaffen, weil die Menschen zu faul waren, selbst zu rechnen. Python steht durchaus in dieser Tradition, kann aber noch einiges mehr, als nur schnell zu rechnen.

Wie ein guter Taschenrechner hat auch Python Speicherplätze. Das Programm kann sich Zahlen in Variablen merken. Und das Tollste ist: Sie müssen sich nicht merken, was Sie in M1, M2 und anderen kryptischen Speichern abgelegt haben, sondern Sie können den Variablen eigene Namen geben, die etwas darüber aussagen, was Sie hineinstecken wollen. Das sollten Sie nutzen!

Spicker

Ein Variablenname wird aus Buchstaben, Ziffern und Unterstrichen zusammengesetzt. Allerdings darf der Name nicht mit einer Ziffer beginnen. Groß- und Kleinschreibung ist bei den Variablennamen signifikant. Bei den Variablen MWSt und MWST handelt es sich um zwei unterschiedliche Variablen.

In Variablen können beispielsweise Zahlen oder Zeichenketten gespeichert werden. Die Art der Werte bezeichnet man als Typ. Welchen Typ eine Variable hat, ob sie also Zahlen oder Texte verarbeitet, bestimmt Python ganz pragmatisch danach, was das Programm hineinsteckt. Dieses Hineinstecken nennt der Programmierer zuweisen. Und die Bildung des Typs durch Zuweisung nennt der Python-ProgrammiererDuck-Typing.

Eine Zuweisung hat auf der linken Seite eine Variable. Es folgt ein Gleichheitszeichen als Operator der Zuweisung. Auf der rechten Seite des Gleichheitszeichens steht eine Zahl oder eine Berechnung. Der Informatiker nennt alles rechts vom Gleichheitszeichen einer Zuweisung einen Ausdruck. Im folgenden Beispiel ist der Ausdruck einfach eine 19.

MWSt = 19

Die Variable MWSt enthält anschließend den Wert 19 und hat einen ganzzahligen Typ. Intern nennt Python diesen Typ int.

Python schreibt vor, dass eine Variable durch eine Zuweisung definiert worden sein muss, bevor sie ausgewertet werden darf. Es wäre ja auch blöd, mit einem Inhalt zu arbeiten, der gar nicht da ist. Dadurch fallen aber auch manchmal Vertipper auf. Der Versuch, nach der obigen Zuweisung auf die Variable MWST zuzugreifen, führt zu einem Programmabbruch, weil deren Name ein großes T hat und ihr also noch kein Wert zugewiesen wurde.

3.1 Verschiedene Zahlen

Python kennt grundsätzlich zwei Arten von Zahlen. Das eine sind die ganzen Zahlen und das andere die kaputten. Die kaputten Zahlen werden in der Mathematik auch Brüche genannt. Für die Darstellung verwenden wir allerdings selten Brüche, sondern Nachkommastellen. Nachkommastellen sind aber eigentlich Brüche mit einem Nenner, der sich aus einer Potenz von 10 ergibt.

Hinweis

Wenn es ganz genau sein muss, gibt es in Python auch noch ein Paket, das dem Computer beibringt, mit Dezimalbrüchen zu rechnen. In Abschnitt 13.3 erfahren Sie mehr.

Wenn Programmierer einfach eine Zahl in einem Programm eingeben, sprechen sie übrigens von einem Literal.

Darstellung einer Fließkommazahl

Eine Fließkommazahl beginnt ganz harmlos wie jede normale ganze Zahl. Vielleicht mit einem Vorzeichen, dann einige Ziffern. Dann tritt ein Punkt auf und alle folgenden Ziffern sind Nachkommastellen. Es könnte auch ein großes oder kleines E erscheinen. Dieses leitet den Exponenten zur Basis 10 ein. Sie kennen das von Ihrem Taschenrechner. Dadurch kann eine Fließkommazahl verdammt groß werden. Aber auch der Exponent kann ein Vorzeichen tragen. So steht 1E-3 für 0,001, also ein Tausendstel. Wenn der Exponent noch negativer wird, wird die Zahl verdammt klein.

ganzklein = 0.00000456

print(ganzklein) # gibt 4.56e-06 aus

Sie sehen, wie der Variablen a ein sehr kleiner Dezimalbruch zugewiesen wurde. Python rückt das in der Ausgabe so zurecht, dass die erste Stelle vor dem Komma oder besser Punkt steht und die Verschiebung hinter das Komma durch den negativen Exponenten ausgedrückt wird. Der Wert ist der gleiche geblieben, nur die Darstellung nicht.

Warnung

Wie die meisten Programmiersprachen verwendet Python kein Komma, sondern einen Punkt, wie er im englischsprachigen Raum üblich ist. Das betrifft auch die Ein- und Ausgaben des Programms. Python wird Sie nicht verstehen, wenn Sie mit einem Komma mitten in einer Zahl auftauchen!

Wenn Sie deutlich machen wollen, dass eine 2 von Python bitte als Fließkommazahl zu behandeln sein soll, hängen Sie einfach noch eine Nachkommstelle an und schreiben Sie 2.0.

3.2 Mathematische Ausdrücke

Python kann Zahlen und Variablen miteinander verrechnen. Für die Addition verwendet Python ein + und für die Subtraktion ein – . Das wird Sie nicht überraschen. Selbst mein Taschenrechner macht das so.

karten = 17 + 4

Wenn die Variable karten nach dieser Anweisung einen anderen Inhalt als 21 hat, haben Sie sich vermutlich vertippt.

Punktrechnung

Bei der Multiplikation gibt es ein Problem mit dem Operator. Der Punkt, wie er in der Mathematik üblich ist, findet sich nicht auf der Tastatur. Es gibt einen Punkt, aber der ist einfach zu flach. Außerdem sieht man ihn nicht gut. Darum verwenden Programmierer gern einen Stern. Für die Division hat man den Bruchstrich schräg gestellt, damit man die Zeile nicht halbieren muss.

produkt = 17 * 4

quotient = 17 / 4

Die Variable produkt enthält anschließend 68, die Variable quotient enthält 4,25, wenn Sie Python 3 verwenden, und 4, wenn Sie Python 2 einsetzen. Der Unterschied entsteht, weil Python 2 wie die meisten anderen Programmiersprachen arbeitet: Wenn zwei ganze Zahlen durcheinander geteilt werden, soll eine ganze Zahl herauskommen, also der ganzzahlige Anteil einer Division.

Das aber verwirrt Programmieranfänger so, dass viele Autoren darüber klagen, dass sie ihre Leser trösten müssen, weil 1/2 plötzlich 0 ergibt. Und das ist doch sehr wenig. Und so hat man sich entschlossen, ab Python 3 lieber als Ergebnis eine Fließkommazahl zuzulassen.

Warnung

Die meisten Programmiersprachen teilen zwei ganzzahlige Werte ganzzahlig. Die Version 3 von Python verwendet einen Fließkommawert, wenn die Division nicht ganzzahlig aufgeht. Python 2 können Sie dazu zwingen, eine Fließkommadivision durchzuführen, indem Sie einen der Operanden als Fließkommazahl schreiben, also beispielsweise statt 1/2 einfach 1.0/2 schreiben.

Wenn Sie in Python unbedingt nur das ganzzahlige Ergebnis haben wollen, verwenden Sie einen doppelten Schrägstrich. Er führt eine sogenannte Floor-Division durch und dann ist 1//2 plötzlich wieder 0. Bitte nicht weinen. Wenn Sie so schön ganzzahlig dividiert haben, ist natürlich etwas unter den Tisch gefallen, was in der Grundschule als »Rest« bezeichnet wird. Diesen Rest einer ganzzahligen Division ermitteln Programmierer mit der Modulo-Operation. Dazu missbraucht Python das Prozentzeichen.

rest = 17 % 4

Die Variable rest enthält anschließend den Wert 1. Dieser Operator erweist sich beim Test der Teilbarkeit als praktisch. Ergibt die Operation 0, sind die Zahlen durcheinander teilbar. Auch können Sie mit der Modulo-Operation sehr schön eine Dezimalzahl in ihre Ziffern zerlegen, wenn Sie sie mehrfach mit zahl%10 bearbeiten.

Hinweis

Wo wir gerade dabei sind: Prozentrechnung wird von Programmierern eigentlich nie mit dem Prozentzeichen betrieben. Um 5 Prozent eines Wertes zu berechnen, multipliziert man ihn mit 5 und teilt ihn durch 100. Oder aber man kürzt es ab, indem man mit 0,05 multipliziert. Probieren Sie es aus!

Wenn man schon das Divisionszeichen verdoppelt, drängt sich die Duplizierung des Sterns der Multiplikation für eine Potenzierung auf. Damit kann man Zahlen hochleben lassen, beispielsweise ergibt 23 als Ergebnis 8 und schreibt sich in Python 2**3, das entspricht also 2*2*2.

Rangfolge

Wenn Sie Ausdrücke kombinieren, kommt es schnell auf die Reihenfolge der Berechnung an. Wenn Sie 5 Flaschen Orangensaft und 3 Flaschen Apfelsaft zum Preis von je 2 Euro kaufen wollen, ergibt sich die Rechnung (5 + 3) * 2. Billiger wird es allerdings, wenn Sie 5 + (3 * 2) rechnen. Was gilt also, wenn Sie die Klammern weglassen? Aus der Schule kennen Sie sicher noch die Regel der Punkt-vor-Strich-Rechnung. Bei Python gilt die folgende Reihenfolge:

• Klammern

• Exponent ( Operator **)

• Multiplikation und Division

• Addition und Subtraktion

Operatoren gleicher Ebene werden von links nach rechts ausgewertet. Zur Problemstellung des Safteinkaufs von oben müssten also Klammern gesetzt werden, um eine problemgemäße Rechenweise zu erreichen: (5 + 3) * 2.

Das folgende Beispiel zeigt die Berechnung eines Bruttopreises aus der Sicht des Python-Interpreters.

brutto = netto + netto * MWSt / 100

Weil sowohl die Multiplikation als auch die Division höherrangig als die Addition ist, wird der rechte Teil der Formel zuerst berechnet. Da Multiplikation und Division gleichrangig sind, wird dieser Teil von links nach rechts ausgeführt. Der Computer berechnet den Wert also in den folgenden Schritten:

netto * MWSt

netto * MWSt / 100

netto + netto * MWSt / 100

brutto = netto + netto * MWSt / 100

Da die Zuweisung als Letztes durchgeführt wird, kann zu einer Berechnung auch die Variable verwendet werden, der der Ausdruck zuletzt zugewiesen wird. Dann enthält die Variable rechts vom Gleichheitszeichen den Wert, wie er vor der Zuweisung war. Immer wieder wird das benötigt, wenn eine Zahl um 1 erhöht werden soll.

zaehler = 1

zaehler = zaehler + 1

Nach Ausführung der Zeilen enthält die Variable zaehler den Wert 2.

Die letzte Zeile kann durch zaehler += 1 verkürzt werden. Allerdings ist zaehler++, wie es C oder Java verwendet, in Python nicht erlaubt.

3.3 Programmatisches Geschwätz: Zeichenketten

Der Umgang mit der Sprache fällt den Menschen leichter als den Computern. Ein Wort ist aus der Sicht des Computers eine Folge von Buchstaben und wird darum als Zeichenkette oder gern auch als String bezeichnet. Das Wort String ist vor allem Programmierern sympathisch. Das mag an der Assoziation zum String-Tanga liegen. Aber mir stehen die Dinger gar nicht. Das sieht ja aus wie Presswurst.

Python codiert zur Verarbeitung von Zeichenketten jeden Buchstaben in eine Zahl und hängt diese Zahlen anschließend aneinander. Python bezeichnet eine Zeichenkette auch als eine Sequenz von Buchstaben beziehungsweise deren Codierung. Was Python intern daraus macht, soll aber erst einmal egal sein. Wir wollen einfach ein wenig damit programmieren.

Literale

Als Literal bezeichnen Programmierer einen konstanten Wert, der quasi unverpackt ins Programm geschrieben wird. Eine 4 ist beispielsweise ein Zahlenliteral.

In einem Programm werden häufiger feststehende Zeichenketten verwendet. Diese muss der Python-Interpreter natürlich von den Variablennamen unterscheiden. Dazu werden die Zeichenketten entweder durch Anführungszeichen oder durch Hochkommata eingeschlossen. Geht die Zeichenkette über mehrere Zeilen, können Sie auch drei Hochkommata oder Anführungszeichen verwenden. Das folgende Beispiel zeigt, wie die Variablen gruss, name undlyrik mit Zeichenketten gefüllt werden.

gruss = "Hallo!"

name = ’Arnold’

lyrik = """When I see a bird

that walks like a duck

and swims like a duck

and quacks like a duck,

I call that bird a duck.

(James Whitcomp Riley)"""

Listing 3.1 Zeichenkettenliterale

Die Möglichkeit, neben den Anführungszeichen auch Hochkommata verwenden zu können, ist besonders praktisch, wenn der Text selbst Anführungszeichen enthält.

lyrik = ’"Schieß doch!" waren seine letzten Worte’

Ach ja: Sie erinnern sich? Es gibt Ärger, wenn Sie unter Python 2 Umlaute in Zeichenketten verwenden. Was nun? Sie könnten das ß durch ss ersetzen, aber das ist leider nicht einmal durch die Rechtschreibreform abgedeckt. Sie können in der ersten oder zweiten Zeile die Codierung angeben:

# – *– coding: utf-8 – *-

Oder Sie verwenden einfach Python 3 und einen UTF-8-kompatiblen Editor.

Mit Zeichenketten kann man wundervoll herumspielen. Sie finden in Kapitel 8 noch ein paar schöne Anregungen.

3.4 Alles muss raus: print

So erhebend das Gefühl auch sein mag, wenn das erste eigene Programm mit Zahlen jongliert, so traurig ist es, wenn die Welt da draußen von diesen Fähigkeiten nichts erfährt. Um dem Mitteilungsbedürfnis von Programmen Raum zu geben, stellt die Sprache Python die Funktion print() zur Verfügung. Sie nimmt die auszugebenden Werte in ihre runden Klammern und schickt sie auf die Konsole.

Als Beispiel soll Ihr Programm berechnen, wie lang ein Streifen von zehn Zentimetern Breite wird, wenn Sie einen 500-Gramm-Becher Joghurt verwenden, um damit in der Fußgängerzone ein Fußballfeld zu markieren. Aus jahrelanger Erfahrung wissen Sie, dass Sie den Joghurt mindestens zwei Millimeter dick auftragen müssen.

joghurtbecher = 500

auftragsdicke = 0.2

breite = 10

laenge = joghurtbecher / breite / auftragsdicke

print(laenge)

Listing 3.2 Lösung des Joghurtbecherproblems

Dabei ist print() ein echtes Multitalent! Die Funktion gibt Zahlen, Zeichenketten oder Variablen aus, sogar mehrere hintereinander, wenn man sie per Komma trennt. Das können Sie nutzen, um dem Anwender das Ergebnis nicht einfach nur als nackte Zahl vorzuwerfen.

joghurtbecher = 500

auftragsdicke = 0.2

breite = 10

laenge = joghurtbecher / breite / auftragsdicke

print("Der Streifen ist", laenge, "cm lang")

Listing 3.3 Multiple Ausgabe

Die Ausgabe des Programms sieht so aus:

Der Streifen ist 250.0 cm lang

Damit kann man beim besten Willen kein Fußballfeld markieren. Sie müssen also noch mehr Joghurt kaufen.

Warnung

Die Ein- und Ausgabe unterscheidet sich zwischen Python 2 und Python 3. Wenn Sie in einem Listing ein print ohne Klammern sehen, handelt es sich definitiv um Python 2. Zunächst betrachten wir Python 3.

Wenn die Funktion print() mehrere Werte in einem Rutsch ausgibt, setzt sie immer ein Leerzeichen zwischen die Ausgabewerte. In den meisten Fällen ist das ja auch ganz praktisch. Aber wenn das Leerzeichen stört, können Sie das Trennzeichen der Funktion print() verändern, indem Sie der Parametervariablen sep eine leere Zeichenkette zuweisen.

joghurtbecher = 500

auftragsdicke = 2

breite = 10

laenge = joghurtbecher / breite / auftragsdicke

print("Der Streifen ist", laenge, "cm lang", sep="")

Listing 3.4 Multiple Ausgabe ohne Leerzeichen

Die Ausgabe des Programms sieht nun so aus:

Der Streifen ist250.0cm lang

Probieren Sie doch einfach mal aus, was passiert, wenn Sie stattdessen sep=’+-+’ einsetzen!

So wie die Parametervariable sep das Trennzeichen bestimmt, können Sie über die Parametervariable end das Abschlusszeichen verändern. Normalerweise schließt eine Ausgabe mit einem Zeilenumbruch ab. Wenn Sie hier eine leere Zeichenkette oder ein Leerzeichen einsetzen, wird ein späterer Aufruf von print() seine Ausgabe hinter die bisherige Ausgabe anhängen.

joghurtbecher = 500

auftragsdicke = 0.2

breite = 10

laenge = joghurtbecher / breite / auftragsdicke

print("Der Streifen ist", breite, "cm breit", end=" ")

print("und", laenge, "cm lang")

Listing 3.5 Ausgabe ohne Zeilenabschluss

Wenn Sie in Listing 3.5 die Zuweisung an end weglassen, erscheint das Ergebnis in zwei Zeilen, weil Sie ja auch zwei print()-Aufrufe verwenden.

Ausgabe bis Python 2

Bis zur Python-Version 2 war print ein Befehl und keine Funktion, da eine Funktion flexibler im Umgang ist. Das wird Sie als Anfänger zunächst nicht berühren, hat für Sie aber vor allem die Konsequenz, dass die Ausgabe bei Python 2 keine Klammern benötigte.

Solange print immer nur einen Wert ausgibt, schadet es auch bei Python 2 nichts, wenn Sie dort ebenfalls Klammern setzen. Dann funktioniert Ihr Programm unter beiden Interpretern. Wenn Sie allerdings mehrere Variablen durch Kommata separiert ausgeben wollen, könnten unter Python 2 etwas merkwürdige Zusatzzeichen erscheinen, weil Python 2 glaubt, die Ausgabe sei ein Tupel (siehe Abschnitt 9.2). Auch unter Python 2 kann print mehrere Werte durch Kommata getrennt direkt hintereinander ausgeben. Auch hier erscheint an der Stelle des Kommas ein Leerzeichen.

print "Guten Tag,", name

Listing 3.6 Python-2-Ausgabe mehrerer Werte

Wenn Sie bei Python 2 ganz an das Ende eines print-Befehls noch ein Komma setzen, erscheint die nächste Ausgabe in der gleichen Zeile. Allerdings sollten Sie berücksichtigen, dass angefangene Zeilen nicht unbedingt sofort auf dem Bildschirm erscheinen, sondern erst, wenn die Zeile durch einen Zeilenvorschub abgeschlossen wird.

3.5 Futter für die Programme: input

Ein Programm kann mit immer neuen Werten die gleichen Berechnungen durchführen. Hardcore-Programmierer werden es vielleicht zumutbar finden, dass man einfach die Variablen im Programm für jeden Lauf ändert, aber der normale Anwender wird eine Eingabeaufforderung sehr schätzen. Dazu bietet Python die Funktion input() an.

Warnung

Bis zur Python-Version 2 erlaubt die Funktion input() nur Zahleneingaben. Sollen Texte eingegeben werden, muss die Funktion raw_input() verwendet werden. Python 3 kennt raw_input() dagegen nicht mehr, sondern verwendet input() in dieser Weise. Also liefert die Funktion nun eine Zeichenkette zurück. Um einen Zahlenwert zu erlangen, muss die Zeichenkette beispielsweise mit der Funktion eval() in eine Zahl umgewandelt werden.

Wir bleiben bei Python 3. Zunächst soll einfach ein Programm geschrieben werden, das einen Namen entgegennimmt und wieder ausgibt.

print("Wie heißen Sie?")

name = input()

print("Hallo ", name)

Listing 3.7 Eingabe eines Namens unter Python 3

Die Funktion input() erlaubt auch eine Zeichenkette als Parameter, die dann vor der Eingabe ausgegeben wird. Sie können das Programm also so ändern, dass die Frage an den Benutzer direkt vor der Eingabe steht.

name = input("Wie heißen Sie? ")

print("Hallo ", name)

Listing 3.8 Eingabe eines Namens unter Python 3

Wie erwähnt, gibt die Funktion input() Zeichenketten zurück. Wenn Sie nun allerdings eine Zahl haben wollen, müssen Sie die Zeichenkette erst umwandeln, also konvertieren.

3.6 Konvertierung der Variablentypen

Wenn der Anwender Ihres Programms eine Eingabe macht, dann tippt er Buchstabe um Buchstabe, woraus sich eine Zeichenkette ergibt. Soll er eine Zahl eingeben, tippt er Ziffer um Ziffer und auch das ist zunächst eine Zeichenkette.

Wenn der Computer aber die eingegebene Zahl in einer Rechnung verwenden will, dann kann er nicht anders, als die Zeichenkette in eine Zahl zu verwandeln. Dazu bietet Python die Funktion eval() an.

eingabe = input()

zahleneingabe = eval(eingabe)

Listing 3.9 Eingabe einer Zahl unter Python 3

Die Funktion eval() zeigt sich als extrem hilfsbereit. Sie wandelt nicht nur einfache Ziffernfolgen in Zahlen, sondern beherrscht sogar die Rechenfunktionen von Python. So ermittelt sie aus 17+4 die Zahl 21. Selbst Variablen des Programms können bei der Berechnung hinzugezogen werden.

Warnung

Wenn diese gemeinen Anwender es wagen, statt der geforderten Zahl ihren Namen einzugeben oder die Adresse ihrer Autowerkstatt, dann wird das Programm rigoros zur Landung gezwungen. Das ist blöd, aber Rettung naht. In Abschnitt 4.3.2 wird genau dieses Problem behandelt.

Python kennt zwei Arten von Zahlentypen: Da gibt es die ganzzahligen Werte (int) und die Fließkommazahlen (float). Für jeden der Typen gibt es eine Funktion, die nichts anderes tut, als die Variable im Parameter in den eigenen Typ umzuwandeln.

ganzzahlvar = int(’42’) # 42

ganzzahlvar = int(9.8) # 9

nachkommavar = float("9.81") # 9.81

nachkommavar = float(9) # 9.0

In den Kommentaren hinter den Zuweisungen steht, in welche Zahl der Wert zwischen den Klammern konvertiert wird. Eine Zeichenkette wird wie erwähnt auch String genannt. Davon abgeleitet nennt Python den Typ einer Zeichenkette str. Und analog zu den Konvertierungsfunktionen der Zahlen gibt es eine Funktion str(), die einen Zahlenwert in eine Zeichenkette umwandelt.

zeichenkette = str(zahlvar)

Es gibt da noch eine Funktion repr(), die auf den ersten Blick dasselbe tut wie str(). Tatsächlich wandelt sie Zahlenwerte in Zeichenketten um. Allerdings kann sie noch mehr. Sie wandelt alle möglichen Typen von Werten in die Repräsentation dieses Wertes um. Das gilt auch für komplexere Typen, wie Sie sie noch kennenlernen werden.


Конец ознакомительного фрагмента. Купить книгу
Python. Der Sprachkurs für Einsteiger und Individualisten

Подняться наверх