eval、exec和compile

1.eval函数

函数的作用:

计算指定表达式的值。也就是说它要执行的python代码只能是单个表达式(注意eval不支持任何形式的赋值操作),而不能是复杂的代码逻辑。

  1. eval(source, globals=None, locals=None, /)

参数说明:

source:必选参数,可以是字符串,也可以是一个任意的code(代码)对象实例(可以通过complie函数创建)。如果它是一个字符串,它会被当作一个(使用globals和locals参数作为全局和本地命名空间的)python表达式进行分析和解释。

globals:可选参数,表示全局命名空间(存放全局变量),如果被提供,则必须是一个字典对象。

locals:可选参数,表示全局命名空间(存放局部变量),如果被提供,可以是任何映射对象。如果参数被忽略,那么它将会取与globals相同的值。

如果globals与locals都被忽略,那么它们将取eval()函数被调用环境下的全局命名空间和局部命名空间。

返回值:

如果source是一个code对象,且创建该code对象时,complie函数的mode参数是‘exec’,那么eval()函数的返回值是None;

否则,如果source是一个输出语句,如print(),则eval()返回结果为None;

否则,source表达式的结果就是eval()函数的返回值

实例:

  1. x = 10
  2. def func():
  3. y = 20 #局部变量y
  4. a = eval("x+y")
  5. print("a:",a) #x没有就调用全局变量
  6. b = eval("x+y",{"x":1,"y":2}) #定义局部变量,优先调用
  7. print("b:",b)
  8. c = eval("x+y",{"x":1,"y":2},{"y":3,"z":4})
  9. print("c:",c)
  10. d = eval("print(x,y)")
  11. print("d:",d) #对于变量d,因为print()函数不是一个计算表达式,因此没有返回值
  12. func()

输出结果:

  1. a: 30
  2. b: 3
  3. c: 4
  4. 10 20
  5. d: None

2.exec函数

函数的作用:

动态执行python代码。也就是说exec可以执行复杂的python代码,而不像eval函数那样只能计算一个表达式的值。

  1. exec(source, globals=None, locals=None, /)

source:必选参数,表示需要被指定的python代码。它必须是字符串或code对象。如果source是一个字符串,该字符串会先被解析为一组python语句,然后执行。如果source是一个code对象,那么它只是被简单的执行。

返回值:

exec函数的返回值永远为None。

eval()函数和exec()函数的区别

eval()函数只能计算单个表达式的值,而exec()函数可以动态运行代码段。

eval()函数可以有返回值,而exec()函数返回值永远为None。

例1:

我们把eval中的例子拿过来执行

  1. x = 10
  2. def func():
  3. y = 20
  4. a = exec("x+y")
  5. print("a:",a)
  6. b = exec("x+y",{"x":1,"y":2})
  7. print("b:",b)
  8. c = exec("x+y",{"x":1,"y":2},{"y":3,"z":4})
  9. print("c:",c)
  10. d = exec("print(x,y)")
  11. print("d:",d)
  12. func()

执行结果

  1. #exec不会有任何返回值
  2. a: None
  3. b: None
  4. c: None
  5. 10 20
  6. d: None

例2

  1. x = 10
  2. expr = """
  3. z = 30
  4. sum = x + y + z #一大包代码
  5. print(sum)
  6. """
  7. def func():
  8. y = 20
  9. exec(expr) 10+20+30
  10. exec(expr,{'x':1,'y':2}) 30+1+2
  11. exec(expr,{'x':1,'y':2},{'y':3,'z':4}) #30+1+3,x是定义全局变量1,y是局部变量
  12. func()

执行结果:

  1. 60
  2. 33
  3. 34

3.complie函数

函数的作用:

  1. compile(source, filename, mode, flags=0, dont_inherit=False, optimize=-1)

参数说明

source:字符串或AST对象,表示需要进行编译的python代码

filename:指定需要编译的代码文件,如果不是文件读取代码则传递一些可辨认的值。

mode:用于标识必须当做那类代表来编译;如果source是由一个代码语句序列组成,则指定mode=‘exec’,如果source由单个表达式组成,则指定mode=‘eval’;如果source是由一个单独的交互式语句组成,则指定modo=‘single’。必须要制定,不然肯定会报错。

例子:

  1. s = """ #一大段代码
  2. for x in range(10):
  3. print(x, end='')
  4. print()
  5. """
  6. code_exec = compile(s, '<string>', 'exec') #必须要指定mode,指定错了和不指定就会报错。
  7. code_eval = compile('10 + 20', '<string>', 'eval') #单个表达式
  8. code_single = compile('name = input("Input Your Name: ")', '<string>', 'single') #交互式
  9. a = exec(code_exec) 使用的exec,因此没有返回值
  10. b = eval(code_eval)
  11. c = exec(code_single) 交互
  12. d = eval(code_single)
  13. print('a: ', a)
  14. print('b: ', b)
  15. print('c: ', c)
  16. print('name: ', name)
  17. print('d: ', d)
  18. print('name; ', name)

