Python中的exec()

2025年1月5日 | 阅读6分钟

引言

在本教程中,我们将学习 Python 中的 exec() 函数。exec() 函数用于动态执行 Python 程序,该程序可以是字符串或代码对象。如果它是字符串,字符串将被分割成一系列 Python 语句,然后执行,除非发生语法错误。我们必须注意不要在函数定义之外使用 return 语句,甚至不要在传递给 exec() 函数的代码的上下文中这样做。它不返回任何值,因此返回 None。如果您知道如何使用强大的 Python exec() 内置函数,那么没有任何限制。Python exec() 与 eval() 类似;唯一的区别是 exec() 可以接受多个数字而不是传递一个表达式,而 eval() 不能。

语法

Python 中 exec() 函数的语法如下所示 -

参数

Python 中 exec() 函数的参数如下所示 -

  • object: 如前所述,它可以是字符串或代码对象。
  • globals: 它可以是一个字典,但 globals 参数是可选的。
  • locals: 它可以是对象映射,此参数也是可选的。

返回值

Python 中 exec() 函数的返回值如下所示 -

  • Python exec() 函数不返回任何值;相反,它返回 None。

程序代码

在此程序代码中,我们可以看到使用 exec() 函数在 Python 中进行动态执行。为了说明 Python 中良好处理的概念,它表明动态执行包含在对象中的代码是可能的。代码现在如下所示 -

输出

现在,我们在 Python 中编译上述代码,成功编译后运行它。输出如下:

The product of the 2 and 10 is 20

程序代码

在使用 exec() 的方法之前,您需要记住 exec() 支持的所有函数。我们可以使用 dir() 函数来查看这一点。在此程序代码中,我们可以看到 Python 中的一个好函数,因为 dir() 函数在 exec() 函数中执行,这表明了 Python 中动态执行的概念。代码现在如下所示 -

输出

现在,我们在 Python 中编译上述代码,成功编译后运行它。输出如下:

['Random', 'SystemRandom', '__annotations__', '__builtins__', '__doc__', '__loader__', '__name__', '__package__', '__spec__', 'betavariate', 'choice', 'choices', 'expovariate', 'gammavariate', 'gauss', 'getrandbits', 'getstate', 'lognormvariate', 'normalvariate', 'paretovariate', 'randbytes', 'randint', 'random', 'randrange', 'sample', 'seed', 'setstate', 'shuffle', 'triangular', 'uniform', 'vonmisesvariate', 'weibullvariate']

程序代码

exec() 方法可用于执行用户动态输入的代码。这非常危险,因为用户可以在您的环境中运行任何代码。因此,在要求用户将字符串或代码对象输入到 exec() 函数时要小心。代码如下所示 -

输出

现在,我们在 Python 中编译上述代码,成功编译后运行它。输出如下:

Write a Python code here: [print(i*5) for i in range(0,9)]
0
5
10
15
20
25
30
35
40

程序代码

Python 允许我们通过使用全局和局部参数来限制许多变量和方法的用法,但我们可能不需要这样做。这些局部和全局参数用于局部或全局转换(仅限字典)。如果缺少局部参数,则会替换全局参数。这意味着全局参数可以在两种情况下使用。让我们看看代码如何仅传递全局参数。代码如下所示 -

输出

现在,我们在 Python 中编译上述代码,成功编译后运行它。输出如下:

['__builtins__']

因此,我们看到当我们在上面的代码中将一个空字典作为全局参数传递时,它只返回 __builtins__,而没有其他数学事件发生,如上一个示例所示。这意味着对象不仅仅支持 __builtins__。这意味着所有其他函数都限于此对象。

程序代码

在此,我们提供另一个 Python exec() 函数的程序代码。代码如下所示 -

输出

上面的程序代码应该打印 720 作为输出,但它显示“无输出”并引发异常。即使我们传递了阶乘数,由于我们通过传递全局参数设置了限制,factorial() 方法也无法工作。

程序代码

我们可以允许执行各种函数的某些任务。例如,我们想阻止除 factorial() 函数之外的所有其他数学模块。下面是一个 Python exec() 函数的示例 -

输出

现在,我们在 Python 中编译上述代码,成功编译后运行它。输出如下:

3628800

程序代码

预定义的函数名也可以在执行开始时分配给引用列表。我们可以将函数名从 factorial() 更改为用户定义的 f()。代码如下所示 -

输出

现在,我们在 Python 中编译上述代码,成功编译后运行它。输出如下:

3628800

程序代码

在这种情况下,通过传递全局和局部参数,我们可以根据我们的特定需求自定义可执行代码的行为,并演示 Python 中动态执行的通用性。代码如下所示 -

输出

现在,我们在 Python 中编译上述代码,成功编译后运行它。输出如下:

['i', 's']

程序代码

Python 中的动态执行允许执行特定的方法,如 sum() 和 iter(),以及在 exec() 函数中创建的例程,从而使在 Python 中轻松执行良好。通过这种方式,所有内置方法都可以通过 exec() 函数完成,只需 sum 和 iter 方法。我们也可以像下面的代码一样限制 __builtins__ 的使用 -

输出

现在,我们在 Python 中编译上述代码,成功编译后运行它。输出如下:

['dir', 'print', 'sum']

程序代码

在这里,我们翻译全局字典和局部映射对象。在下面的程序代码中,在 floor() 方法中无法使用变量 "a" 和 "num" 来访问 "object"。所有其他函数和方法都将不可用。代码如下所示 -

输出

现在,我们在 Python 中编译上述代码,成功编译后运行它。输出如下:

70

程序代码

Python 提供了一个 exec() 函数,可帮助程序员将 Python 代码块解析为参数并重复执行值。输出如下所示 -

输出

现在,我们在 Python 中编译上述代码,成功编译后运行它。输出如下:

0
1
2
3
4
5
6
7
8
The Programming in Python
False

程序代码

在此,我们提供一个使用 Python exec() 函数传递字符串的程序代码。代码如下所示 -

输出

现在,我们在 Python 中编译上述代码,成功编译后运行它。输出如下:

Hello coders
Sum: 10
False
5.0

结论

在本教程中,我们将学习 Python 中的 exec() 函数。Python exec() 内置函数用于动态执行传递给函数的 Python 程序,该程序可以是字符串或代码对象。根据 Python exec() 函数,整个代码块可以动态地解析为字符串或参数。此函数将执行一个代码块,并根据定义的 Python 语句返回一个值。在此,我们共享 Python 中 exec() 函数的语法、参数和返回值。我们还将从本教程中学习 exec() 函数的一些程序代码。