verständnisfrage zu format()

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Heimdall
User
Beiträge: 3
Registriert: Samstag 11. Juni 2011, 20:33

Liebe Python Community,

ich bin Neuling in der Welt von Python und lerne gerade mit dem Buch "Einstieg in Python" aktuell zu Python 3.2 von Thomas Theis.

Auf Seite 150 gibt es ein Kapitel zur Ausgabe und Formatierung, bei der ich mir ein bestimmtes Verhalten nicht erklären kann. Es geht darum das im Beispiel Code Zahlen auf einmal rechtsbündig ausgegeben werden, aus der Erklärung von Herrn Theis allerdings nicht hervorgeht, warum das so ist.

Hier der Code

Code: Alles auswählen

x=100/7
y=2/7

print("{0:f}{1:f}".format(x,y))
print("{0:15.10f} {1:.25f}".format(x,y))
In der Erklärung steht, das bei der ersten Zeile die Formatierungsanweisung f dafür sorgt, dass Zahlen mit 6 Nachkommastellen angegeben werden. In der zweiten Zeile wird dann manuell festgelegt, wie die Zahlen zu formatieren sind. Sofern ich das richtig verstanden habe z. B. bei 15.10f , steht die 15 für die Ausgabe der Gesamtzahlen, die 10 für die Nachkommastellen. Dennoch wird das ganze rechtsbündig ausgegeben.

Die beiden Zeilen unterscheiden sich doch gar nicht wirklich, wo ist da die Anweisung zur rechtsbündigkeit versteckt ? :K

Die Ausgabe sieht so aus:

Code: Alles auswählen

14.2857140.285714
  14.2857142857 0.2857142857142856984253854
Nach meinen Verständnis müsste sie aber so aussehen:

Code: Alles auswählen

14.2857140.285714
14.2857142857 0.2857142857142856984253854
Liebe Grüße

Heimdall
BlackJack

@Heimdall: 15 Gesamt, 10 nach dem Komma, macht genau 4 vor dem Komma. 14 ist aber nur zwei Zeichen lang, also wird davor mit zwei Leerzeichen aufgefüllt.
deets

Na, wenn beide dasselbe tun wuerden, waere die zweite Zeile ja ueberfluessig.

Die 15 macht also den unterschied, und sie sorgt auch fuer die rechtsbuendigkeit. sie legt fest, wie breit die gesamtausgabe der Zahl ist. 15 Zeichen. davon sind 10 Nachkommastellen, ein Punkt, zwei Vorkommastellen -> 13 Stellen verbraucht. Verbleiben 2 Stellen, und das sind die beiden Leerzeichen.

Wo sonst ausser vor der Zahl sollen die sein? Linksbuendigkeit ist bei Zahlen ja eher unueblich, darum werden sie automatisch rechtsbuendig gesetzt, wenn man ihnen eine gesamtbreite gibt.
Heimdall
User
Beiträge: 3
Registriert: Samstag 11. Juni 2011, 20:33

Ja super. Da schau ich mir den Code solange an und seh den Wald vor lauter Bäumen nicht. Vollkommen logisch. Vielen Dank!
mutetella
User
Beiträge: 1695
Registriert: Donnerstag 5. März 2009, 17:10
Kontaktdaten:

Die standardmäßig rechtsbündige Ausgabe '>' kannst Du mit '<' auf linksbündig oder mit '^' auf zentriert setzen:

Code: Alles auswählen

In [24]: x = 123.45678

In [25]: print('-{0:>15.5f}-'.format(x))
-      123.45678-

In [26]: print('-{0:<15.5f}-'.format(x))
-123.45678      -

In [27]: print('-{0:^15.5f}-'.format(x))
-   123.45678   -
Und wenn man möchte, kann man das alles auch noch mit einem Füllzeichen versehen:

Code: Alles auswählen

In [42]: print('{0:.>15.3f}'.format(x))
........123.457

In [43]: print('{0:.<15.3f}'.format(x))
123.457........

In [44]: print('{0:.^15.3f}'.format(x))
....123.457....
mutetella
Entspanne dich und wisse, dass es Zeit für alles gibt. (YogiTea Teebeutel Weisheit ;-) )
Heimdall
User
Beiträge: 3
Registriert: Samstag 11. Juni 2011, 20:33

mutetella hat geschrieben:Die standardmäßig rechtsbündige Ausgabe '>' kannst Du mit '<' auf linksbündig oder mit '^' auf zentriert setzen
Und wenn man möchte, kann man das alles auch noch mit einem Füllzeichen versehen
mutetella
Danke.
Das konnte ich auch direkt in einer Übungsaufgabe anwenden die ich dann so gelöst hatte

Code: Alles auswählen

print("{0:>8} {1:>8}".format("inch", "cm"))
for x in range(25,51,5):
    print("{0:8.2f} {1:8.2f}".format(x, x*2.54))
Grüße

Heimdall :)
Antworten