Aby przekonwertować (sformatować) liczbę lub ciąg znaków na różne formaty w Pythonie, użyj wbudowanej funkcji format() lub metody łańcuchowej str.format().
W tym rozdziale wyjaśnimy, jak korzystać z następujących funkcji.
- funkcja wbudowana (np. w języku programowania)
format()
- metoda łańcuchowa
str.format()
Dodatkowo wyjaśniony jest ciąg specyfikacji formatu do konwersji do następującego formatu wraz z przykładowym kodem.
- Wyjustowane do lewej, Wyjustowane do środka, Wyjustowane do prawej
- wypełnienie zerowe
- Znak (plus lub minus)
- Separator cyfr (przecinek, podkreślnik)
- Liczby binarne, ósemkowe i szesnastkowe
- Określenie liczby cyfr po przecinku dziesiętnym
- Cyfry znaczące (liczba cyfr znaczących)
- notacja wykładnicza
- Wyświetlanie procentowe
Zauważ, że od Pythona 3.6 do metody łańcuchowej str.format() zostały dodane łańcuchy znaków (f-strings), aby uczynić ją bardziej zwięzłą.
- Wbudowana funkcja: format()
- Metoda łańcuchowa str.format()
- Wyjustowane do lewej, Wyjustowane do środka, Wyjustowane do prawej
- 0 wypełnienie
- Znak (plus lub minus)
- Separator cyfr (przecinek, podkreślnik)
- Liczby binarne, ósemkowe i szesnastkowe
- Określenie liczby cyfr po przecinku dziesiętnym
- notacja wykładnicza
- Cyfry znaczące (liczba cyfr znaczących)
- Wyświetlanie procentowe
Wbudowana funkcja: format()
format() jest dostarczana jako standardowa wbudowana funkcja Pythona.
Konspekt jest następujący.
format(value, format_spec)
- Pierwszy argument:.
value
Oryginalna wartość. String str, number int, float, itd. - Drugi argument
format_spec
Specyfikacja formatu łańcucha. Łańcuch str - Wartość zwracana: sformatowany łańcuch str
- Pierwszy argument:.
Przykłady są pokazane poniżej. Typy łańcuchów formatujących i sposób ich zapisu opisane są w dalszej części instrukcji.
W tym przykładzie użyliśmy literałów numerycznych i literałów łańcuchowych jako pierwszego argumentu, ale oczywiście możesz użyć zmiennych, które zawierają te wartości.
s = format(255, '04x')
print(s)
print(type(s))
# 00ff
# <class 'str'>
print(format('center', '*^16'))
# *****center*****
Metoda łańcuchowa str.format()
Istnieje również metoda format() dla typu string str.
{} w łańcuchu str, który wywołuje metodę format() jest nazywane polem zastępczym i jest zastępowane przez argument metody format().
Łańcuch specyfikacji formatu powinien być zapisany w polu zastępczym {}, po którym następuje „:”.
Wartością zwrotną jest sformatowany łańcuch znaków str.
Proces równoważny do opisanej powyżej wbudowanej funkcji format() wygląda następująco.
s = '{:04x}'.format(255)
print(s)
print(type(s))
# 00ff
# <class 'str'>
print('{:*^16}'.format('center'))
# *****center*****
Ponownie, używamy literałów numerycznych i literałów łańcuchowych jako argumentów, ale oczywiście zmienne są również akceptowalne.
Określanie argumentów dla pól substytucji
Określ argumenty w kolejności (domyślnie)
Może istnieć wiele pól zastępczych {}, a domyślnie, argumenty metody są przetwarzane w kolejności. Jeśli łańcuch specyfikacji formatu w {} jest pominięty, to zostanie on po prostu przekonwertowany na łańcuch przez str().
Użyteczne do wstawiania zmiennych wartości do łańcucha i ich drukowania.
print('{}-{}-{}'.format('100', '二百', 300))
# 100-二百-300
Określenie argumentu pozycyjnego dla wartości całkowitych
Jeśli w {} podano wartość całkowitą, taką jak {0} lub {1}, to wynik będzie zależał od kolejności argumentów. Ta sama liczba może być użyta wielokrotnie. Jest to przydatne, gdy chcesz wstawić tę samą wartość do łańcucha.
print('{0}-{1}-{0}'.format('foo', 'bar'))
# foo-bar-foo
Określenie argumentów słów kluczowych dla dowolnych nazw (łańcuchów)
Możesz także określić dowolną nazwę w {} i podać ją jako argument słowa kluczowego.
print('{day}/{month}/{year}/'.format(day=11, month=1, year=2018))
# 11/1/2018
Podanie listy lub słownika jako argumentu
Listy i słowniki mogą być podawane jako argumenty.
Użyj [] by określić indeks listy lub klucz słownika w polu zastępczym. Zauważ, że cudzysłowy „'” i „” nie są używane do określania kluczy słownika.
Jeśli chcesz użyć tego samego argumentu wielokrotnie, musisz podać wartość całkowitą lub łańcuch (nazwę), jak opisano powyżej.
l = ['one', 'two', 'three']
print('{0[0]}-{0[1]}-{0[2]}'.format(l))
# one-two-three
d1 = {'name': 'Alice', 'age': 20}
d2 = {'name': 'Bob', 'age': 30}
print('{0[name]} is {0[age]} years old.\n{1[name]} is {1[age]} years old.'.format(d1, d2))
# Alice is 20 years old.
# Bob is 30 years old.
Może być interpretowany jako argument pozycyjny przez dołączenie * do listy i podanie go jako argumentu, lub jako argument słowa kluczowego przez dołączenie ** do słownika i podanie go jako argumentu.
l = ['one', 'two', 'three']
print('{}-{}-{}'.format(*l))
# one-two-three
d = {'name': 'Alice', 'age': 20}
print('{name} is {age} years old.'.format(**d))
# Alice is 20 years old.
Opis nawiasów klamrowych {}
Jeśli chcesz napisać nawiasy klamrowe {,} w metodzie format(), powtórz je dwa razy jak {{,}}}. Zauważ, że backslashe nie mogą być escape'owane.
print('{{}}-{num}-{{{num}}}'.format(num=100))
# {}-100-{100}
sformatowany ciąg
W obu przypadkach, aby określić format, napisz „:łańcuch formatu” po wartości całkowitej lub łańcuchu nazwy w {}.
print('{num:x}'.format(num=255))
# ff
print('{day}/{month:02}/{year:02}/'.format(day=11, month=1, year=2018))
# 11/01/2018
Poniżej wyjaśnimy, jak określić format za pomocą łańcucha formatu. Przykładowy kod używa metody łańcuchowej str.format(), ale ten sam łańcuch formatu może być użyty za pomocą wbudowanej funkcji format(). W wbudowanej funkcji format(), łańcuch specyfikacji formatu jest określany jako drugi argument.
Wyjustowane do lewej, Wyjustowane do środka, Wyjustowane do prawej
Możesz wyrównać do lewej, do środka, do prawej itd. poniżej. Określ całkowitą liczbę znaków jako liczbę.
<
^
>
print('left : {:<10}'.format(100))
print('center: {:^10}'.format(100))
print('right : {:>10}'.format(100))
# left : 100
# center: 100
# right : 100
Można również określić znak, który ma zostać wypełniony. Jeśli zostanie pominięty, jak w powyższym przykładzie, jest to spacja.
Można używać znaków dwubajtowych pod warunkiem, że jest to pojedynczy znak.
print('left : {:*<10}'.format(100))
print('center: {:a^10}'.format(100))
print('right : {:鬼>10}'.format(100))
# left : 100*******
# center: aaa100aaaa
# right : 鬼鬼鬼鬼鬼鬼鬼100
Wyrównanie do prawej za pomocą > nie uwzględnia znaku (-,+). Jeśli użyjesz =, to po znaku następuje podany znak. Jeżeli chcesz określić +, to napisz + po =. Szczegóły przetwarzania znaków są opisane później.
print('sign: {:0>10}'.format(-100))
print('sign: {:0=10}'.format(-100))
print('sign: {:0=+10}'.format(100))
# sign: 000000-100
# sign: -000000100
# sign: +000000100
<, ^, i > mogą być określone dla łańcuchów, ale = spowoduje błąd ValueError. Jeśli chcesz użyć = dla łańcucha, musisz przekonwertować go na liczbę używając int().
# print('sign: {:0=10}'.format('-100'))
# ValueError: '=' alignment not allowed in string format specifier
print('sign: {:0=10}'.format(int('-100')))
# sign: -000000100
To samo dotyczy liczb zmiennoprzecinkowych. Punkty dziesiętne są również liczone jako znak.
print('left : {:*<10}'.format(1.23))
print('center: {:a^10}'.format(1.23))
print('right : {:鬼>10}'.format(1.23))
# left : 1.23******
# center: aaa1.23aaa
# right : 鬼鬼鬼鬼鬼鬼1.23
print('sign: {:0>10}'.format(-1.23))
print('sign: {:0=10}'.format(-1.23))
print('sign: {:0=+10}'.format(1.23))
# sign: 00000-1.23
# sign: -000001.23
# sign: +000001.23
Listy, tuple, itp. spowodują błąd, jeśli zostaną podane jako takie, i mogą zostać przekonwertowane na łańcuchy przy użyciu funkcji str().
l = [0, 1]
print(type(l))
# <class 'list'>
# print('{:*^16}'.format(l))
# TypeError: unsupported format string passed to list.__format__
print(type(str(l)))
# <class 'str'>
print('{:*^16}'.format(str(l)))
# *****[0, 1]*****
Dla funkcji left-justified, center-justified i right-justified istnieją również dedykowane metody łańcuchowe o nazwach ljust(), center() i rjust().
0 wypełnienie
Jeśli chcesz dostosować liczbę cyfr przez wypełnianie zera, ustaw znak do wypełnienia na 0 i wyjustuj go do prawej.
W przypadku wypełniania zera, jeśli pominięto symbol wyrównania, jest ono przetwarzane tak, jakby podano =.
print('zero padding: {:0=10}'.format(100))
print('zero padding: {:010}'.format(100))
# zero padding: 0000000100
# zero padding: 0000000100
print('zero padding: {:0=10}'.format(-100))
print('zero padding: {:010}'.format(-100))
# zero padding: -000000100
# zero padding: -000000100
=Jeśli podasz ciąg znaków jako argument, jak opisano powyżej, otrzymasz błąd. Bądźmy ostrożni.
# print('zero padding: {:010}'.format('-100'))
# ValueError: '=' alignment not allowed in string format specifier
Do wypełniania zera istnieje również dedykowana metoda łańcuchowa o nazwie zfill().
Znak (plus lub minus)
Domyślnie tylko liczby ujemne są oznaczane znakiem (minus-).
Po dodaniu znaku + do łańcucha specyfikacji formatowania, znak (plus +) jest również wyświetlany dla liczb dodatnich. Jeżeli dodana jest spacja, to spacja jest wyświetlana na początku liczby dodatniej, a liczba cyfr jest wyrównywana do liczby ujemnej.
print('sign: {}'.format(100))
print('sign: {}'.format(-100))
# sign: 100
# sign: -100
print('sign: {:+}'.format(100))
print('sign: {:+}'.format(-100))
# sign: +100
# sign: -100
print('sign: {: }'.format(100))
print('sign: {: }'.format(-100))
# sign: 100
# sign: -100
Należy uważać przy wypełnianiu arbitralnymi znakami, takimi jak wspomniane wyżej wypełnianie zerem. Domyślnie, bez + i bez spacji, wypełnia liczby dodatnie jeszcze jednym znakiem.
print('sign: {:06}'.format(100))
print('sign: {:06}'.format(-100))
# sign: 000100
# sign: -00100
print('sign: {:+06}'.format(100))
print('sign: {:+06}'.format(-100))
# sign: +00100
# sign: -00100
print('sign: {: 06}'.format(100))
print('sign: {: 06}'.format(-100))
# sign: 00100
# sign: -00100
Jeżeli stosowany jest symbol wyrównania, to symbol oznaczenia znaku powinien być wpisany po symbolu wyrównania.
print('sign: {:_>6}'.format(100))
print('sign: {:_>6}'.format(-100))
# sign: ___100
# sign: __-100
print('sign: {:_>+6}'.format(100))
print('sign: {:_>+6}'.format(-100))
# sign: __+100
# sign: __-100
print('sign: {:_> 6}'.format(100))
print('sign: {:_> 6}'.format(-100))
# sign: __ 100
# sign: __-100
Separator cyfr (przecinek, podkreślnik)
Dodaj przecinek lub podkreślenie _ separator co trzy cyfry. Sprawia to, że duże liczby są łatwiejsze do odczytania. Zwróć uwagę, że underscore_ jest opcją dodaną w Pythonie 3.6, więc nie można jej używać we wcześniejszych wersjach.
print('{:,}'.format(100000000))
# 100,000,000
print('{:_}'.format(100000000))
# 100_000_000
W przypadku liczb zmiennoprzecinkowych typu float delimitowana jest tylko część całkowita.
print('{:,}'.format(1234.56789))
# 1,234.56789
Liczby binarne, ósemkowe i szesnastkowe
Konwertuje wartości liczbowe na liczby binarne, ósemkowe i szesnastkowe dla wyjścia.
b
: Binaryo
: Octald
: Decimalx
,X
: Hexadecimal (wielkie litery są kapitalizowane)
print('bin: {:b}'.format(255))
print('oct: {:o}'.format(255))
print('dec: {:d}'.format(255))
print('hex: {:x}'.format(255))
print('HEX: {:X}'.format(255))
# bin: 11111111
# oct: 377
# dec: 255
# hex: ff
# HEX: FF
Może być również połączony z wypełnieniem 0 i jest często używany do wyrównywania cyfr w notacji binarnej i szesnastkowej.
print('bin: {:08b}'.format(255))
print('oct: {:08o}'.format(255))
print('dec: {:08d}'.format(255))
print('hex: {:08x}'.format(255))
print('HEX: {:08X}'.format(255))
# bin: 11111111
# oct: 00000377
# dec: 00000255
# hex: 000000ff
# HEX: 000000FF
Należy zwrócić uwagę, że liczba znaków wypełnienia zerowego musi być określona z uwzględnieniem prefiksu.
print('bin: {:#010b}'.format(255))
print('oct: {:#010o}'.format(255))
print('dec: {:#010d}'.format(255))
print('hex: {:#010x}'.format(255))
print('HEX: {:#010X}'.format(255))
# bin: 0b11111111
# oct: 0o00000377
# dec: 0000000255
# hex: 0x000000ff
# HEX: 0X000000FF
W przypadku liczb binarnych i szesnastkowych można wstawić tylko separator cyfr podkreślenie _ (Python 3.6 lub nowszy). Używany jest separator 4-cyfrowy; liczba znaków wypełnionych zerem musi uwzględniać także liczbę podkreśleń.
print('hex: {:08x}'.format(255))
print('hex: {:09_x}'.format(255))
print('hex: {:#011_x}'.format(255))
# hex: 000000ff
# hex: 0000_00ff
# hex: 0x0000_00ff
Tylko typ całkowity int może przekonwertować format na binarny lub szesnastkowy. Możesz użyć int(), aby przekonwertować go na liczbę.
# print('hex: {:08x}'.format('255'))
# ValueError: Unknown format code 'X' for object of type 'str'
print('hex: {:08x}'.format(int('255')))
# hex: 000000ff
Określenie liczby cyfr po przecinku dziesiętnym
Aby określić liczbę cyfr po przecinku, wykonaj następujące czynności: n jest liczbą cyfr. Liczba cyfr po przecinku jest równa podanej liczbie cyfr, niezależnie od liczby cyfr w części całkowitej..[n]f
print('{:.2f}'.format(123.456))
print('{:.5f}'.format(123.456))
print('{:.3f}'.format(0.0001234))
# 123.46
# 123.45600
# 0.000
Lewa strona kropki dziesiętnej może zostać określona jako wyrównana do lewej, wyrównana do środka, wyrównana do prawej lub wypełniona zerem, jak opisano powyżej. Jeśli liczba cyfr wartości docelowej jest większa niż podana, nic nie jest wykonywane. Jeśli liczba cyfr w wartości docelowej jest większa niż podana, nic nie jest wykonywane.
print('{:>12.5f}'.format(123.456))
print('{:012.5f}'.format(123.456))
print('{:06.5f}'.format(123.456))
# 123.45600
# 000123.45600
# 123.45600
Jeśli podasz liczbę cyfr mniejszą niż oryginalna liczba cyfr po przecinku, wartość zostanie zaokrąglona. Zauważ, że nie jest to zaokrąglanie do najbliższej liczby całkowitej, ale do liczby parzystej, np. 0.5 jest zaokrąglane do 0.
print('{:.0f}'.format(0.4))
print('{:.0f}'.format(0.5))
print('{:.0f}'.format(0.6))
# 0
# 0
# 1
Jeśli chcesz użyć ogólnego zaokrąglenia, możesz użyć metody quantize() biblioteki standardowej decimal.
notacja wykładnicza
Kiedy liczba zmiennoprzecinkowa float jest konwertowana na łańcuch str, zostanie ona automatycznie zapisana w notacji wykładniczej w zależności od liczby cyfr. Typ całkowity int tego nie robi.
print('{}'.format(0.0001234))
print('{}'.format(0.00001234))
# 0.0001234
# 1.234e-05
print('{}'.format(1234000000000000.0))
print('{}'.format(12340000000000000.0))
print('{}'.format(12340000000000000000000000))
# 1234000000000000.0
# 1.234e+16
# 12340000000000000000000000
Jeśli w łańcuchu specyfikacji formatowania określisz e lub E, zawsze możesz dokonać konwersji na notację wykładniczą. Znakami użytymi na wyjściu będą odpowiednio e i E.
print('{:e}'.format(0.0001234))
print('{:E}'.format(0.0001234))
# 1.234000e-04
# 1.234000E-04
Możliwe jest również określenie liczby cyfr po przecinku. Część całkowita zawsze będzie miała jedną cyfrę, a po przecinku będzie podana liczba cyfr.
print('{:.5e}'.format(0.0001234))
print('{:.2E}'.format(0.0001234))
# 1.23400e-04
# 1.23E-04
print('{:.5e}'.format(987.65))
print('{:.2E}'.format(987.65))
# 9.87650e+02
# 9.88E+02
Należy pamiętać, że w przypadku wybrania opcji wyrównania do lewej, wyrównania do środka, wyrównania do prawej lub wypełnienia do zera, znaki e-, E+ itd. będą również liczone jako cyfry (znaki).
print('{:>12.5e}'.format(987.65))
print('{:012.2E}'.format(987.65))
# 9.87650e+02
# 00009.88E+02
Cyfry znaczące (liczba cyfr znaczących)
Możesz określić całkowitą liczbę cyfr, wykonując następujące czynności W zależności od wyniku, notacja wykładnicza zostanie użyta automatycznie. Zwróć uwagę, że końcowe zera po przecinku dziesiętnym zostaną pominięte..[n]g
print('{:.2g}'.format(123.456))
print('{:.3g}'.format(123.456))
print('{:.8g}'.format(123.456))
print('{:.3g}'.format(0.0001234))
# 1.2e+02
# 123
# 123.456
# 0.000123
Jeśli pominiesz g, to wynik nie będzie liczbą całkowitą. g jest takie samo w większości przypadków, ale tylko w tych, w których wynik jest liczbą całkowitą.
print('{:.2}'.format(123.456))
print('{:.3}'.format(123.456))
print('{:.8}'.format(123.456))
print('{:.3}'.format(0.0001234))
# 1.2e+02
# 1.23e+02
# 123.456
# 0.000123
Jeśli przetworzymy tę samą wartość, otrzymamy odpowiednio następujące wyniki.
print('{:.3f}'.format(123.456))
print('{:.3e}'.format(123.456))
print('{:.3g}'.format(123.456))
print('{:.3}'.format(123.456))
# 123.456
# 1.235e+02
# 123
# 1.23e+02
print('{:.8f}'.format(123.456))
print('{:.8e}'.format(123.456))
print('{:.8g}'.format(123.456))
print('{:.8}'.format(123.456))
# 123.45600000
# 1.23456000e+02
# 123.456
# 123.456
W przypadku g lub jeśli jest ono pominięte, pomijane są końcowe zera po przecinku, więc jeśli chcesz uzyskać tę samą liczbę cyfr znaczących (liczbę cyfr znaczących), użyj notacji wykładniczej e lub E. Część całkowita jest zawsze jedną cyfrą, a przecinek dziesiętny określoną liczbą cyfr, więc jeśli chcesz uzyskać n cyfr znaczących, podaj po prostu n-1.
print('{:.4e}'.format(123.456))
print('{:.4e}'.format(0.000012345))
print('{:.4e}'.format(12))
# 1.2346e+02
# 1.2345e-05
# 1.2000e+01
Wyświetlanie procentowe
Jeżeli % jest określone w łańcuchu specyfikacji formatowania, to wartość liczbowa float lub int jest mnożona przez 100 i konwertowana na łańcuch z %.
Możliwe jest również określenie liczby cyfr po przecinku dziesiętnym. Domyślnie jest to sześć cyfr po przecinku. Dostępne są również opcje wyrównania do lewej, wyrównania do środka, wyrównania do prawej oraz wypełnienia do zera. Znak % jest również liczony jako znak.
print('{:%}'.format(0.12345))
print('{:.2%}'.format(0.12345))
# 12.345000%
# 12.35%
print('{:%}'.format(10))
print('{:.2%}'.format(10))
# 1000.000000%
# 1000.00%
print('{:>7.2%}'.format(0.12345))
print('{:07.2%}'.format(0.12345))
# 12.35%
# 012.35%