Сообщить об ошибке.

Комплексные числа complex в Python

Добавлено в Python 3.14. Статический метод класса complex.from_number() предназначен для преобразования числа в комплексное число.

Комплексное число тип complex состоит из двух чисел с плавающей точкой, представляющих соответственно его действительную и мнимую части. Доступ к обеим частям комплексного объекта x обеспечивают атрибуты x. real и x. imag, доступные только для чтения. Мнимый литерал можно задать с помощью числа с плавающей точкой или десятичного дробного числа с фиксированной точностью с добавлением в конец буквы j или J, в результате получим комплексное число с нулевой вещественной частью, которое можно добавить к целому числу или числу с плавающей точкой, чтобы получить комплексное число с действительными и мнимыми частями.

# Варианты записи комплексных чисел
>>> 0j, 0.j, 0.3j, .8j, 1j, 2.j, 1.+3j, 1e1+2J, 1.e-3+1j, 1.5e+4+2j, 1.5e+4+78.1e-1J
# (0j, 0j, 0.3j, 0.8j, 1j, 2j, (1+3j), (10+2J), (0.001+1j), (15000+2j), (15000+7.81J))

>>> x = 78.1e-1j # мнимая часть
>>> x = x + 1.5e+4 # складываем в вещественным числом
>>> x
# (15000+7.81j)
>>> x.real
# 15000.0
>>> x.imag
# 7.81

Буква j в конце литерала обозначает квадратный корень из -1. Например, комплексное число, равное единице, можно представить как 1+0j или 1.0+0.0j. Python выполнит операцию сложения или вычитания во время компиляции.

Комплексные числа поддерживают не все арифметические операции и операции сравнения.

  • из арифметических операций недоступны // - деление без остатка , % - остаток от деления, int(), float(), divmod().
  • из операции сравнения недоступны x < y, x <= y, x > y и x >= y.

Тип complex в языке Python представлен классом complex(), он позволяет:

  • создать комплексное число со значением переданных аргументов: действительной и мнимой частью
  • преобразовать строку с записью комплексного числа в комплексное число.

Примеры использования создания комплексных чисел и преобразования объектов к типу complex:

>>> complex()
# 0j
>>> complex(1)
# (1+0j)
>>> complex(1.5)
# (1.5+0j)
>>> complex(3, 5)
# (3+5j)
>>> complex(1, 2e-2)
# (1+0.02j)

# Преобразование в complex тип из строки
# обратите внимание на пробелы в аргументах
>>> complex(' 1+2j ')
# (1+2j)
>>> complex('   0.1+2.0j')
# (0.1+2j)
>>> complex(' .1+2.j     ')
# (0.1+2j)
>>> complex('    1e3+2e-3j')
# (1000+0.002j)

Тип complex реализует абстрактный базовый класс numbers.Complex. Тип complex также имеет следующие дополнительные методы.

complex.from_number(x):

Добавлено в Python 3.14.

Статический метод класса complex.from_number() предназначен для преобразования числа в комплексное число.

Для произвольного объекта x метод complex.from_number(x) делегирует выполнение методу x.__complex__(). Если метод __complex__() не определён, используется метод x.__float__(). Если и __float__() не определён, то используется метод __index__().

Отличие от функции complex():

  • Более строгая и явная конверсия в комплексное число.
  • Не поддерживает строки.
  • Ожидает числовые типы или объекты, реализующие специальные методы: __complex__(), __float__() или __index__().

Когда использовать что?

  • complex(x) : если нужна гибкость, например, парсинг из строки или из разных источников.
  • complex.from_number(x) : если необходимо явно и безопасно привести объект к числу, игнорируя строки и случайные данные.

Примеры использования метода complex.from_number(x):

Простые числа

# Целое число
print(complex.from_number(42))        # (42+0j)

# Число с плавающей точкой
print(complex.from_number(3.14))      # (3.14+0j)

# Комплексное число (ничего не изменится)
print(complex.from_number(1 + 2j))    # (1+2j)

Объекты с __complex__

class MyComplex:
    def __complex__(self):
        return 1 + 2j

obj = MyComplex()
print(complex.from_number(obj))  # (1+2j)

Объекты без __complex__, но с __float__

class MyFloat:
    def __float__(self):
        return 3.5

obj = MyFloat()
print(complex.from_number(obj))  # (3.5+0j)

Объекты без __complex__ и __float__, но с __index__

class MyIntLike:
    def __index__(self):
        return 100

obj = MyIntLike()
print(complex.from_number(obj))  # (100+0j)

Ошибка, если объект не поддерживает ни один из методов

class Unsupported:
    pass

obj = Unsupported()

try:
    complex.from_number(obj)
except TypeError as e:
    print("Ошибка:", e)