📜  允许将“1+2j”之类的复数视为有效数字 - Python (1)

📅  最后修改于: 2023-12-03 15:07:02.873000             🧑  作者: Mango

允许将“1+2j”之类的复数视为有效数字 - Python

在 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" 和其他类似的复数字符串了!