|
Rozdział 6: Wejście i wyjście 1: Ładniejsze formatowanie wyjścia
- 2: Czytanie z i pisanie do plików - 3: Metody obiektów pliku
- 4: Moduł pickle
Lekcja 1: Ładniejsze formatowanie wyjścia
Dla odprężnia pomówimy teraz o operacjach wejścia i wyjścia, czyli o sposobach porozumiewania się programu ze światem zewnętrznym, tzn. z użytkownikiem siedzącym przed ekranem i klawiturą a także z pamięcią zewnętrzną - czyli np. z dyskiem magnetycznym(po to by zapisać na nim lub z innego odczytać jakieś dane).
Do tej pory spotkaliśmy się z dwoma sposobami wypisywania wartości: instrukcje wyrażenia i instrukcja print (trzecim sposobem jest metoda write() należąca do obiektu pliku. Standardowym obiektem standardowego pliku wyjściowego jest sys.stdout.
Często chce się mieć większy wpływ na format drukowania wyniku, niż proste wiersze wartości oddzielonych spacjami. Istnieją dwa sposoby formatowania wyniku. Pierwszym jest przejęcie na własną odpowiedzialność wszelkich czynności związanych z napisami: używa się wycinania napisów i sklejania w ten sposób, że tworzy się taki format wydruku, jaki przyjdzie do głowy. Standardowy moduł string zawiera parę użytecznych operacji na napisach, jak rozszerzanie napisów do żądanej szerokości kolumny itd. Drugim sposobem jest użycie operatora % z napisem jako lewy argument. Operator % interpretuje lewy argument w podobny sposób jak funkcja C sprintf():, jak format stylu, który zostanie zastosowany do argumentów po prawej stronie tego operatora, a wynik zwracany jest w postaci napisu.
Oczywiście, pozostaje jedno pytanie:, jak przekształca się wartości w napisy? Na szczęście, Python zna sposób, aby przekształcić dowolną wartość w napis: funkcja repr() lub umieszczenie wartośći pomiędzy odwrotnymi apostrofami (``). Oto parę przykładów:
>>> x = 10 * 3.14
>>> y = 200*200
>>> s = 'Wartoscia x jest ' + `x` + ', a y jest ' + `y` + '...'
>>> print s
Wartością x jest 31.4, a y jest 40000...
>>> # Odwrotne apostrofy działają także na inne wartości niż liczby:
... p = [x, y]
>>> ps = repr(p)
>>> ps
'[31.4, 40000]'
>>> # Przekształcenie napisu powoduje dodanie apostrofów i ukośników:
... hello = 'hello, world\n'
>>> hellos = `hello`
>>> print hellos
'hello, world\012'
>>> # Argumentem odwrotnych apostrofów może być lista niemutowalna:
... `x, y, ('tulipan', 'roza')`
"(31.4, 40000, ('tulipan', 'roza'))"
Oto dwa sposoby na wypisanie kwadratów i sześcianów liczb:
>>> import string
>>> for x in range(1, 11):
... print string.rjust(`x`, 2), string.rjust(`x*x`, 3),
... # Zauważ przyklejony na końcu przecinek w poprzednim wierszu
... print string.rjust(`x*x*x`, 4)
...
1 1 1
2 4 8
3 9 27
4 16 64
5 25 125
6 36 216
7 49 343
8 64 512
9 81 729
10 100 1000
>>> for x in range(1,11):
... print '%2d %3d %4d' % (x, x*x, x*x*x)
...
1 1 1
2 4 8
3 9 27
4 16 64
5 25 125
6 36 216
7 49 343
8 64 512
9 81 729
10 100 1000
(Spacje pomiędzy kolumnami zostały dodane przez instrukcje print: zawsze dodaje spację pomiędzy argumentami.)
W powyższym prztkładzie została wykorzystana funkcja string.rjust(), która justuje do prawej napis w polu o podanej szerokości poprzez dodanie spacji z lewej strony. Podobna do niej są funkcje string.ljust() i string.center(). Funkcje te niczego nie wypisują, po prostu zwracają nowy napis. Jeżeli napis wejściowy jest zbyt duży, nie skracają go, lecz zwracają nietknięty. Pomiesza to trochę w wyglądzie kolumn ale zwykle jest to lepsza alternatywa od pokazywania fałszywej wartości (jeśli naprawdę chce się skrócić napis można zawsze dodać operację wycinania, np. "string.ljust(x, n)[0:n]").
Istnieje funkcja, która uzupełnia z lewej strony napis numeryczny zerami, a mianowicie string.zfill(). Rozumie ona znaki plus i minus:
>>> import string
>>> string.zfill('12', 5)
'00012'
>>> string.zfill('-3.14', 7)
'-003.14'
>>> string.zfill('3.14159265359', 5)
'3.14159265359'
Użycie operatora % wygląda następująco:
>>> import math
>>> print 'Wartoscia PI jest w przyblizeniu %5.3f.' % math.pi
Wartoscia PI jest w przyblizeniu 3.142.
Jeżeli podano więcej niż jeden format w napisie, jako prawy operand podaje się krotkę wartości, np.:
>>> tabela = {'Sebastian': 4127, 'Jacek': 4098, 'Darek': 7678}
>>> for nazwa, telefon in tabela.items():
... print '%-10s ==> %10d' % (nazwa, telefon)
...
Jacek ==> 4098
Darek ==> 7678
Sebastian ==> 4127
Większość formatów działa dokładnie tak samo jak w C i wymaga podania właściwego typu, aczkolwiek jeżeli nie zastosuje się do tego, to w wyniku dostaje się wyjątek, a nie zrzut obrazu pamięci i przerwanie działania programu. Format %s jest bardziej tolerancyjny: jeżeli odpowiadający mu argument nie jest napisem, przekształcany jest w napis za pomocą wbudowanej funkcji str(). Można użyć * do podania szerokości lub precyzji w oddzielnym (liczba całkowita) argumencie. Formaty C %n i %p nie są obsługiwane.
Jeśli posiadasz już naprawdę długi napis formatujący, którego nie chce się dzielić, lepiej odnosić się wprost do zmiennych będących formatowanymi, zamiast do ich pozycji na liście argumentów. Można to osiągnąć poprzez użycie rozszerzenia w stosunku do formatów C w formie %(nazwa)format , tzn.:
>>> tabela = {'Sebastian': 4127, 'Jacek': 4098, 'Darek': 8637678}
>>> print 'Jacek: %(Jacek)d; Sebastian: %(Sebastian)d; Darek: %(Darek)d' % tabela
Jacek: 4098; Sebastian: 4127; Darek: 8637678
Jest to szczególnie użyteczne w połączeniu z nową funkcją wbudowaną vars(), która zwraca słownik zawierający wszystkie zmienne lokalne.
|
|