python学习笔记 day15内置函数(二)

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的值

运行结果:

 

posted @ 2018-09-05 22:32  写的BUG代码少  阅读(100)  评论(0编辑  收藏  举报