复数对象¶
从 C API 的角度来看,Python 的复数对象实现为两种不同的类型:一种是暴露给 Python 程序的 Python 对象,另一种是表示实际复数值的 C 结构。该 API 提供了用于处理这两种类型的函数。
作为 C 结构的复数¶
请注意,接受这些结构作为参数并将其作为结果返回的函数是通过值而不是通过指针取消引用来执行的。这在整个 API 中是一致的。
-
type Py_complex¶
C 结构,它对应于 Python 复数对象的值部分。 大多数用于处理复数对象的函数都使用此类型的结构作为输入或输出值(视情况而定)。
该结构定义为
typedef struct { double real; double imag; } Py_complex;
-
Py_complex _Py_c_sum(Py_complex left, Py_complex right)¶
返回两个复数的和,使用 C
Py_complex
表示形式。
-
Py_complex _Py_c_diff(Py_complex left, Py_complex right)¶
返回两个复数的差,使用 C
Py_complex
表示形式。
-
Py_complex _Py_c_neg(Py_complex num)¶
返回复数 num 的取反,使用 C
Py_complex
表示形式。
-
Py_complex _Py_c_prod(Py_complex left, Py_complex right)¶
返回两个复数的乘积,使用 C
Py_complex
表示形式。
-
Py_complex _Py_c_quot(Py_complex dividend, Py_complex divisor)¶
返回两个复数的商,使用 C
Py_complex
表示形式。如果 divisor 为空,则此方法返回零并将
errno
设置为EDOM
。
-
Py_complex _Py_c_pow(Py_complex num, Py_complex exp)¶
返回 num 的 exp 次幂,使用 C
Py_complex
表示形式。如果 num 为空且 exp 不是正实数,则此方法返回零并将
errno
设置为EDOM
。
作为 Python 对象的复数¶
-
PyTypeObject PyComplex_Type¶
- 稳定 ABI 的一部分。
此
PyTypeObject
的实例表示 Python 复数类型。它与 Python 层中的complex
对象相同。
-
int PyComplex_Check(PyObject *p)¶
如果其参数是
PyComplexObject
或PyComplexObject
的子类型,则返回 true。此函数始终成功。
-
int PyComplex_CheckExact(PyObject *p)¶
如果其参数是
PyComplexObject
,但不是PyComplexObject
的子类型,则返回 true。此函数始终成功。
-
PyObject *PyComplex_FromCComplex(Py_complex v)¶
- 返回值:新引用。
从 C
Py_complex
值创建一个新的 Python 复数对象。如果发生错误,则返回NULL
并设置异常。
-
PyObject *PyComplex_FromDoubles(double real, double imag)¶
- 返回值:新的引用。 是稳定 ABI 的一部分。
从 real 和 imag 返回一个新的
PyComplexObject
对象。如果发生错误,则返回NULL
并设置异常。
-
double PyComplex_RealAsDouble(PyObject *op)¶
- 稳定 ABI 的一部分。
以 C double 类型返回 op 的实部。
如果 op 不是 Python 复数对象,但具有
__complex__()
方法,则会先调用此方法将 op 转换为 Python 复数对象。如果未定义__complex__()
,则会回退到调用PyFloat_AsDouble()
并返回其结果。如果失败,此方法会返回
-1.0
并设置异常,因此应调用PyErr_Occurred()
来检查错误。在 3.13 版本中变更: 如果可用,则使用
__complex__()
。
-
double PyComplex_ImagAsDouble(PyObject *op)¶
- 稳定 ABI 的一部分。
以 C double 类型返回 op 的虚部。
如果 op 不是 Python 复数对象,但具有
__complex__()
方法,则会先调用此方法将 op 转换为 Python 复数对象。如果未定义__complex__()
,则会回退到调用PyFloat_AsDouble()
,并在成功时返回0.0
。如果失败,此方法会返回
-1.0
并设置异常,因此应调用PyErr_Occurred()
来检查错误。在 3.13 版本中变更: 如果可用,则使用
__complex__()
。
-
Py_complex PyComplex_AsCComplex(PyObject *op)¶
返回复数 op 的
Py_complex
值。如果 op 不是 Python 复数对象,但具有
__complex__()
方法,则会先调用此方法将 op 转换为 Python 复数对象。如果未定义__complex__()
,则会回退到__float__()
。如果未定义__float__()
,则会回退到__index__()
。如果失败,此方法会返回
Py_complex
,其中real
设置为-1.0
,并设置异常,因此应调用PyErr_Occurred()
来检查错误。在 3.8 版本中变更: 如果可用,则使用
__index__()
。