python内置函数 E

python内置函数 E

Python 解释器内置了很多函数和类型,任何时候都能使用。

E

名称描述
enumerate返回一个枚举对象。
eval将一个字符串作为Python表达式进行解析并执行,然后返回表达式的值。
exec执行存储在字符串或对象代码中的Python代码。(复杂的代码块或语句)
enumerate(iterable, start=0)

返回一个枚举对象。iterable 必须是一个序列,或 iterator,或其他支持迭代的对象。 enumerate() 返回的迭代器的 __next__() 方法返回一个元组,里面包含一个计数值(从 start 开始,默认为 0)和通过迭代 iterable 获得的值。

>>> seasons = ['Spring', 'Summer', 'Fall', 'Winter']
>>> list(enumerate(seasons))
[(0, 'Spring'), (1, 'Summer'), (2, 'Fall'), (3, 'Winter')]
>>> list(enumerate(seasons, start=1))
[(1, 'Spring'), (2, 'Summer'), (3, 'Fall'), (4, 'Winter')]

等价于:

def enumerate(iterable, start=0):
    n = start
    for elem in iterable:
        yield n, elem
        n += 1
eval(expression, globals=None, locals=None)

eval()是一个内置函数,它可以将一个字符串作为Python表达式进行解析并执行,然后返回表达式的值。eval()函数对于动态执行代码非常有用,但也存在安全风险,因为它允许执行任何Python代码。

  • expression:一个字符串表达式,将会被Python解释器执行。
  • globals(可选):一个字典,定义表达式中名字到对象的映射。如果这个参数被省略,那么将使用全局命名空间。
  • locals(可选):一个映射对象,用于表达式中局部变量的查找。如果这个参数被省略或被设为None,那么将使用全局命名空间作为局部命名空间。

实参是一个字符串,以及可选的 globals 和 locals。globals 实参必须是一个字典。locals 可以是任何映射对象。

表达式解析参数 expression 并作为 Python 表达式进行求值(从技术上说是一个条件列表),采用 globalslocals 字典作为全局和局部命名空间。 如果存在 globals 字典,并且不包含 __builtins__ 键的值,则在解析 expression 之前会插入以该字符串为键以对内置模块 builtins 的字典的引用为值的项。 这样就可以在将 globals 传给 eval() 之前通过向其传入你自己的 __builtins__ 字典来控制可供被执行代码可以使用哪些内置模块。 如果 locals 字典被省略则它默认为 globals 字典。 如果两个字典都被省略,则将使用调用 eval() 的环境中的 globalslocals 来执行该表达式。 注意,eval() 无法访问闭包环境中的 嵌套作用域 (非局部变量)。

返回值就是表达式的求值结果。 语法错误将作为异常被报告。 例如:

>>>

>>> x = 1
>>> eval('x+1')
2

该函数还可用于执行任意代码对象(比如由 compile() 创建的对象)。 这时传入的是代码对象,而非一个字符串了。如果代码对象已用参数为 mode'exec' 进行了编译,那么 eval() 的返回值将为 None

提示: exec() 函数支持语句的动态执行。 globals()locals() 函数分别返回当前的全局和本地字典,可供传给 eval()exec() 使用。

如果给出的源数据是个字符串,那么其前后的空格和制表符将被剔除。

另外可以参阅 ast.literal_eval(),该函数可以安全执行仅包含文字的表达式字符串。

引发一个 审计事件 exec 附带参数 code_object

# 简单的数学表达式  
result = eval("2 + 3")  
print(result)  # 输出:5  
  
# 使用变量  
x = 10  
y = 20  
result = eval("x * y")  
print(result)  # 输出:200  
  
# 使用复杂的表达式和函数  
result = eval("pow(2, 3)")  
print(result)  # 输出:8  
  
# 使用字典和列表  
data = {"name": "Alice", "age": 30}  
result = eval("data['name']")  
print(result)  # 输出:Alice  
  
# 使用globals和locals参数  
x = 1  
def test_function():  
    y = 2  
    result = eval("x + y", globals(), locals())  
    return result  
  
print(test_function())  # 输出:3
exec(object, globals=None, locals=None, /, *, closure=None)

exec()是一个内置函数,用于执行存储在字符串或对象代码中的Python代码。与eval()函数类似,exec()允许你动态地执行Python代码,但它主要用于执行复杂的代码块或语句,而不是单个表达式。

  • object:一个字符串或编译过的代码对象,包含要执行的Python代码。
  • globals(可选):一个字典,定义代码执行期间使用的全局变量。如果省略,则使用当前的全局符号表。
  • locals(可选):一个字典,定义代码执行期间使用的局部变量。如果省略或设为None,则使用当前的局部符号表(通常是globals)。

这个函数支持动态执行 Python 代码。 object 必须是字符串或者代码对象。 如果是字符串,那么该字符串将被解析为一系列 Python 语句并执行(除非发生语法错误)。 [1] 如果是代码对象,它将被直接执行。 在任何情况下,被执行的代码都应当是有效的文件输入(见参考手册中的 文件输入 一节)。 请注意即使在传递给 exec() 函数的代码的上下文中,nonlocal, yieldreturn 语句也不能在函数定义以外使用。 该函数的返回值是 None

无论在什么情况下,如果省略了可选部分,代码将运行于当前作用域中。如果只提供了 globals,则必须为字典对象(而不能是字典的子类),同时用于存放全局变量和局部变量。如果提供了 globalslocals,则将分别用于全局变量和局部变量。locals 可以是任意字典映射对象。请记住,在模块级别,globals 和 locals 是同一个字典。如果 exec 获得两个独立的对象作为 globalslocals,代码执行起来就像嵌入到某个类定义中一样。

如果 globals 字典不包含 __builtins__ 键值,则将为该键插入对内建 builtins 模块字典的引用。因此,在将执行的代码传递给 exec() 之前,可以通过将自己的 __builtins__ 字典插入到 globals 中来控制可以使用哪些内置代码。

closure 参数指定一个闭包 – 即由 cellvar 组成的元组。 它仅在 object 是一个包含自由变量的代码对象时才可用。 该元组的长度必须与代码对象所引用的自由变量的数量完全一致。

引发一个 审计事件 exec 附带参数 code_object

备注:内置 globals()locals() 函数各自返回当前的全局和本地字典,因此可以将它们传递给 exec() 的第二个和第三个实参。

备注:默认情况下,locals 的行为如下面 locals() 函数描述的一样:不要试图改变默认的 locals 字典。 如果您需要在 exec() 函数返回时查看代码对 locals 的影响,请明确地传递 locals 字典。

在 3.11 版本发生变更: 添加了 closure 参数。

# 执行简单的Python语句
exec("print('Hello, world!')")

# 定义并执行函数
code_in_string = """  
def greet(name):  
    print(f'Hello, {name}!')  
greet('Alice')  
"""
exec(code_in_string)

# 使用globals和locals参数
globals_dict = {'x': 10}
locals_dict = {'y': 20}
exec("z = x + y", globals_dict, locals_dict)
print(locals_dict['z'])  # 输出:30
# print(globals_dict['z'])  # KeyError: 'z'

exec()函数与eval()一样,具有潜在的安全风险。永远不要对来自不可信来源的字符串执行exec(),因为这可能导致代码注入攻击或执行恶意代码。确保你完全信任并控制要执行的代码内容。

如果你需要安全地解析简单的Python字面量(如数字、字符串、列表、字典等),应该使用ast.literal_eval(),因为它只解析字面量结构,而不会执行任意的代码。

参考:内置函数 — Python 3.12.2 文档

  • 12
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

棠越

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值