python eval函数
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