python eval函数

我不是码神2024-01-14python20

Python中的eval()函数是一个内置函数,用于计算字符串形式的表达式并返回结果,它的基本语法如下:

(图片来源网络,侵删)
eval(expression, globals=None, locals=None)

参数说明:

expression:一个字符串形式的表达式,可以是任何有效的Python表达式。

globals:可选参数,如果提供,则必须是一个字典,表示全局命名空间(变量)。

locals:可选参数,如果提供,则必须是一个字典,表示局部命名空间(变量)。

eval()函数的工作原理是解析传入的字符串表达式,并在指定的全局和局部命名空间中查找变量,如果在全局命名空间中找不到变量,则会在局部命名空间中查找,如果仍然找不到,则会引发NameError异常。

下面是一些使用eval()函数的示例:

1、计算数学表达式:

result = eval("3 + 5")
print(result)  # 输出:8

2、访问变量:

x = 10
y = 20
result = eval("x + y")
print(result)  # 输出:30

3、调用函数:

def add(a, b):
    return a + b
result = eval("add(3, 5)")
print(result)  # 输出:8

4、使用列表和字典:

my_list = [1, 2, 3]
my_dict = {"a": 1, "b": 2}
result = eval("my_list[0] + my_dict['a']")
print(result)  # 输出:3

需要注意的是,eval()函数具有强大的计算能力,但也存在一定的安全风险,因为它可以执行任意的Python代码,所以在处理不可信的输入时需要谨慎,为了确保安全性,可以使用Python的ast模块来解析和执行表达式,而不是直接使用eval()函数,下面是一个使用ast模块的示例:

import ast
import operator as op
定义支持的操作符和操作数类型
operators = {ast.Add: op.add, ast.Sub: op.sub, ast.Mult: op.mul, ast.Div: op.truediv, ast.USub: op.neg}
operands = {ast.Num: int, ast.Str: str, ast.List: list, ast.Dict: dict}
def evaluate_expr(node):
    if isinstance(node, ast.Num): # <number>
        return operands[type(node)](node.n)
    elif isinstance(node, ast.BinOp): # <left> <operator> <right>
        return operators[type(node.op)](evaluate_expr(node.left), evaluate_expr(node.right))
    elif isinstance(node, ast.UnaryOp): # <operator> <operand> e.g., 1
        return operators[type(node.op)](evaluate_expr(node.operand))
    elif isinstance(node, ast.Call): # <function>(<arguments>) e.g., len([1, 2, 3])
        func = evaluate_expr(node.func)
        args = [evaluate_expr(arg) for arg in node.args]
        return func(*args)
    elif isinstance(node, ast.Name): # <variable> e.g., x = 10; x + 20
        return variables[node.id]
    elif isinstance(node, ast.Assign): # <variable> = <value> e.g., x = 10; x + 20
        variables[node.targets[0].id] = evaluate_expr(node.value)
        return None
    elif isinstance(node, ast.Expr): # standalone expression e.g., 1 + 2 * (3 4) / (5 6) + 7 * (8 9) / (10 11) + 12 * (13 14) / (15 16) + 17 * (18 19) / (20 21) + 22 * (23 24) / (25 26) + 27 * (28 29) / (30 31) + 32 * (33 34) / (35 36) + 37 * (38 39) / (40 41) + 42 * (43 44) / (45 46) + 47 * (48 49) / (50 51) + 52 * (53 54) / (55 56) + 57 * (58 59) / (60 61) + 62 * (63 64) / (65 66) + 67 * (68 69) / (70 71) + 72 * (73 74) / (75 76) + 77 * (78 79) / (80 81) + 82 * (83 84) / (85 86) + 87 * (88 89) / (90 

发表评论

访客

◎欢迎参与讨论,请在这里发表您的看法和观点。