exec() eval()
这两个函数都可以作用于字符串类型的代码:
code='print("哈哈哈哈")' #code是一个字符串,但是里面的代码是一个python的语句 exec(code) eval(code)
运行结果:
所以eval()和exec()函数都可以执行字符串类型的代码
再来看一个例子:
code='1+2+3+4' print(eval(code)) print(exec(code))
运行结果:
eval()是有返回值的,而exec()函数没有返回值
eval()函数适用于带有返回值的,比如上面的数值计算代码;
exec()函数适用于流程控制的:
code='for i in range(3):print(i)' #流程控制代码,没有返回值,在字符串中 exec(code)
运行结果:
code='1+2+3+4' print(eval(code))
运行结果:
compile()函数:编译(不太重要)
就是普通的代码都是需要先编译为字节码,才能被执行,但是如果一段代码很很长很长,但是有需要被后面反复执行,这时候如果按部就班的执行,编译的时间都要花费掉很长时间,所以如果先把它编译,后面再执行就基本不用时间的~
第一种:流程控制(字符串中的代码就是流程控制,比如for循环,没有返回值)使用exec
code1='for i in range(10):print(i)' compile1=compile(code1,'','exec') #中间的‘’那个,除非是从文件中取才写filename, exec(compile1) #流程控制的就用exec
运行结果:
第二种:数值计算(字符串中的代码需要计算返回值,数值计算比如1+2+3+4),带有返回值的用eval
code2='1+2+3+4' compile2=compile(code2,'','eval') #数值类型,带有返回值的就用eval print(eval(compile2))
运行结果:
第三种:用户交互(字符串中的代码含有input)用single,打印仍是用exec:
code3='name=input("please input your name:")' compile3=compile(code3,'','single') # print(name) #这个时候会报错,因为内存中并没有name这个变量,前面只是编译了,字符串里面的并没有被执行 exec(compile3) print(name) #exec之后就会在内存中生成name变量了,可以打印处name的值
运行结果: