函数的作用:
计算指定表达式的值。也就是说它要执行的python代码只能是单个表达式(注意eval不支持任何形式的赋值操作),而不能是复杂的代码逻辑。
eval(expression, globals=None, locals=None)
如果globals与locals都被忽略,那么它们将取eval()函数被调用环境下的全局命名空间和局部命名空间。
x = 10
def func():
y = 20 # 局部变量y
a = eval("x+y") # x本地没有就调用全局变量
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}) # 第一个{"x":1,"y":2}全局变量globals ,第二个{"y":3,"z":4}局部变量locals.,
print("c:",c)
d = eval("print(x,y)")
print("d:",d) # 对于变量d,因为print()函数不是一个计算表达式,因此没有返回值
func()
输出:
a: 30
b: 3
c: 4
10 20
d: None
对输出结果的解释:
函数的作用:
动态执行Python代码。也就是说exec可以执行复杂的Python代码,而不像eval函数那么样只能计算一个表达式的值。
函数定义:
exec(object[, globals[, locals]])
参数说明:
需要说明的是在Python 2中exec不是函数,而是一个内置语句(statement),但是Python 2中有一个execfile()函数。可以理解为Python 3把exec这个statement和execfile()函数的功能够整合到一个新的
exec()函数中去了:
eval()函数与exec()函数的区别:
eval()函数只能计算单个表达式的值,而exec()函数可以动态运行代码段。
eval()函数可以有返回值,而exec()函数返回值永远为None。
实例1:
我们把实例1中的eval函数换成exec函数试试:
'''
学习中遇到问题没人解答?小编创建了一个Python学习交流群:711312441
寻找有志同道合的小伙伴,互帮互助,群里还有不错的视频学习教程和PDF电子书!
'''
x = 10
def func():
y = 20
a = exec("x+y")
print("a:",a)
b = exec("x+y",{"x":1,"y":2})
print("b:",b)
c = exec("x+y",{"x":1,"y":2},{"y":3,"z":4})
print("c:",c)
d = exec("print(x,y)")
print("d:",d)
func()
输出:
a: None
b: None
c: None
10 20
d: None
函数的作用:
compile(source, filename, mode, flags=0, dont_inherit=False, optimize=-1)
参数说明:
如果source由单个表达式组成, 则指定mode='eval’;如果source是由一个单独的交互式语句组成,则指定modo='single’. 必须要制定,不然肯定会报错.
s = """ #一大段代码
for x in range(10):
print(x, end='>>')
print()
"""
code_exec = compile(s, '' , 'exec') #必须要指定mode,指定错了和不指定就会报错.
code_eval = compile('10 + 20', '' , 'eval') #单个表达式
code_single = compile('name = input("Input Your Name: ")', '' , 'single') #交互式
a = exec(code_exec) # 使用的exec,因此没有返回值
b = eval(code_eval)
c = exec(code_single) #交互
d = eval(code_single)
print('a: ', a)
print('b: ', b)
print('c: ', c)
print('d: ', d)
案例
x = 10
expr = """
z = 30
sum = x + y + z #一大包代码
print(sum)
"""
def func():
y = 20
exec(expr) #10+20+30
exec(expr,{'x':1,'y':2}) #30+1+2
exec(expr,{'x':1,'y':2},{'x':50,'y':3,'z':4}) #30+1+3,x是定义全局变量1,y是局部变量
func()
输出:
60
33
83