在python中可以将复数解压为x和y吗?
我想把复数分解成实部和虚部,就像这样: z=3+5j >>>x,y=z 回溯(最近一次呼叫最后一次): 文件“”,第1行,在 TypeError:无法解压缩不可编辑的复杂对象 但是我犯了一个错误。我当然可以做到:在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) 但我觉得应该有更好的办法 你知道一种更好的方法来
>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,很好的观点,这会产生类似的后果,我已经在答案中记下了。