第十四章 编译执行相关函数

1. 【将字符串编译为字节代码】compile()函数

语法参考

compile()函数用于将指定的字符串编译为字节代码。compile()函数的语法格式如下:

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

参数说明:

  • source:普通字符串、字节字符串或AST对象;

  • filename:代码文件名称,如果不是从文件读取代码,则传递一些可识别的值(如’ ‘或者’');

  • mode:指定编译代码的种类。如果要编译的字符串由一组Python代码组成,则指定为exec;如果要编译的字符串由一个Python表达式组成,则指定为eval;如果要编译的字符串为一条Python语句组成,则指定为single;

  • flags:可选择参数,用于和dont_inherit参数一起控制哪些语句会影响源代码的编译。默认值为0。如果flags和dont_inherit参数都为0,则使用调用compile()函数的有效语句编译代码;

  • dont_inherit:控制编译源码时的标志;

  • optimize:指定编译器的优化级别;默认值为-1,表示选择解释器的优化级别。还可以指定为0(无优化;__debug__为真)、1(删除断言、__debug__为假)或2(删除文档注释);

  • 返回值:返回编译后的字节码对象。

说明:compile()函数用于提供一次性的字节码编译,这样,就不用在以后每次调用中重新进行编译了

锦囊1 简单表达式返回计算结果

定义可执行代码字符串,其中包括一个Python表达式,通过compile()函数实现编译,再使用eval()函数来执行字节码对象,并输出返回结果。代码如下:

code = '100+200'
byte = compile(code,'','eval')  		# 编译为字节码对象
print(byte) 							# 输出编译后的字节码对象

value = eval(byte)  					# 执行字节码对象,并将返回结果赋值给变量value
print(value)

锦囊2 编译并执行一条Python语句

定义可执行代码字符串,其中包括一条Python语句,通过compile()函数实现编译,再使用exec()函数来执行字节码对象。代码如下:

code = '[i for i in range(10)]*2'
byte = compile(code,'','single')  		# 编译为字节码对象
exec(byte)                          	# 执行字节码对象

锦囊3 编译并执行一组Python语句

定义可执行代码字符串,其中包括一组Python语句,通过compile()函数实现编译,再使用exec()函数来执行字节码对象。代码如下:

code = """
print('今有物不知其数,三三数之剩二,五五数之剩三,七七数之剩二,问几何?\\n')
for number in range(100):
    if number%3 ==2 and number%5 ==3 and number%7 ==2:   	# 判断是否符合条件
        print('答曰:这个数是',number)                       # 输出符合条件的数
"""

byteExec = compile(code,'','exec') 							# 编译为字节码对象
exec(byteExec)  											# 执行字节码对象

锦囊4 编译字节码时忽略断言

在要编译的字符串中,加入断言语句,然后再调用compile()函数将该字符串编译为字节码对象,这里指定编译器的优化级别为1,表示删除断言,最后调用exec()函数执行字节码对象,代码如下:

code = """
for i in range(0,20,2):
    assert i == 0 ,'出现一次0'
    print(i,end='、')
"""

byteExec = compile(code,'','exec',optimize=1)  				# 编译为字节码对象
exec(byteExec)  											# 执行字节码对象

2. 【执行一个字符串表达式并返回执行结果】eval()函数

语法参考

eval()函数用于执行一个字符串表达式,并返回表达式的值。eval()函数的语法格式如下:

eval(expression, globals=None, locals=None)

参数说明:

  • expression:字符串类型表达式,该字符串表达式的内容为有效的Python表达式;

  • globals:可选参数,变量作用域,全局命名空间,如果指定该参数,则必须是一个字典对象;

  • locals:可选参数,变量作用域,局部命名空间,如果指定该参数,则可以是任何映射对象;

  • 返回值:返回表达式计算结果。

锦囊1 返回字符串表达式的计算结果

使用eval()函数返回字符串表达式的计算结果并输出。代码如下:

print(eval('1 + 2 + 3 + 4 + 5'))
n = 2                                   	# 定义变量
print(eval('1314 / n'))                		# 返回计算结果
print(eval('n * 521'))
print(eval('pow(n,4)'))
str = input('请输入一道算术题:')     			# 提示输入一个算术题
print(eval(str))                      		# 返回计算结果

锦囊2 循环将表达式的值保存到序列对象中

定义空的序列对象,然后通过循环来分别计算每一个数的3次方的值。代码如下:

i=0
list1=[]                              	# 空列表

while i<10:
    list1.append(eval('pow(i,3)'))     	# 执行字符串表达式,返回表达式的值
    i+=1

print(list1)

锦囊3 实现数据类型之间的转换

使用eval()函数实现数据类型之间的转换,代码如下:

a = '[99, 33, 78, 65]'
b = '(20,10,44)'
c = '521'

print(a, '转换前:', type(a))
print(a, '转换后:', type(eval(a)))   	# 转换为列表
print(b, '转换前:', type(b))
print(b, '转换后:', type(eval(b)))  	# 转换为元组
print(c, '转换前:', type(c))
print(c, '转换后:', type(eval(c)))   	# 转换为整型

锦囊4 执行代码时指定命名空间

先定义一个命名空间,该对象为字典,然后定义几个局部变量,再调用exec()函数两次,一次指定命名空间,一次不指定。代码如下:

namespace = {'id':'1001','name':'无语','python':'100'}  	# 命名空间
code = 'print(id + "\t" + name + "\t" + python)'
id = '1'
name = 'qq'
python = '99'

exec(code, namespace) 										# 执行代码时指定命名空间
exec(code) 													# 执行代码

锦囊5 在全局命名空间中执行代码

设置globals参数用来指定代码执行时可以使用的全局变量以及收集代码执行后的全局变量。代码如下:

a = 20
b = 3
num1 = eval('a+b')
print(num1)

def f():           						# 定义函数
    a = 5000
    b = 200
    num2 = eval('a+b')
    print(num2)
    num3 = eval('a+b',globals())
    print(num3)

f()                 					# 调用函数

锦囊6 在局部命名空间中执行代码

设置locals参数用来指定代码执行时可以使用的局部变量以及收集代码执行后的局部变量。代码如下:

a = 20
b = 3
num1 = eval('a+b')
print(num1)

def f():           						# 定义函数
    a = 5000
    b = 200
    num2 = eval('a+b')
    print(num2)
    num3 = eval('a+b',locals())
    print(num3)

f()                 					# 调用函数

3. 【执行储存在字符串或文件中的Python语句】exec()函数

语法参考

exec()函数用于执行储存在字符串或文件中的Python语句,相比于eval()函数,exec()函数可以执行更复杂的Python代码。exec()函数的语法格式如下:

exec(object[, globals[, locals]])

参数说明:

  • object:必选参数,表示需要被执行的Python代码。它必须是字符串或code对象。如果object是一个字符串,该字符串会先被解析为一组Python语句,然后再执行(除非发生语法错误)。如果object是一个code对象,那么它只是被简单的执行。

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

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

锦囊1 执行定义在字符串中的代码

将可执行代码定义在字符串变量中,再通过exec()函数来执行这个字符串。代码如下:

code = """
import random                            		# 导入随机数模块
i=0
list1=[]
while i<10:
    list1.append(random.randint(0,100)) 		# 将随机数添加到列表
    i+=1
print(list1)
"""

exec(code)

锦囊2 执行代码时指定命名空间

先定义一个命名空间,该对象为字典,然后定义几个局部变量,再调用exec()函数两次,一次指定命名空间,一次不指定。代码如下:

namespace = {'height':1.70,'weight':48.5}  # 命名空间

code = """
bmi=weight/(height*height)                  # 用于计算BMI指数,公式为“体重/身高的平方”
print('您的BMI指数为:',bmi)          		# 输出BMI指数

# 判断身材是否合理
if bmi<18.5:
    print('您的体重过轻 ~@_@~')
if bmi>=18.5 and bmi<24.9:
    print('正常范围,注意保持 (-_-)')
if bmi>=24.9 and bmi<29.9:
    print('您的体重过重 ~@_@~')
if bmi>=29.9:
    print('肥胖 ^@_@^')
"""

height = 1.80
weight = 79
exec(code, namespace) 						# 执行代码时指定命名空间
print('='*50)
exec(code) 									# 执行代码

4. 【将对象转换为可打印的字符串】repr()函数

语法参考

repr()函数用于将对象转化为供解释器读取的形式,通常表示为可打印的字符串。repr()函数的语法格式如下:

repr(object)

参数说明:

  • object:表示要转换的对象;

  • 返回值:一个对象的String格式,即字符串。

锦囊1 查看repr()函数返回对象的内容

repr()函数返回的字符串,还可以再传递给eval()函数,这时将生成具有相同值的对象。如果不传递给eval()函数,则表现类型是str(字符串),通常包含对象类型的名称和地址。可以使用type()函数获取其类型名称,使用id()函数获取其地址。例如,可以使用下面的代码测试。

string = '愿你的青春不负梦想'     	# 字符串
id(repr(string))                 	# 获取地址
type(repr(string))               	# 获取类型

锦囊2 将数值、字符串、列表、字典转换为供解释器读取的字符串

将数值、字符串、列表、字典转换为供解释器读取的字符串,代码如下:

repr(3.14*3)   													# 浮点数
string = '愿你的青春不负梦想'     								# 字符串
repr(string)
mrlist = ['888学院','www.mingrisoft.com','让编程更简单!']   	# 列表
repr(mrlist)
studict = {'id': '1001', 'name': '无语', 'english': 98, 'python': 100, 'c': 96}  # 字典
repr(studict)

锦囊3 repr()与str()函数的区别

函数str()与repr()函数都可以将对象转换为字符串,所不同的是str()用于将对象转换为适合人阅读的形式,而repr()用于将对象转换为供解释器读取的形式。例如,下面的代码。

string = '愿:\n你的青春不负梦想!'
string                      		# 输出string本来的样子

print(string)              			# 使用print()函数输出,将对转义字符进行转义
str(string)                			# 适合人阅读的形式
repr(string)               			# 适合解释器读取的形式
print(repr(string))       			# 使用print()函数输出repr()函数返回的值
print(str(string))        			# 使用print()函数输出str()函数返回的值

说明:使用str()函数转换后的值,使用print()输出时,与直接使用print()函数输出string是一样的。而使用repr()函数转换后的值,使用print()函数输出时,与直接在终端输出string是一样的。

锦囊4 将repr()函数的值传递给eval()函数

将repr()函数返回的字符串,再传递给eval()函数时,将生成具有相同值的对象。例如,下面的代码。

studict = {'id': '1001', 'name': '无语', 'english': 98, 'python': 100, 'c': 96}  		# 字典
studict
repr(studict)
eval(repr(studict))
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值