Python教程 – eval 和 exec

本篇教程将介绍Python两个特殊的内置函数:eval()和exec()。通过这两个函数,可以将字符串转换成可执行的代码,进一步结合其他代码进行使用。

eval()

eval()可以输入一行字符串,并将输入的字符串转换成可执行的代码后执行。eval()不能进行复杂的逻辑运算,例如赋值操作、循环等。eval()有三个参数:

参数 说明
expression 输入的字符串
globals 输入字符串中使用的全局变量,使用字典类型,默认为 None
locals 输入字符串中使用的局部变量,使用字典类型,默认为 None

下面的例子执行后,效果等同于print(“hello”)

eval('print("hello")')    # hello ( 等同 print("hello") )

下面的例子额外设置了globals和locals参数,会依次覆盖掉a、b、c的内容,globals和locals参数并不代表真正的变量,只有在eval()运算时才有效,运算之后就失效。

a, b, c = 1, 2, 3
eval('print(a, b, c)')                            # 1, 2, 3
eval('print(a, b, c)', {'a':4, 'b':5, 'c':6})     # 4, 5, 6
eval('print(a, b, c)', {'a':4, 'b':5, 'c':6}, {'a':7, 'b':8, 'c':9})   # 7, 8, 9
eval('print(a, b, c)')   # 1, 2, 3

此外,使用eval()可以返回计算的结果,下面的例子,会以x等于1、y等于2进行计算,返回x+y的结果。

a = eval('x+y',{'x':1,'y':2})
print(a)       # 3

虽然eval()非常方便好用,但相对有使用上的风险,因为eval()会将字符串转换成代码执行,如果应用在input,就可以输入类似“系统指令”的方法,操控系统的文件,例如下面代码执行后,会执行用户输入的代码, 这时如果输入了类似’import os; os.system(‘rm 123.txt’)’的代码,就会删除电脑中的某个文件。

eval(input())

exec()

exec()可以输入多行字符串,并将输入的字符串转换成可执行的代码后执行,exec()可以进行较为复杂的逻辑运算,例如赋值操作、循环等。exec()有三个参数:

参数 说明
object 输入的字符串
globals 输入字符串里使用的全局变量,使用字典类型,默认 None
locals 输入字符串里使用的局部变量,使用字典类型,默认 None

下面的例子执行后,效果等同于执行一个for循环,打印出0到9。

exec('''
for i in range(10):
    print(i)
''')

exec()无法像eval()那样返回结果,如果使用返回的方式,只会返回None。

a = exec('x+y',{'x':1,'y':2})
print(a)     # None

原创文章,作者:guozi,如若转载,请注明出处:https://www.sudun.com/ask/78932.html

(0)
guozi的头像guozi
上一篇 2024年5月30日
下一篇 2024年5月30日

相关推荐

  • 优化营销

    优化营销,这个词在当今的互联网时代已经不再陌生。它是一种如何让你的产品或服务在搜索引擎中获得更好的排名,从而吸引更多潜在客户的方法。那么,什么是优化营销?为什么现在越来越多的企业开…

    行业资讯 2024年4月8日
    0
  • 上海建站服务,上海企业网站建设公司

    SEO 优化对您的业务非常重要。适当的SEO优化可以提高您的网站在搜索引擎中的排名并吸引更多潜在客户。因此,在选择网站建设方案时,应关注其是否具有良好的SEO优化功能。 为什么企业…

    行业资讯 2024年4月17日
    0
  • 宁波正规企业网站搭建,宁波网站seo公司

    在宁波这个美丽的城市里有很多优秀的网站建设公司。那么如何在众多选择中选择一家好的宁波网站建设公司呢?您可能想知道为什么要选择宁波网站建设公司。今天我们就来探讨一下目前宁波网站建设行…

    行业资讯 2024年4月9日
    0
  • 我的世界云服务器租用

    想象一下,拥有一个可以随时随地访问的服务器,无论是在家里、办公室还是旅途中,都能够轻松管理和存储数据。这就是云服务器的魅力所在。但什么是云服务器?为什么越来越多的人选择它?今天,我…

    行业资讯 2024年4月12日
    0

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注