print

Einführung

Briefkasten als Symbol der Kommunikation zwischen Computer und Benutzer

Jedes Computer-Programm muss prinzipiell mit seiner "Umgebung" oder "Außenwelt" korrespondieren. Dazu bietet fast jede Programmiersprache spezielle Ein-/Ausgabe-Funktionalitäten. Damit wird eine Interaktion/Kommunikation eines Programmes mit anderen Komponenten z.B. mit einer Datenbank oder seinen Benutzern ermöglicht. Eingaben kommen, - wie wir bereits an anderen Stellen in unserem Tutorial gesehen haben, - sehr häufig über die Tastatur und der entsprechende Python Befehl oder besser die entsprechende Python-Funktion zum Lesen von der Standardeingabe lautet input(). Wir haben in unseren Beispielen auch bereits gesehen, dass wir mittels print() in die Standardausgabe schreiben können. In diesem Kapitel unseres Tutorials wollen wir uns nun die print-Funktion im Detail ansehen. Weil es viele überlesen, wollen wir nochmals betonen, dass wir eben von einer print-Funktion und nicht von einer print-Anweisung gesprochen hatten. Wie wichtig dieser Unterschied ist, sieht man, wenn man sich ein beliebiges Python2-Programm nimmt und dieses unter Python3 laufen lässt bzw. versucht es laufen zu lassen. Dies funktioniert in den meisten Fällen nicht, und wir erhalten viele Fehlermeldungen. Eine sehr häufig auftretende Fehlermeldung gibt es in Zusammenhang mit den Ausgaben mit print, da die meisten Programme prints enthalten. Diesen typischen Fehler können wir auch in der interaktiven Python-Shell generieren:

print 42
  File "<ipython-input-1-6b6f29d376df>", line 1
    print 42
           ^
SyntaxError: Missing parentheses in call to 'print'. Did you mean print(42)?

Eine uns allen wohl bekannte Fehlermeldung: Wir haben die Klammern vergessen. "print" ist in Python3 eine Funktion und keine Anweisung mehr, wie dies vorher der Fall war, und deshalb müssen die Argumente, wie bei jeder anderen Funktion auch, innerhalb von einem Klammernpaar stehen. Wir können also obigen Fehler leicht durch Hinzufügen von Klammern beheben:

print(42)
42

Dies ist aber nicht der einzige Unterschied zum alten print. Auch das Ausgabeverhalten hat sich verändert.

Das Aufrufverhalten der print-Funktion ist wie folgt in Python3 definiert:

print(value1, ..., sep=' ', end='\n', file=sys.stdout, flush=False)
Die print-Funktion druckt beliebig viele Werte ("value1, value2, ...") aus, die durch Komma getrennt sind. Bei der Ausgabe werden die Werte standardmäßig durch Leerzeichen getrennt. Im folgenden Beispiel sehen wir zwei print-Aufrufe, die jeweils zwei Werte, d.h. einen String und eine Float-Zahl ausgeben:

a= 3.564
print("a = ", a)
a =  3.564
print("a = \n", a)
a = 
 3.564

Wir sehen im zweiten print des vorigen Beispiels, dass das Leerzeichen zwischen zwei Werten, also in unserem Fall die Werte "a = \textbackslash n" und "3.564", immer durch ein Leerzeichen getrennt werden, auch wenn die Ausgabe in einer neuen Zeile weitergeht. In Python 2 ist dies nicht so. Dort wird kein Leerzeichen in einer neuen Zeile ausgegeben. Leerzeichen werden dort nur zwischen zwei Werten ausgegeben, wenn kein Zeilenvorschub stattfindet. Mit dem Schlüsselwortparameter "sep" kann man den Separator, der zwischen den Werten ausgegeben wird, auf einen beliebigen Stringwert setzen, also auch zum Beispiel auf einen leeren String oder einen Smiley:

print("a","b")
a b
print("a","b",sep="")
ab
print(192,168,178,42,sep=".")
192.168.178.42
print("a","b",sep=":-)")
a:-)b

Nach der Ausgabe der Werte beendet die print-Funktion die Ausgabe mit einem Newline, wie wir im folgenden sehen:

for i in range(4):
    print(i)
0
1
2
3

Man kann dem Schlüsselwortparameter "end" einen beliebigen String zuweisen, der dann statt dem Default-Wert "\textbackslash n" verwendet wird. Das erlaubt uns z.B. mehrere Werte in einer Zeile auszugeben:

for i in range(4):
    print(i, end=" ") 
0 1 2 3 
for i in range(4):
    print(i, end=" :-) ")
0 :-) 1 :-) 2 :-) 3 :-) 

Die Ausgabe der print-Funktion wird in einen Datenstrom (engl. stream) geleitet. Standardmäßig wird dazu die Standardausgabe benutzt, also "sys.stdout". Mit dem Schlüsselwort "file" sind wir schließlich in der Lage die Ausgabe in eine Datei umzuleiten.

fh = open("daten.txt","w")
print("42 ist die Antwort, aber was ist die Frage?", file=fh)
fh.close()

Wir können feststellen, dass print nun keine Ausgabe mehr in der interaktiven Shell erzeugt. Die Ausgabe erfolgt nun in die Datei "daten.txt". Auf diese Art ist es nicht nur möglich Ausgaben in eine beliebige Datei umzulenken, sondern auch in den Standardfehlerkanal:

import sys
# Ausgabe in Standardfehlerkanal:
print("Error: 42", file=sys.stderr)
Error: 42