📅  最后修改于: 2023-12-03 15:07:02.873000             🧑  作者: Mango
在 Python 中,我们可以使用复数类型来处理具有实部和虚部的数字,它们以 a+bj
的形式表示,其中 a
是实部,b
是虚部。例如,3+4j
, 1-2j
等都是有效的复数。
然而,在默认设置下,Python 并不会将这样的复数视为有效数字。因此,当我们试图将字符串 "1+2j"
转换为复数时,会抛出 ValueError
异常。例如:
>>> complex("1+2j")
ValueError: complex() arg is a malformed string
为了让 Python 将这样的复数视为有效数字,我们可以使用 ast.literal_eval
函数。这个函数将执行与 eval()
函数类似的操作,但只接受单个表达式并且仅解析 Python 字面量。例如:
import ast
x = ast.literal_eval("1+2j")
print(x)
输出:
(1+2j)
在这个例子中,我们使用 ast.literal_eval
将字符串 "1+2j"
转换为复数 (1+2j)
。与 eval()
不同,ast.literal_eval
只能解析 Python 字面量而不能执行任意代码,这可以避免安全问题。
如果我们希望在整个程序中允许将类似 "1+2j"
的复数视为有效数字,可以使用以下代码片段:
import ast
def complex_eval(x):
try:
return complex(x)
except ValueError:
return ast.literal_eval(x)
这个函数接受一个字符串 x
,尝试将其转换为复数。如果能成功转换,直接返回结果。否则,使用 ast.literal_eval
尝试将其解析为复数,并返回结果。
这样,我们就可以愉快地使用 "1+2j"
和其他类似的复数字符串了!