W przypadku projektu w jednej z moich klas musimy wyjść numery do pięciu miejsc dziesiętnych W przypadku pływaków wiem, że to tylko:

print "%0.5f"%variable_name

Czy jest coś podobnego do numerów złożonych?

20
island_hopper 13 październik 2011, 00:27

5 odpowiedzi

Najlepsza odpowiedź

W przypadku takich pytań, Dokumentacja Pythona powinna być pierwszym przystankiem. W szczególności, spójrz na sekcję na formatowanie łańcuchów. Wyświetla wszystkie kody formatu strunowego; Nie ma jednej dla numerów złożonych.

Co możesz zrobić, jest formatować prawdziwe i wyimaginowane części liczby oddzielnie, przy użyciu x.real i x.imag i wydrukuj go w a + bi.

5
David Z 12 październik 2011, 20:34

Możesz to zrobić, jak pokazano poniżej przy użyciu metody str.format():

>>> n = 3.4+2.3j
>>> n
(3.4+2.3j)
>>> '({0.real:.2f} + {0.imag:.2f}i)'.format(n)
'(3.40 + 2.30i)'
>>> '({c.real:.2f} + {c.imag:.2f}i)'.format(c=n)
'(3.40 + 2.30i)'

Aby prawidłowo obsłużyć zarówno pozytywne, jak i negatywne części wyimaginowane, potrzebowałbyś (jeszcze bardziej) skomplikowanej operacji formatowania:

>>> n = 3.4-2.3j
>>> n
(3.4-2.3j)
>>> '({0:.2f} {1} {2:.2f}i)'.format(n.real, '+-'[n.imag < 0], abs(n.imag))
'(3.40 - 2.30i)'

Aktualizacja - łatwiejszy sposób

Chociaż ty nie może Użyj f jako typ prezentacji dla numerów złożonych za pomocą operatora formatowania łańcucha %:

n1 = 3.4+2.3j
n2 = 3.4-2.3j

try:
    print('test: %.2f' % n1)
except Exception as exc:
    print('{}: {}'.format(type(exc).__name__, exc))

Wynik:

TypeError: float argument required, not complex

Możesz być , jednak użyj go z liczbami złożonymi za pomocą metody {x0}}. Nie jest to wyraźnie udokumentowane, ale jest dorozumiany przez Format Specyfikacja mini-języka Dokumentacja, która mówi:

'f' Naprawiono punkt. Wyświetla numer jako numer stacjonarny. Domyślna precyzja to 6.

. . . To łatwo przeoczyć. W konkretnych warunkach następujące prace w Pythonie 2.7.14 i 3.4.6:

print('n1: {:.2f}'.format(n1))
print('n2: {:.2f}'.format(n2))

Wynik:

n1: 3.10+4.20j
n2: 3.10-4.20j

Nie daje tego całkowitej kontroli Kod w mojej oryginalnej odpowiedzi, ale z pewnością jest znacznie bardziej zwięzły (automatycznie obsługuje zarówno dodatnie, jak i negatywne wyimaginowane części).

Aktualizacja 2 - F-Struny

Dodano do F-Strings, umożliwiając napisanie:

print(f'{n1=:.2f}')  # -> n1=3.40+2.30j
print(f'{n2=:.3f}')  # -> n2=3.400-2.300j
29
martineau 27 październik 2019, 02:39

Ani Operacje formatowania string - IE Modulo ({{ X0}}) Operator) - Ani nowsze str.format() Format Składnia ciągu Wspieraj typy złożone. Jednak możliwe jest wywołanie metody __format__ wszystkich zbudowanych typów numerycznych bezpośrednio. Oto przykład:

>>> i = -3 # int
>>> l = -33L # long (only Python 2.X)
>>> f = -10./3 # float
>>> c = - 1./9 - 2.j/9 # complex
>>> [ x.__format__('.3f') for x in (i, l, f, c)]
['-3.000', '-33.000', '-3.333', '-0.111-0.222j']

Uwaga, że to dobrze działa z negatywnymi częściami wyimaginowanymi.

4
martink 21 wrzesień 2014, 04:58
>>> n = 3.4 + 2.3j
>>> print '%05f %05fi' % (n.real, n.imag)
3.400000 2.300000i
3
Facundo Casco 12 październik 2011, 20:37

Od Pythona 2.6 możesz określić, jak obiekty własnych klas odpowiadają na ciągi formatu. Możesz więc zdefiniować podklasę complex, która może być sformatowana. Oto przykład:

>>> class Complex_formatted(complex):
...     def __format__(self, fmt):
...         cfmt = "({:" + fmt + "}{:+" + fmt + "}j)"
...         return cfmt.format(self.real, self.imag)
... 
>>> z1 = Complex_formatted(.123456789 + 123.456789j)
>>> z2 = Complex_formatted(.123456789 - 123.456789j)
>>> "My complex numbers are {:0.5f} and {:0.5f}.".format(z1, z2)
'My complex numbers are (0.12346+123.45679j) and (0.12346-123.45679j).'
>>> "My complex numbers are {:0.6f} and {:0.6f}.".format(z1, z2)
'My complex numbers are (0.123457+123.456789j) and (0.123457-123.456789j).'

Obiekty tej klasy zachowują się dokładnie niż complex numery, z wyjątkiem korzystania z większej ilości miejsca i operacyjnych; Czytelnik Uważaj.

1
FutureNerd 2 sierpień 2014, 23:36