Форматирование комплексных номеров
Для проекта в одном из моих классов мы должны выводить числа до пяти знаков после запятой. Возможно, что выход будет сложным числом, и я не могу понять, как выводить комплексное число с пятью знаками после запятой, Для плавающих я знаю, что это просто:
print "%0.5f"%variable_name
Есть ли что-то подобное для комплексных чисел?
Ответы
Ответ 1
Для таких вопросов Документация на Python должна быть вашей первой остановкой. В частности, посмотрите раздел форматирование строк. В нем перечислены все коды форматирования строк; для комплексных чисел не существует.
Что вы можете сделать, отформатируйте реальную и мнимую части номера отдельно, используя x.real
и x.imag
, и распечатайте его в форме a + bi
.
Ответ 2
Вы можете сделать это, как показано ниже, используя метод 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)'
Для правильной обработки как положительных, так и отрицательных мнимых частей вам понадобится (даже более) сложная операция форматирования:
>>> 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)'
Обновление - более простой способ
Хотя не может использовать f
в качестве типа представления для сложных чисел с помощью оператора форматирования строк %
:
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))
Вывод:
TypeError: float argument required, not complex
Вы можете использовать его с комплексными числами с помощью метода str.format()
. Это явно не задокументировано, но подразумевается Документация по спецификации формата Mini-Language, в которой говорится:
'f'
Фиксированная точка. Отображает номер как номер фиксированной точки. Точность по умолчанию 6
.
.,. Так легко пропустить.
В конкретных терминах в Python 2.7.14 и 3.4.6 выполняются следующие действия:
print('n1: {:.2f}'.format(n1))
print('n2: {:.2f}'.format(n2))
Вывод:
n1: 3.10+4.20j
n2: 3.10-4.20j
Это не дает вам полного контроля над кодом в моем первоначальном ответе, но это, безусловно, гораздо более кратким (и автоматически обрабатывает как положительные, так и отрицательные мнимые части).
Ответ 3
>>> n = 3.4 + 2.3j
>>> print '%05f %05fi' % (n.real, n.imag)
3.400000 2.300000i
Ответ 4
Ни Операции форматирования строк - то есть оператор modulo (%
)) -
ни новый str.format()
Формат строкового синтаксиса поддерживает сложные типы.
Однако можно вызвать метод __format__
для всех встроенных числовых типов.
Вот пример:
>>> 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']
Обратите внимание, что это хорошо работает и с отрицательными мнимыми частями.
Ответ 5
С Python 2.6 вы можете определить, как объекты ваших собственных классов отвечают на строки формата. Таким образом, вы можете определить подкласс complex
, который можно отформатировать. Вот пример:
>>> 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).'
Объекты этого класса ведут себя точно как цифры complex
, за исключением того, что они занимают больше места и работают медленнее; читайте.