首页 > 编程语言 >python中的exec()、eval()以及complie()

python中的exec()、eval()以及complie()

时间:2023-08-04 20:56:32浏览次数:47  
标签:None code exec python source eval print complie

1.eval函数

函数的作用:

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

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()函数的返回值

实例:

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

输出结果:

a: 30
b: 3
c: 4
10 20
d: None

2.exec函数

函数的作用:

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

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

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

返回值:

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

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

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

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

例1:

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

x = 10
def func():
    y = 20
    a = exec("x+y")
    print("a:",a)
    b = exec("x+y",{"x":1,"y":2})
    print("b:",b)
    c = exec("x+y",{"x":1,"y":2},{"y":3,"z":4})
    print("c:",c)
    d = exec("print(x,y)")
    print("d:",d)
func()

执行结果:

#exec不会有任何返回值
a: None   
b: None
c: None
10 20
d: None

例2

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

func()

执行结果:

60
33
34

3.complie函数

函数的作用:

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’。必须要制定,不然肯定会报错。

例子:

s = """              #一大段代码
for x in range(10):
    print(x, end='')  
print()
"""
code_exec = compile(s, '<string>', 'exec')   #必须要指定mode,指定错了和不指定就会报错。
code_eval = compile('10 + 20', '<string>', 'eval')   #单个表达式
code_single = compile('name = input("Input Your Name: ")', '<string>', 'single')   #交互式

a = exec(code_exec)   #使用的exec,因此没有返回值
b = eval(code_eval)  

c = exec(code_single)  #交互
d = eval(code_single)
#Python小白学习交流群:711312441
print('a: ', a)
print('b: ', b)
print('c: ', c)
print('name: ', name)
print('d: ', d)
print('name; ', name)

执行结果:

0123456789  #有print就会打印
Input Your Name: kebi
Input Your Name: kebi
a:  None
b:  30
c:  None
name:  kebi
d:  None
name;  kebi

标签:None,code,exec,python,source,eval,print,complie
From: https://www.cnblogs.com/xxpythonxx/p/17607014.html

相关文章

  • python多进程编程常用到的方法
    python中的多线程其实并不是真正的多线程,如果想要充分地使用多核CPU资源,在python中大部分情况需要使用多进程。python提供了非常好用的多进程包Multiprocessing,只需要定义一个函数,python会完成其它所有事情。借助这个包,可以轻松完成从单进程到并发执行的转换。multiprocessing支......
  • 【python_5】基础语法:数据类型以及数据类型转变!
    1.使用type()语句查看数据类型目前在入门阶段,我们主要接触如下三类数据类型:类型描述说明string字符串类型用引号引起来的数据都是字符串int整型(有符号)数字类型,存放整数如-1,10,0等float浮点型(有符号)数字类型,存放小数如-3.14,6.78等我们可以通过type()语句来得到数据的类型:type(被查......
  • 关于Python的学习记录(二十一_对象的序列化和反序列化)
    JSON概述在Python中,我们可以将程序中的数据以JSON格式进行保存。JSON是“JavaScriptObjectNotation”的缩写,它本来是JavaScript语言中创建对象的一种字面量语法,现在已经被广泛的应用于跨语言跨平台的数据交换。使用JSON的原因非常简单,因为它结构紧凑而且是纯文本,任何操......
  • Python数据的深浅拷贝
    一、怎么理解深浅拷贝二、本人之前的错误理解(写到最后我会进行提示,以防某些同学跟着我之前的思路走,导致理解混乱,怕自己理解混乱的同学可以不看这部分。) 一、深浅拷贝主要的区别是在于数据进行拷贝的时候,发生的变化浅拷贝:创建一个新对象,然后将原始对象中的元素复制到新对象中......
  • 光环大数据python爬虫
    一、全面的爬虫工程师的技能单   1、python编程语言基础   2、HTTP协议(处理响应,)   3、html,css,javascript基本web技能   4、mysql/mongodb/redis等存储系统   5、urllib/requests/scrapy/pyspider 用来模拟浏览器发起HTTP请求的组件   6、抓包......
  • 如何在python中执行另一个py文件
    使用命令:os.system(‘pythonfile_name.py’)解释:os.system是执行当前的系统命令1、拿windows系统举例:#由于ipconfig/all在windows中是查看ip地址#所以将此命令运行在os.system中,即可查看系统的ip地址等信息importosos.system('ipconfig/all')#因为pythonfile_name.p......
  • python中字典的循环遍历的两种方式
    开发中经常会用到对于字典、列表等数据的循环遍历,但是python中对于字典的遍历对于很多初学者来讲非常陌生,今天就来讲一下python中字典的循环遍历的两种方式。注意:python2和python3中,下面两种方法都是通用的。1.只对键的遍历一个简单的for语句就能循环字典的所有键,就像处理序列一......
  • 用 Python 自动创建 Markdown 表格 - 每天5分钟玩转 GPT 编程系列(4)
    目录1.他们居然问我要Prompts2.让GPT-4来写代码2.1我对DevChat说2.2DevChat回答2.3我又对DevChat说2.4DevChat的第二轮回答2.5我再次对DevChat说2.6DevChat回答2.7最后效果3.他们居然让我要写总结1.他们居然问我要Prompts早几天我用GPT-4写了一个Gol......
  • python有哪几种循环语句
    在Python中,常用的循环语句有以下几种:for循环:用于遍历给定的序列(如列表、字符串等)或可迭代对象的元素。循环会重复执行固定次数,或者依次遍历序列中的每个元素。示例:forelementinsequence:#在这里执行循环体代码while循环:通过判断条件是否为真来控制循环的执行。只......
  • Python爬虫——爬虫时如何知道是否代理ip伪装成功?
    在进行爬虫时,我们可能需要使用代理IP来伪装自己的身份,以避免被网站封禁。如何判断代理IP是否伪装成功呢?本篇文章将围绕这个问题展开讲解,同时提供Python代码示例。确认代理IP地址首先,我们需要确认代理IP地址是否正确。我们可以使用一些免费的代理IP池网站,如:站大爷、碟鸟ip、开心代理......