执行结果:

  1. 0123456789 #有print就会打印
  2. Input Your Name: kebi
  3. Input Your Name: kebi
  4. a: None
  5. b: 30
  6. c: None
  7. name: kebi
  8. d: None
  9. name; kebi

python中的进制转换

  1. #十进制专换
  2. print(bin(10))#十进制转二进制0b1010
  3. print(oct(10))#十进制转八进制0o12
  4. print(hex(10))#十进制转十六进制0xa
  5. #其他进制转十进制
  6. print(int('0b1010',2))
  7. print(int('0o12',8))
  8. print(int('0xa',16))

python补充之进制转换、exec、eval、compile的更多相关文章

  1. chr()//ord() //进制转换函数//eval()//文件函数//split()

    1.chr() 函数 chr() 用一个范围在 range(256)内的(就是0-255)整数作参数,返回一个对应的字符. 用法:chr(i) i可以是10进制也可以是16进制的形式的数字. 2.or ...

  2. Python内置进制转换函数(实现16进制和ASCII转换)

    在进行wireshark抓包时你会发现底端窗口报文内容左边是十六进制数字,右边是每两个十六进制转换的ASCII字符,这里使用Python代码实现一个十六进制和ASCII的转换方法. hex() 转换一 ...

  3. python 数据类型、进制转换

    数据类型 存储单位 最小单位是bit,表示二进制的0或1,一般写作b 最小的存储单位是字节,用byte表示,1B = 8b 1024B = 1KB 1024KB = 1MB 1024MB = 1GB ...

  4. python 数值系列-进制转换

    进制转换 前语: 如果您不通二进制,八进制,十六进制,请移步:http://www.360doc.com/content/17/0211/21/40101294_628326994.shtml 问题 ...

  5. Python版任意进制转换

    def decimalToAny(num,n): baseStr = {10:"a",11:"b",12:"c",13:"d&qu ...

  6. python中的进制转换

    python中常用的进制转化通常有两种方法: 1.用内置函数hex(),oct(),bin(),对应的数字表示为0x,0o,0b,功能是把十进制数字转化为其他进制  >>> int( ...

  7. python(42):进制转换

    十六进制 到 十进制 使用 int() 函数 ,第一个参数是字符串 '0Xff' ,第二个参数是说明,这个字符串是几进制的数.  转化的结果是一个十进制数. >>> int('0xf ...

  8. bugku 之 crypto:进制转换的python脚本

    题目如下: text.txt的内容: 知识点:python怎么做进制转换 除了自己按照计算方法写一遍进制转换,可以用python自带的强制转换: int(a,num) 其中,int是转换成十进制整数类 ...

  9. python 进制 转换

    测试用的python源码 ''''' Created on 2014年8月21日 @author: lenovo ''' import binascii import struct def examp ...

随机推荐

  1. ubuntu服务器允许Root用户登录

    1.重置root密码 sudo passwd root 2.修改ssh配置文件 sudo vim /etc/ssh/sshd_config后进入配置文件中修改PermitRootLogin后的默认值为 ...

  2. 纯css闪烁效果

    .i-i-box-active{ -webkit-animation: shan666 1s infinite ease-in-out; animation: shan666 1s infinite ...

  3. oracle 迁移数据文件

    步骤: 1.SQL>SELECT FILE_NAME FROM DBA_DATA_FILES; FILE_NAME --------------------------------------- ...

  4. c#字符串代码,动态创建编译器

    https://www.cnblogs.com/mrma/p/3998679.html 试了,确实可行,在unity也能用 值得注意的是UnityScript.Scripting.Evaluator ...

  5. Chapter02 第三节 其他语句

    2.3 其他语句 // getinfo.cpp #include <bits/stdc++.h> using namespace std; int main() { int carrots ...

  6. linux/linux学习笔记-vim文本编辑器(mooc)

    vim文本编辑器 vim与vi的区别:( vim=vi +IMproved) VIM是一个Unix以及类unix文本编辑器 特点:功能强大,高度可定制 vim编辑器的三种模式:一般模式.编辑模式和命令 ...

  7. CentOS7编译安装sshpass过程

    环境说明:centos 7 cat /etc/redhat-release CentOS Linux release 7.6.1810 (Core) 我的sshpass版本 sshpass-1.06. ...

  8. QML - 实现Gstreamer投屏 投屏画面遮挡

    1.     背景介绍 中控端运行的操作系统是Android,中控软件主要功能有导航.收音机.媒体(音乐).蓝牙(连接).手机互联.行车辅助和系统设置等. 仪表端运行的操作系统是Linux,仪表软件主 ...

  9. echart 柱状图X轴显示不全

    z要设置interval为0就可以了 xAxis: [ { type: "category", boundaryGap: false, data: [], axisLine: { ...

  10. Min-Max 容斥的证明

    这里有 Min-Max 容斥的证明以及唯一一道博主做过的例题... 上个结论: \[Min\{S\}=\sum_{T\subseteq S,T\not=\varnothing}(-1)^{|T|-1} ...