Ein Wert ist eines der fundamentalen Dinge wie ein Buchstabe
oder eine Zahl die ein Programm verarbeitet. Die Werte, die wir
bisher gesehen haben, sind 2 (das Ergebnis unserer Addition
1 + 1) und "Hello, World!".
Diese Werte gehören zu verschiedenen Typen:
2 ist eine ganze Zahl oder Ganzzahl und "Hello, World!"
ist ein String (engl.: Kette, Folge)
eine Zeichenkette, so genannt, weil sie eine "Kette" von "Zeichen"
etwa: Buchstaben enthält. Du kannst (wie auch der Interpreter) Strings
daran erkennen, dass sie in Anführungszeichen eingeschlossen sind.
Die print - Anweisung funktioniert auch für Ganzzahlen.
>>> print 4
4
Wenn du nicht sicher bist, welchen Typ ein Wert hat, kann dir das der Interpreter sagen.
>>> type("Hello, World!")
<type 'string'>
>>> type(17)
<type 'int'>
Es ist kaum überraschend, dass Strings zum Typ string gehören.
Ganzzahlen gehören zum Typ int (die Abkürzung des
englischen Worts integer für ganze Zahl). Weniger offensichtlich
ist es, dass Zahlen mit einem Nachkommaanteil zu einem Typ
gehören, der float heisst. Diese Zahlen werden im
sogenannten floating-point - Format Gleitkomma-Format
dargestellt-
>>> type(3.2)
<type 'float'>
Wie steht es mit Werten wie "17" und "3.2"? Sie schauen aus wie Zahlen, sind aber in Anführungszeichen eingeschlossen, wie Strings.
>>> type("17")
<type 'string'>
>>> type("3.2")
<type 'string'>
Sie sind Strings.
Wenn du eine große ganze Zahl schreibst, wirst du vielleicht probieren Kommas zwischen die Zifferngruppen zu schreiben, etwa wie in 1,000,000. Das ist keine korrekte Ganzzahl in Python, aber es ist ein legaler Ausdruck:
>>> print 1,000,000
1 0 0
Gut, das ist wirklich nicht das, was wir erwartet haben. Es stellt sich heraus, dass 1,000,000 ein Tupel ist, etwas, zu dem wir in Kapitel 9 kommen werden. Zunächst merke dir einfach, dass du keine Kommas in deinen Ganzzahlen verwenden darfst.
Eine der nützlichsten Eigenschaften von Programmiersprachen ist, dass sie mit Variablen arbeiten. Eine Variable ist ein Name, der auf einen Wert verweist.
Die Wertzuweisung erzeugt neue Variablen und versieht sie mit Werten:
>>> message = "What's up, Doc?"
>>> n = 17
>>> pi = 3.14159
Dieses Beispiel macht drei Wertzuweisungen. Die erste weist den String "What's up, Doc?" einer neuen Variablen namens message zu. Die zweite speichert die Ganzzahl 17 in der Variablen n und die dritte setzt den Wert von pi auf die Gleitkomma-Zahl 3.14159. (Drei verschiedene Ausdrucksweisen für dieselbe Sache!)
Ein übliches Verfahren, Variablen auf Papier darzustellen, ist es, den Variablennamen mit einem Pfeil, der auf den Variablenwert zeigt, aufzuschreiben. Diese Darstellung nennt man Zustandsdiagramm, weil sie den Zustand zeigt, in dem sich jede Variable befindet. (Denk an etwas wie den "Geisteszustand" der Variablen). Das Diagramm zeigt das Ergebnis der Wertzuweisung.
Die print - Anweisung kann auch mit Variablen arbeiten.
>>> print message
What's up, Doc?
>>> print n
17
>>> print pi
3.14159
In jedem Fall wird der Wert der Variablen ausgegeben. Variable haben auch einen Typ; wieder kann uns der Interpreter über diesen Auskunft geben.
>>> type(message)
<type 'string'>
>>> type(n)
<type 'int'>
>>> type(pi)
<type 'float'>
Der Typ einer Variablen ist der Typ des Werts, auf den sie verweist (der ihr zugewiesen wurde).
Programmierer verwenden im allgemeinen Namen für ihre Variablen,
die eine Bedeutung haben so sie dokumentieren sie, wofür die Variable
verwendet wird.
Variablennamen können beliebig lang sein. Sie können sowohl Buchstaben wie auch Ziffern enthalten, aber sie müssen mit einem Buchstaben beginnen. Obwohl es erlaubt ist, Großbuchstaben zu verwenden, vereinbaren wir, dass wir das nicht tun. Wenn du es doch tust, denke daran, dass Groß-/Kleinschreibung eine Rolle spielt. Bruce und bruce sind verschiedene Variablen.
Das Unterstrich-Zeichen (_) kann auch in Variablennnamen vorkommen. Es wird oft in Variablennamen verwendet, die aus mehreren Wörtern bestehen, wie z. B. mein_name or preis_von_tee_in_china.
Wenn man einer Variablen einen illegalen Namen gibt, erhält man einen Syntax-Fehler:
>>> 76trombones = "big parade"
SyntaxError: invalid syntax
>>> more$ = 1000000
SyntaxError: invalid syntax
>>> class = "Computer Science 101"
SyntaxError: invalid syntax
76trombones ist nicht erlaubt, weil es nicht mit einem Buchstaben beginnt. more$ ist nicht erlaubt, weil es ein illegales Zeichen enthält, das Dollar-Zeichen. Aber was ist verkehrt mit class?
Es stellt sich heraus, dass class eines der keywords, d. h. Schlüsselwörter oder reservierten Wörter von Python ist. Schlüsselwörter definieren die Regeln und die Struktur der Sprache und sie können nicht als Variablennamen verwendet werden.
Python hat neunundzwanzig Schlüsselwörter:
and del for is raise
assert elif from lambda return
break else global not try
class except if or while
continue exec import pass yield
def finally in print
Du solltest diese Liste bereit halten. Wenn der Interpreter über einen deiner Variablennamen stolpert, und du weißt nicht warum, schau nach, ob er auf dieser Liste ist.
Eine Anweisung ist ein Befehl, den der Python-Interpreter ausführen kann. Wir haben bisher zwei Arten von Anweisungen gesehen: print-Anweisungen und Wertzuweisungen.
Wenn du eine Anweisung auf der Kommandozeile eingibst, führt Python sie aus und zeigt das Ergebnis auf dem Bildschirm an, wenn die Anweisung ein Ergebnis hat. Das Ergebnis einer print-Anweisung ist ein Wert. Wertzuweisungen erzeugen kein Ergebnis.
Ein Script enthält normalerweise eine Folge von Anweisungen. Wenn mehr als eine Anweisung vorhanden ist, dann erscheinen die Ergebnisse eins nach dem anderen, in der Reihenfolge wie die Anweisungen ausgeführt werden.
Zum Beispiel erzeugt das Script
print 1
x = 2
print x
die Ausgabe
1
2
Wieder erzeugt die Wertzuweisung keine Ausgabe.
Ein Ausdruck ist eine Kombination von Werten, Variablen und Operatoren. Wenn du einen Ausdruck auf der Kommandozeile eingibst, führt der Interpreter die Auswertung des Ausdrucks aus und stellt das Ergebnis auf dem Bildschirm dar:
>>> 1 + 1
2
Ein Wert allein wird, ebenso wie eine Variable allein, auch als Ausdruck betrachtet
>>> 17
17
>>> x
2
Verwirrenderweise ist die Auswertung eines Ausdrucks nicht genau dasselbe, wie die Ausgabe eines Werts mit der print-Anweisung.
>>> message = "What's up, Doc?"
>>> message
"What's up, Doc?"
>>> print message
Wenn Python den Wert eines Ausdrucks ausgibt, benutzt es dasselbe Format, dass du auch benutzen würdest um einen Wert einzugeben. Im Fall von Strings bedeutet das, dass auch die Anführungszeichen eingeschlossen sind.
In einem Script, ist ein Ausdruck ganz allein eine legale Anweisung, aber sie tut überhaupt nichts. Das Script
17
3.2
"Hello, World!"
1 + 1
produziert überhaupt keine Ausgabe. Wie würdest du das Script ändern, um die Werte dieser vier Ausdrücke auszugeben?
Operatoren sind spezielle Symbole, die Rechenarten wie Addition und Multiplikation darstellen. Die Werte, die durch die Operatoren verknüpft werden, heißen Operanden.
Die folgenden sind einige legale Python-Ausdrücke, deren Bedeutung mehr oder weniger klar ist:
20+32 hour-1 hour*60+minute minute/60 5**2 (5+9)*(15-7)
Die Symbole +, -, und /, und der Gebrauch von runden Klammern (engl.: parenthesis) bedeuten in Python dasselbe wie in der Mathematik. Das Sternchen (*) ist das Symbol für die Multiplikation und ** ist das Symbol für Potenzieren.
Wenn ein Variablenname an der Stelle eines Operanden steht, wird er durch seinen Wert ersetzt, bevor die Operation ausgeführt wird.
Addition, Subtraktion, Multiplikation und Potenzieren machen alle das, was man erwartet, aber du wirst vielleicht überrascht sein von der Division. Die folgende Operation hat ein unerwartetes Ergebnis.
>>> minute = 59
>>> minute/60
0
Der Wert von minute ist 59, und 59 dividiert durch 60 ist 0.98333, nicht 0. Der Grund für diesen Widerspruch ist, dass Python eine Ganzzahl-Division durchführt.
Wenn beide Operanden der Division Ganzzahlen sind, dann muss das Ergebnis auch eine Ganzzahl sein, und das ist so eingerichtet, dass die Ganzzahl-Division immer abrundet, auch in Fällen wie diesem, wo die nächste ganze Zahl ganz nahe darüber ist.
Eine mögliche Lösung für dieses Problem ist, einen Prozentsatz statt eine Dezimalbruchs auszurechnen:
>>> minute*100/60
98
Wieder ist das Ergebnis abgerundet, aber wenistens ist die Antwort nun näherungsweise korrekt. Eine andere Alternative ware, Gleitkomma-Division zu verwenden; dazu kommen wir in Kapitel 3.
Wenn mehr als ein Operator ein einem Ausdruck vorkommt, dann hängt die Reihenfolge der Auswertung von den Vorrangregeln ab. Python verwendet dieselben Vorrangregeln für seine mathematischen Operatoren wie die Mathematik ("Punkt- vor Strichrechnung").
Im Allgemeinen können keine mathematischen Operationen mit Strings ausgeführt werden, selbst dann, wenn die Strings wie Zahlen ausschauen. Das folgende ist nicht legal (unter der Annahme, dass message den Typ string hat):
message-1 "Hello"/123 message*"Hello" "15"+2
Interessanterweise kann + mit Strings verwendet werden, obwohl es ein anderes Ergebnis produziert, als du vielleicht erwartest. Für Strings bedeutet der + Operator Verkettung, d. h. der zweite Oprand wird an den ersten angefügt. Zum Beispiel:
fruit = "banana"
bakedGood = " nut bread"
print fruit + bakedGood
Die Ausgabe dieses Programms ist banana nut bread.
Der * Operator arbeitet (in Python) auch mit Strings; er führt Wiederholung aus. Zum Beispiel: 'Fun'*3 ist 'FunFunFun'. Einer der Operanden muß hier ein String sein, der andere eine ganze Zahl.
Auf der einen Seite scheint diese Interpretation von + und * sinnvoll in Analogie zu Addition und Multiplikation. Gerade wie 4*3 äquivalent mit 4+4+4 ist, erwarten wir, dass "Fun"*3 dasselbe ergibt wie "Fun"+"Fun"+"Fun", und das ist ja auch der Fall. Auf der anderen Seite sind String-Verkettung und String-Wiederholung in wesentlicher Weise verschieden von Ganzzahl-Addition und Ganzzahl-Multiplikation.
Als Übung nenne eine Eigenschaft von Addition und Multiplikation, die String-Verkettung und String-Wiederholung nicht haben.
Bis jetzt haben wir die Grundbestandteile eines Programms betrachtet
Variablen, Ausdrücke, Anweisungen ohne darüber zu
sprechen, wie man sie kombinieren kann.
Eine der nützlichsten Eigenschaften von Programmiersprachen ist ihre Fähigkeit zu ermöglichen, kleine Bausteine zu größeren zu verknüpfen. Wenn wir z. B. wissen, wie man Zahlen addiert und wie man etwas auf den Bildschirm ausgibt, kann man auch beides "gleichzeitig" ausführen:
>>> print 17 + 3
20
Ein Wirklichkeit geschieht die Addition natürlich vor der Ausgabe, so dass die beiden Aktionen in Wahrheit nicht "gleichzeitig" geschehen. Worauf es hier ankommt ist, dass jeder Ausdruck mit Zahlen, Strings und Variablen innerhalb einer print - Anweisung verwendet werden kann. Du hast schon ein Beispiel dafür gesehen:
print "Number of minutes since midnight: ", hour*60+minute
Ebenso kann man beliebige Ausdrücke auf die rechte Seite einer Wertzuweisung schreiben:
percentage = (minute * 100) / 60
Diese Möglichkeit wird dich vielleicht jetzt nicht beeindrucken, aber du wirst andere Beispiele sehen, wo "Verknüpfung" es ermöglicht, komplexe Berechnungen klar und kompakt auszudrücken.
Warnung: Es gibt natürlich Grenzen dafür, wo die Anwendung von Ausdrücken erlaubt ist. Zum Beispiel muß die linke Seite einer Wertzuweisung ein Variablenname sein und kein Ausdruck. So ist etwa das Folgende nicht erlaubt: minute+1 = hour.
Je größer und komplizierter Programme werden, desto schwieriger zu lesen sind sie. Formale Sprachen sind dicht, und oft ist es schwer ein Stück Code anzuschauen und herauszufinden, was es tut oder warum.
Aus diesem Grund ist es eine gute Idee, Anmerkungen zu deinen Programmen hinzuzufügen, die in natürlicher Sprache erklären, was das Programm macht. Diese Anmerkungen werden Kommentare genannt und sie werden mit dem # Symbol gekennzeichnet:
# berechne den Prozentanteil, der von der Stunde vergangen ist
percentage = (minute * 100) / 60
In diesem Fall nimmt der Kommentar eine eigene Zeile ein. Man kann Kommentare auch an das Ende einer Zeile stellen:
percentage = (minute * 100) / 60 # Vorsicht: Ganzzahl-Division
Alles vom # bis zum Ende der Zeile wird vom
Interpreter ignoriert. Es hat keine Auswirkung auf das Programm.
Die Anmerkung ist gedacht für den Programmierer oder für zukünftige
Programmierer die diesen Code einmal verwenden möchten. In diesem
Fall erinnert es den Leser an das immer wieder überraschende
Verhalten der Ganzzahl-Division.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|