博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
内置函数— — eval、exec、compile
阅读量:5153 次
发布时间:2019-06-13

本文共 2328 字,大约阅读时间需要 7 分钟。

字符串类型代码:eval、exec、compile

eval()  执⾏字符串类型的代码,并返回最终结果

print(eval("2+2")) # 4 n=8print(eval("2+n")) # 10def func():    print(666)eval("func()")  # 666# 简易计算器code = input("请输入你要执行的代码:")ret = eval(code)print(ret)>>>请输入你要执行的代码:1+2  + 3>>>6# 把字符串类型的代码还原回字典, 列表, 元组s = "{'name':'alex', 'age':18, 'isMan':False}" # 字符串ret = eval(s)  # 侧重的有返回值print(ret)  # {'name': 'alex', 'age': 18, 'isMan': False}print(type(ret))  # 

 

exec()  执⾏字符串类型的代码,返回值永远为 None. (execute执行的缩写)

# 相比于 eval,exec可以执行更复杂的 Python 代码,但是也不能太长,不能太乱(那种要使用compile)# 流程控制语句exec("""for i in range(10):    print(i)""")# 自定义函数exec("""def func():    print("我是周杰伦") func()""")print(exec("1+2+3+4"))  # None 没有返回值. 想要返回值用evalexec("print('hello,world')")  # hello,worldcode = input("请输入你要执行的代码")a = exec(code) # 没有返回值. 想要返回值用evalprint(a)>>>请输入你要执行的代码1+2  + 3>>>Nonecode = input("请输入你要执行的代码")exec(code) # 没有返回值. 想要返回值用evalprint(a)   # pycharm报错不一定准# 这里的代码a在pycharm中是出红线了,因为它不知道这里的a是什么,上面的代码没有定义过.但是代码执行 之后在控制台输出了正确的结果并没有报错,因为你在input函数执行时候的控制台中输入了a = 'alex'(反正就是以代码(字符串)的形式创建并赋值了变量a)>>>请输入你要执行的代码a = 'alex'>>>alex

 

compile  将字符串类型的代码编译成字节代码对象。代码对象能够通过exec语句来执行或者eval()进行求值。

语法: 

compile(source, filename, mode[, flags[, dont_inherit]]) 参数说明:

  1. 参数source:要执⾏的代码, 动态代码⽚段

 

 
2. 参数
filename
文件名, 代码存放的文件名, 当传入了第一个参数的时候, 这个参数给空字符串就可以了
代码要么直接以字符串代码的形式给出,要么存
    放
在文件中给出,所以这两个参数必须有一个为空字符串.
  3. 参数model:模式,指定编译代码的种类,可以指定为 ‘exec’,’eval’,’single’。
    exec: 当source中包含流程语句时,model应指定为‘exec’;
    eval:  当source中只包含一个简单的求值表达式,model应指定为‘eval’;
    single: 当source中包含了交互式命令语句,model应指定为'single'。
 
#流程语句使用execcode1 = "for i in range(10): print(i)"  #代码c1 = compile(code1, "", mode="exec") # 预加载代码exec(c1)  # 运行代码  # 字符串代码内部存在print就不需要再print了>>>0123456789#简单求值表达式用evalcode2 = "1+2+3"c2 = compile(code2, "", mode="eval")a = eval(c2)print(a)>>>6#交互语句(比如input)用singlecode3 = "name = input('请输⼊入你的名字:')"c3 = compile(code3, "", mode="single")exec(c3)  print(name)  # 字符串代码内部不存在print就需要再print>>> print(name)#执行前name变量不存在,解释器红线报错Traceback (most recent call last):  File "
", line 1, in
nameNameError: name 'name' is not defined>>> #执行时显示交互命令,提示输入请输⼊入你的名字:Mary>>> print(name) #执行后name变量有值,输出Mary
 

小结:

  有返回值的字符串形式的代码⽤eval().

  没有返回值的字符串形式的代码用exec().

  一般很少⽤到compile()

 
 

 

转载于:https://www.cnblogs.com/liangxiaoji/p/10110920.html

你可能感兴趣的文章
配置IIS虚拟目录遇到的5个问题
查看>>
2-03顺序表的操作
查看>>
耿丹CS16-2班第一次作业汇总
查看>>
查看mysql表大小
查看>>
命令行程序测试自动化
查看>>
My Blog
查看>>
array_reduce() 与 array_map()
查看>>
SASS实现代码的重用:混合器Mixin、继承
查看>>
《windows核心编程系列》三谈谈内核对象及句柄的本质
查看>>
Linux下安装maven
查看>>
使用OpenMP实现并行归并排序(Report)
查看>>
转:【Java并发编程】之十五:并发编程中实现内存可见的两种方法比较:加锁和volatile变量...
查看>>
linux nohup【转】
查看>>
SQL语句优化
查看>>
校验银行卡号是否符合Luhn算法及生成符合Luhn算法的银行卡号
查看>>
MFC 双缓冲加载背景
查看>>
记录自己最近的学习状态
查看>>
hdu 1142 最短路+记忆化深搜---好题
查看>>
day 018 面向对象--约束和异常处理
查看>>
Day3_基本数据类型
查看>>