Python中eval()和exec()函数

eval()函数

作用:计算指定表达式的值,返回表达式的值。只能是单个运算表达式,不能是赋值操作或复杂的代码逻辑

eval(expression[, globals[, locals]])

参数

  • expression – 表达式,必选参数,可以是字符串,也可以是任意的code对象实例(可以通过compile函数创建)
  • globals – 变量作用域,全局命名空间,如果被提供,则必须是一个字典对象,则计算时取globals中的值
  • locals – 变量作用域,局部命名空间,如果被提供,可以是任何映射对象;如果被忽略,则同globals中的值
  • 如果globals和locals都被忽略,那么将取作用域内的变量值进行计算

返回值

  • 如果expression是一个code对象,且创建该对象时,compile函数的mode参数是’exec’,那么eval()的函数的返回值是None
  • 如果expression是一个print()语句,eval()返回None
  • 否则,返回表达式的值

示例:

s='11+5python'
print(eval(s[1:-6]))
x= 10
def func():
    y=20
    a = eval('x +y')
    print('a: ',a)
    b = eval('x + y', {'x': 1, 'y':2})
    print('b: ', b)
    c = eval('x + y', {'x': 1, 'y': 2}, {'y': 3, 'z': 4})
    print('c: ',c)
    d = eval('print(x, y)')
    print('d:',d)
func()

输出:

15
10
a:  30
b:  3
c:  4
10 20
d: None

代码解释:

  • 对于变量a,eval函数的globals和locals参数都被忽略了,因此变量x和变量y都取得的是eval函数被调用环境下的作用域中的变量值,即:*-10,y=20,a=x+y-30
  • 对于变量b,eval函数只提供了globals参数而忽略了locals参数,因此locals会取globals参数的值,即:x=1y=2,b=x+y=3
  • 对于变量c,eval函数的globals参数和locals都被提供了,那么eval函数会先从全部作用域globals中找到变量x,从局部作用域locals中找到变量y,即:x=1,y=3c=x+y=4
  • 对于变量d,因为print()函数不是一个计算表达式,没有计算结果,因此返回值为None

exec()函数

作用:执行储存在字符串或文件中的 Python 语句,相比于 eval,exec可以执行更复杂的 Python 代码

exec(object[, globals[, locals]])

参数

  • object:必选参数,表示需要被指定的 Python 代码。它必须是字符串或 code 对象。如果 object 是一个字符串,该字符串会先被解析为一组 Python 语句,然后再执行(除非发生语法错误)。如果 object 是一个 code 对象,那么它只是被简单的执行。
  • globals:可选参数,表示全局命名空间(存放全局变量),如果被提供,则必须是一个字典对象。
  • locals:可选参数,表示当前局部命名空间(存放局部变量),如果被提供,可以是任何映射对象。如果该参数被忽略,那么它将会取与 globals 相同的值。

返回值
exec 返回值永远为 None。
示例:

exec('print("Hello World")')
exec ("""for i in range(5):print ("iter time: %d" % i)""")

x = 10
expr = """
z = 30
sum = x + y + z
print(sum)
"""
def func():
    y = 20
    exec(expr)
    exec(expr, {'x': 1, 'y': 2})
    exec(expr, {'x': 1, 'y': 2}, {'y': 3, 'z': 4})
    
func()

输出:

Hello World
iter time: 0
iter time: 1
iter time: 2
iter time: 3
iter time: 4
60
33
34
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值