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

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

print(eval("2+2")) # 4
n=8
print(eval("2+n")) #
def func():
print(666)
eval("func()") # # 简易计算器
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)) # <class 'dict'>

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 没有返回值. 想要返回值用eval
exec("print('hello,world')") # hello,world code = input("请输入你要执行的代码")
a = exec(code) # 没有返回值. 想要返回值用eval
print(a)
>>>请输入你要执行的代码1+2 + 3
>>>None code = input("请输入你要执行的代码")
exec(code) # 没有返回值. 想要返回值用eval
print(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'。


#流程语句使用exec
code1 = "for i in range(10): print(i)" #代码
c1 = compile(code1, "", mode="exec") # 预加载代码
exec(c1) # 运行代码 # 字符串代码内部存在print就不需要再print了
>>>
0
1
2
3
4
5
6
7
8
9 #简单求值表达式用eval
code2 = "1+2+3"
c2 = compile(code2, "", mode="eval")
a = eval(c2)
print(a)
>>>
6 #交互语句(比如input)用single
code3 = "name = input('请输⼊入你的名字:')"
c3 = compile(code3, "", mode="single")
exec(c3)
print(name) # 字符串代码内部不存在print就需要再print
>>> print(name)#执行前name变量不存在,解释器红线报错
Traceback (most recent call last):
File "<pyshell#29>", line 1, in <module>
name
NameError: name 'name' is not defined
>>> #执行时显示交互命令,提示输入
请输⼊入你的名字:Mary >>> print(name) #执行后name变量有值,输出
Mary

小结:

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

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

  一般很少⽤到compile()



 

内置函数— — eval、exec、compile的更多相关文章

  1. 内置函数——eval、exec、compile

    内置函数——eval.exec.compile eval() 将字符串类型的代码执行并返回结果 print(eval('1+2+3+4')) exec()将自字符串类型的代码执行 print(exec ...

  2. Python内置函数eval

    英文文档: eval(expression, globals=None, locals=None) The arguments are a string and optional globals an ...

  3. Python内置函数(62)——exec

    英文文档: exec(object[, globals[, locals]]) This function supports dynamic execution of Python code. obj ...

  4. 29 内置方法 eval | exec 元类 单例

    eval与exec内置方法 将字符串作为执行目标,得到响应结果 eval常用作类型转换:该函数执行完有返回值 exec拥有执行更复杂的字符串:可以形成名称空间 eval内置函数的使用场景:   1.执 ...

  5. Python内置函数(20)——exec

    英文文档: exec(object[, globals[, locals]]) This function supports dynamic execution of Python code. obj ...

  6. python 内置函数eval()、exec()、compile()

    eval 函数的作用: 计算指定表达式的值.也就是说它要执行的python代码只能是单个表达式,而不是复杂的代码逻辑.    eval(source, globals=None, locals=Non ...

  7. python内置函数 eval()、exec()以及complie()函数

    1.eval函数 eval() 函数用来执行一个字符串表达式,并返回表达式的值. eval(expression[, globals[, locals]]) 参数 expression -- 表达式. ...

  8. 内置函数---eval、exec、compile

    eval() 将字符串类型的代码执行并返回结果 print(eval('1+2+3+4')) exec()将自字符串类型的代码执行 print(exec("1+2+3+4")) e ...

  9. 内置函数--eval

    eval参数是一个字符串, 可以把这个字符串当成表达式来求值, 比如'x+2'就是一个表达式字符串>>> x = 2>>> print (eval('x+2'))2 ...

随机推荐

  1. Map接口---Day20

    Map接口概述: 现实生活中,我们常会看到这样的一种集合:IP地址与主机名,身份证号与个人,系统用户名与系统用户对象等, 这种一一对应的关系,就叫做映射.Java提供了专门的集合类用来存放这种对象关系 ...

  2. Java深入学习(5):锁

    可重入锁: 简单来说,支持重复加锁,有可重用性 特征:锁可以传递,方法递归传递 目的:避免了死锁现象 代码: public class Test implements Runnable { @Over ...

  3. C/C++ 函数参数传递:传值,传指针,传引用

    前面我们介绍了函数的调用约定,明白了函数调用者与被调用者之间传递参数的顺序与如何进行栈恢复的. 实际上,函数调用者如何将参数传递给被调用者也是有讲究的. 总的来说,函数参数传递分为3种情况:传值,传指 ...

  4. 阿里云ECS-使用putty产品psftp工具上传下载

    本人windows10,安装了winscp3,原本可以简单易用,但天空不作美,死活不让我连接,无奈,只能换命令行方式, 好在,putty提供了一个小工具,psftp,不过,需要去官网下载完整版才有哦, ...

  5. pyqt5--TableWidGet

    使用pyqt5展示excel的数据到桌面,并获取选中的数据内容 from PyQt5 import QtCore, QtGui, QtWidgets from PyQt5.QtGui import Q ...

  6. Qt编译报错:The kit Desktop Qt...has configuration issues which might be the root cause for this problem.

    报错:Cannot find file: E:\实验室\20180409_Qt跑马灯\QtTest\QtTest.pro. 17:03:11: 进程"D:\Qt\Qt5.8.0\5.8\ms ...

  7. 算法dfs——二叉搜索树中最接近的值 II

    901. 二叉搜索树中最接近的值 II 中文 English 给定一棵非空二叉搜索树以及一个target值,找到 BST 中最接近给定值的 k 个数. 样例 样例 1: 输入: {1} 0.00000 ...

  8. python中的特殊注释#todo与#type

    0904自我总结 python中的特殊注释 一.#TODO 这个注释用来快熟找到内容 #todo这里的todo不用区分大小写 写法标记的位置,#todo 备注内容 二.#type a = 1 #typ ...

  9. spring security 学习资料

    spring security 学习资料 网址 Spring Security 文档参考手册中文版 https://springcloud.cc/spring-security.html

  10. CodeForces - 666E: Forensic Examination (广义SAM 线段树合并)

    题意:给定字符串S,然后M个字符串T.Q次询问,每次给出(L,R,l,r),问S[l,r]在L到R这些T字符串中,在哪个串出现最多,以及次数. 思路:把所有串建立SAM,然后可以通过倍增走到[l,r] ...