在python中可以将复数解压为x和y吗?

在python中可以将复数解压为x和y吗?,python,complex-numbers,iterable-unpacking,Python,Complex Numbers,Iterable Unpacking,我想把复数分解成实部和虚部,就像这样: z=3+5j >>>x,y=z 回溯(最近一次呼叫最后一次): 文件“”,第1行,在 TypeError:无法解压缩不可编辑的复杂对象 但是我犯了一个错误。我当然可以做到: >x,y=z.real,z.imag 但这似乎是重复的,可读性不强,我可以通过编写这样的函数来改进这一点: def解包(z:complex)->元组[float,float]: 返回z.real,z.imag x、 y=拆包(z) 但我觉得应该有更好的办法 你知道一种更好的方法来

我想把复数分解成实部和虚部,就像这样:

z=3+5j >>>x,y=z 回溯(最近一次呼叫最后一次): 文件“”,第1行,在 TypeError:无法解压缩不可编辑的复杂对象 但是我犯了一个错误。我当然可以做到:

>x,y=z.real,z.imag
但这似乎是重复的,可读性不强,我可以通过编写这样的函数来改进这一点:

def解包(z:complex)->元组[float,float]:
返回z.real,z.imag
x、 y=拆包(z)
但我觉得应该有更好的办法


你知道一种更好的方法来将复数解包成实部和虚部吗?

你可以做的一件事是子类
复数
,并实现一个自定义的
iter\uuuuuuuuu
方法,返回你想要的解包版本

在本例中,我选择将其命名为
complez
,因为
z
通常是复数的符号

import cmath

class complez(complex):
    def __iter__(self):
        return iter((self.real, self.imag))

z = complez(3, 5)
x, y = z
print(x, y)
# 3.0 5.0
如果不介意重写现有的
复合体
,也可以执行以下操作。使用这种方法,您可以在整个代码中继续使用
complex
类,而无需对命名进行任何更改

import builtins
import cmath

class complex(builtins.complex):
    def __iter__(self):
        return iter((self.real, self.imag))

z = complex(3, 5)
x, y = z
print(x, y)
# 3.0 5.0
(从技术上讲,您也可以放弃使用该模块)

在这两种情况下,标准拆包操作员也会工作,例如:

print(*z)
# 3.0 5.0
注意:这解决了您眼前的问题,但确实会带来后果。当您对这些新数字执行操作时,例如添加2个
complez
数字,您将得到一个
complex
数字结果-这将无法定义方便的
\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu
,因此您必须覆盖其他方法来解释此副作用。例如:

def __add__(self, other):
    return complez(super().__add__(other))

因此,这种方法在生成完全通用的解决方案时会导致更多的开销。但是,这是为了方便自然解包的权衡。

你认为什么是“更好的方法”?更短的内置?我认为你的
unpack
函数是最简单、最可读的方法。@MisterMiyagi理想情况下,内置。这将适用于使用
complez
构造函数“字面”创建的复数,但
complez
对象的算术结果仍然是
complex
对象。您可能希望重写相关方法以返回
complez
。也可以只
产生
它们。True@kaya3,很好的观点,这会产生类似的后果,我已经在答案中记下了。