Έχουμε δει ότι όταν τυπώνουμε μεταβλητές, π.χ., print(s,a,i)
δεν έχουμε ιδιαίτερο έλεγχο στη μορφή με την οποία θα τυπωθούν οι τιμές των μεταβλητών.
Με την εντολή print
οι τιμές των μεταβλητών τυπώνονται σε πεδία τόσης έκτασης όση ακριβώς χρειάζεται για να χωρέσουν.
Πολύ συχνά όμως η μορφή αυτή της εκτύπωσης δεν είναι αυτή που επιθυμούμε.
Για παράδειγμα, αν a=3.000000000000001
τότε είναι πιθανό ότι θα επιθυμούσαμε να τυπωθεί το 3.0 και όχι τα παραπάνω 16 ψηφία.
Υπάρχουν και πολλές άλλες περιπτώσεις που θα θέλαμε να έχουμε έλεγχο στην μορφή της εκτύπωσης, π.χ., θα θέλαμε να υπάρχουν ορισμένος αριθμός κενών μεταξύ δύο αριθμών, θα θέλαμε να τυπώνονται νούμερα ή λέξεις σε διαδοχικές σειρές κατά ευθυγραμμισμένο τρόπο κλπ.
for i in range(10): print(i, i*0.1)
.
Θα παρατηρήσετε ότι είναι απαραίτητο να βελτιώσουμε την μορφή της εκτύπωσης.
Η python δίνει την δυνατότητα μορφοποίησης της εκτύπωσης αριθμών (ή οτιδήποτε άλλης μεταβλητής). Χειρίζεται τη μορφοποίηση μετατρέποντάς τις τιμές των μεταβλητών πρώτα σε συμβολοσειρές και φέρνοντας τις συμβολοσειρές στην μορφή ακριβώς που θα θέλαμε θα δούμε το εκτυπωμένο αποτέλεσμα.
Η συμβολοσειρά την οποία θέλουμε τελικά να τυπώσουμε διαμορφώνεται με την μέθοδο format
.
Για παράδειγμα, θα μπορούσαμε να βάλουμε έναν ακέραιο i=5 ανάμεσα σε δύο κενά ως εξής:
>>> i = 5
>>> " {} ".format(i)
' 5 '
Η συμβολοσειρά ' {} '
περιέχει δύο κενά στα άκρα, ενώ ενδιάμεσα υπάρχει θέση για την τιμή μίας μεταβλητής. Με την μέθοδο format
εισήχθει η τιμή της μεταβλητής και έγινε η τελική διαμόρφωση.
Μπορούμε να τυπώσουμε έναν ακέραιο σε πεδίο καθορισμένο μήκους.
Δηλώνουμε ότι αναμένουμε εκτύπωση ακεραίου με τον διακριτικό χαρακτήρα d
.
Θα τυπώσουμε διαδοχικά ακεραίους σε πεδίο πέντε θέσεων (με ευθυγράμμιση στα δεξιά του πεδίου):
for i in range(0,20,4):
s = '{:5d}'.format(i)
print(s)
ή, σε πιο συμπαγή μορφή:
for i in range(0,20,4):
print('{:5d}'.format(i))
for i in range(0,20,4):
print('{:5d} {:7d}'.format(i,i**2))
for i in range(10):
print('{:5d} - {:7d}'.format(i,i**2))
Δηλώνουμε ότι αναμένουμε εκτύπωση float με τον διακριτικό χαρακτήρα f
.
Επίσης, χρησιμοποιούμε τον διακριτικό χαρακτήρα e
για floats με επιστημονικό συμβολισμό (scientific notation).
>>> '{:f}'.format(3.141592653589793)
'3.141593'
>>> '{:6.2f}'.format(3.141592653589793)
' 3.14'
Για την εκτύπωση ενός float χρειαζόμαστε αρκετές περισσότερες θέσεις από το πλήθος των δεκαδικών του ψηφίων. Χρειαζόμαστε τουλάχιστον μία θέση για το ακέραιο μέρος, μία θέση για την υποδιαστολή και πιθανόν μία θέση για το πρόσημο (εφόσον πρόκειται για αρνητικό αριθμό).
>>> a = 42.5
>>> '{:+6.2f}'.format(a)
'+42.50'
>>> a = -42.5
>>> '{:+6.2f}'.format(a)
'-42.50'
e
.
Θα τυπώσουμε την ταχύτητα του φωτός.
>>> c = 299792458
>>> '{:11.4e}'.format(c)
' 2.9979e+08'
>>> '{:11.4e} m/sec'.format(c)
' 2.9979e+08 m/sec'
Δηλώνουμε την εκτύπωση string με τον διακριτικό χαρακτήρα s
.
Μπορούμε όμως και να παραλήψουμε τον διακριτικό χαρακτήρα.
Μπορούμε να τυπώσουμε μία συμβολοσειρά σε πεδίο μεγαλύτερο από το μήκος της, ή να την περικόψουμε κατά την εκτύπωση.
>>> '{:15s}'.format('abrakatabra')
'abrakatabra '
>>> '{:15}'.format('abrakatabra')
'abrakatabra '
>>> '{:>15}'.format('abrakatabra')
' abrakatabra'
>>> '{:^15}'.format('abrakatabra')
' abrakatabra '
>>> '{0:-<6}{1:-<6}{2:-<6}'.format('abra','kat','abra')
'abra--kat---abra--'
>>> '{:.7}'.format('abrakatabra')
'abrakat'
>>> a = 1
>>> b = 2
>>> '{0:5d} {1:5d}'.format(a,b)
' 1 2'
>>> '{1:5d} {0:5d}'.format(a,b)
' 2 1'
>>> '{0:}{1:}{0:}'.format('abra','kat')
'abrakatabra'
{[position]:[flags][width][.precision][type]}
format
.
'{:{width}.{prec}f}'.format(2.7182, width=5, prec=2)
Βελτιώστε την συνάρτηση που φτιάξατε στην προηγούμενη άσκηση χρησιμοποιώντας την μέθοδο που είδατε σε αυτή την άσκηση.