eval函数python
1、函数的做用express
将字符串str当成有效的表达式来求值并返回计算结果。它要执行的python代码只能是单个运算表达式(不支持任意形式的赋值操做),而不能是复杂的代码逻辑。函数
2、函数的定义url
eval(expression, globals=None, locals=None)spa
参数说明:.net
expression:必选参数,能够是字符串,也能够是一个任意的code对象实例(能够经过compile函数建立)。若是它是一个字符串,它会被看成一个python表达式进行分析和解释。code
globals:可选参数,表示全局命名空间(存放全局变量),若是被提供,则必须是一个字典对象。对象
locals:可选参数,表示当前局部命名空间(存放局部变量),若是被提供,能够是任何映射对象。若是该参数被忽略,那么它将会取与globals相同的值。blog
若是globals与locals都被忽略,那么它们将取eval()函数被调用环境下的全局命名空间和局部命名空间。字符串
返回值:
若是expression是一个code对象,且建立该code对象时,compile函数的mode参数是’exec’,那么eval()函数的返回值是None
不然,若是expression是一个输出语句,如print(),则eval()返回结果为None
不然,expression表达式的结果就是eval()函数的返回值
3、举几个栗子
(1)计算字符串中有效的表达式,并返回结果
- >>> eval('pow(2,2)')
- 4
- >>> eval('2 + 2')
- 4
(2)将字符串转成相应的对象(如list、tuple、dict和string之间的转换)
- >>> a = "[[1,2], [3,4], [5,6], [7,8], [9,0]]"
- >>> b = eval(a)
- >>> b
- [[1, 2], [3, 4], [5, 6], [7, 8], [9, 0]]
- >>> a = "{1:'xx',2:'yy'}"
- >>> c = eval(a)
- >>> c
- {1: 'xx', 2: 'yy'}
- >>> a = "(1,2,3,4)"
- >>> d = eval(a)
- >>> d
- (1, 2, 3, 4)
(3)更改变量值
- 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
- func()
输出:
a= 30
b= 3
c= 4
exec函数
1、函数的做用
动态执行python代码,能够执行复杂的python代码
2、函数定义
exec(object[, globals[, locals]]]
参数说明:
object:必选参数,表示须要被指定的python代码,它必须是字符串或code对象。若是object是一个字符串,该字符串会被先解析为一组python语句,而后再执行。若是object是一个code对象,那么它只是被简单的执行
globals:可选参数,同eval函数
locals:可选参数,同eval函数
返回值:
exec函数的返回值永远为None
3、栗子
(1)实例1
由于exec返回值是None
因此 a = exec(‘x+y’),这条代码会报错。
改成exec(‘x+y’),能够正常执行
而d = eval(‘print(x,y)’),这条代码会报错
改成d = exec(‘print(x,y)’),能够正常执行
(2)实例2
- 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()
输出:
60
33
34
针对最后一条结果的输出,为何z是30不是4,梳理一下执行过程以下:
- x=1
- y=2
- def func():
- y=3
- z=4
- z=30
- sum=x+y+z
- print(sum)
- func()
eval()函数与exec()函数的区别:
eval()函数只能计算单个表达式的值,而exec()函数能够动态运行代码段
eval()函数能够有返回值,而exec()函数返回值永远为None
原文:https://blog.csdn.net/xiaoquantouer/article/details/75049938