eval函数linux,Python中的eval()、exec()及其相关函数

刚好前些天有人提到eval()与exec()这两个函数,所以就翻了下Python的文档。这里就来简单说一下这两个函数以及与它们相关的几个函数,如globals()、locals()和compile():

1. eval函数

函数的作用:

计算指定表达式的值。也就是说它要执行的Python代码只能是单个运算表达式(注意eval不支持任意形式的赋值操作),而不能是复杂的代码逻辑,这一点和lambda表达式比较相似。

函数定义:

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

参数说明:

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

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

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

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

返回值:

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

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

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

实例:

x = 10

def func():

y = 20

a = eval('x + y')

print('a: ', a)

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)

func()

输出结果:

a: 30

b: 3

c: 4

10 20

d: None

对输出结果的解释:

对于变量a,eval函数的globals和locals参数都被忽略了,因此变量x和变量y都取得的是eval函数被调用环境下的作用域中的变量值,即:x = 10, y = 20,a = x + y = 30

对于变量b,eval函数只提供了globals参数而忽略了locals参数,因此locals会取globals参数的值,即:x = 1, y = 2,b = x + y = 3

对于变量c,eval函数的globals参数和locals都被提供了,那么eval函数会先从全部作用域globals中找到变量x, 从局部作用域locals中找到变量y,即:x = 1, y = 3, c = x + y = 4

对于变量d,因为print()函数不是一个计算表达式,没有计算结果,因此返回值为None

2. exec函数

函数的作用:

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

函数定义:

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

参数说明:

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

globals:可选参数,同eval函数

locals:可选参数,同eval函数

返回值:

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

需要说明的是在Python 2中exec不是函数,而是一个内置语句(statement),但是Python 2中有一个execfile()函数。可以理解为Python 3把exec这个statement和execfile()函数的功能够整合到一个新的exec()函数中去了:

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

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

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

实例1:

我们把实例1中的eval函数换成exec函数试试:

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()

输出结果:

a: None

b: None

c: None

10 20

d: None

因为我们说过了,exec函数的返回值永远为None。

实例2:

x = 10

expr = """

z = 30

sum = x + y + z

print(sum)

"""

def func():

y = 20

exec(expr)

exec(expr, {'x': 1, 'y': 2})

exec(expr, {'x': 1, 'y': 2}, {'y': 3, 'z': 4})

func()

输出结果:

60

33

34

对输出结果的解释:

前两个输出跟上面解释的eval函数执行过程一样,不做过多解释。关于最后一个数字34,我们可以看出是:x = 1, y = 3是没有疑问的。关于z为什么还是30而不是4,这其实也很简单,我们只需要在理一下代码执行过程就可以了,其执行过程相当于:

x = 1

y = 2

def func():

y = 3

z = 4

z = 30

sum = x + y + z

print(sum)

func()

3. globals()与locals()函数

函数定义及功能说明:

先来看下这两个函数的定义和文档描述

globals()

描述: Return a dictionary representing the current global symbol table. This is always the dictionary of the current module (inside a function or method, this is the module where it is defined, not the module from which it is called).

翻译: 返回一个表示当前全局标识符表的字典。这永远是当前模块的字典(在一个函数或方法内部,这是指定义该函数或方法的模块,而不是调用该函数或方法的模块)

locals()

描述: Update and return a dictionary representing the current local symbol table. Free variables are returned by locals() when it is called in function blocks, but not in class blocks.

Note The contents of this dictionary should not be modified; changes may not affect the values of local and free variables used by the interpreter.

翻译: 更新并返回一个表示当前局部标识符表的字典。自由变量在函数内部被调用时,会被locals()函数返回;自由变量在类累不被调用时,不会被locals()函数返回。

注意: locals()返回的字典的内容不应该被改变;如果一定要改变,不应该影响被解释器使用的局部变量和自由变量。

总结:

globals()函数以字典的形式返回的定义该函数的模块内的全局作用域下的所有标识符(变量、常量等)

locals()函数以字典的形式返回当前函数内的局域作用���下的所有标识符

如果直接在模块中调用globals()和locals()函数,它们的返回值是相同的

实例1:

name = 'Tom'

age = 18

def func(x, y):

sum = x + y

_G = globals()

_L = locals()

print(id(_G), type(_G), _G)

print(id(_L), type(_L), _L)

func(10, 20)

输出结果:

2131520814344 {'__builtins__': , 'func': , '__doc__': None, '__file__': 'C:/Users/wader/PycharmProjects/LearnPython/day04/func5.py', '__loader__': <_frozen_importlib_external.sourcefileloader object at>, '__spec__': None, 'age': 18, '__name__': '__main__', 'name': 'Tom', '__package__': None, '__cached__': None}

2131524302408 {'y': 20, 'x': 10, '_G': {'__builtins__': , 'func': , '__doc__': None, '__file__': 'C:/Users/wader/PycharmProjects/LearnPython/day04/func5.py', '__loader__': <_frozen_importlib_external.sourcefileloader object at>, '__spec__': None, 'age': 18, '__name__': '__main__', 'name': 'Tom', '__package__': None, '__cached__': None}, 'sum': 30}

实例2:

name = 'Tom'

age = 18

G = globals()

L = locals()

print(id(G), type(G), G)

print(id(L), type(L), L)

输出结果:

2494347312392 {'__file__': 'C:/Users/wader/PycharmProjects/LearnPython/day04/func5.py', '__loader__': <_frozen_importlib_external.sourcefileloader object at>, 'name': 'Tom', '__spec__': None, '__builtins__': , '__cached__': None, 'L': {...}, '__package__': None, '__name__': '__main__', 'G': {...}, '__doc__': None, 'age': 18}

2494347312392 {'__file__': 'C:/Users/wader/PycharmProjects/LearnPython/day04/func5.py', '__loader__': <_frozen_importlib_external.sourcefileloader object at>, 'name': 'Tom', '__spec__': None, '__builtins__': , '__cached__': None, 'L': {...}, '__package__': None, '__name__': '__main__', 'G': {...}, '__doc__': None, 'age': 18}

上面打印出的G和L的内存地址是一样的,说明在模块级别locals()的返回值和globals()的返回值是相同的。

4. compile函数

函数的作用:

将source编译为code对象或AST对象。code对象能够通过exec()函数来执行或者通过eval()函数进行计算求值。

函数定义:

compile(source, filename, mode[, flags[, dont_inherit]])

参数说明:

source:字符串或AST(Abstract Syntax Trees)对象,表示需要进行编译的Python代码

filename:指定需要编译的代码文件名称,如果不是从文件读取代码则传递一些可辨认的值(通常是用'

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

另外两个可选参数暂不做介绍

实例:

s = """

for x in range(10):

print(x, end='')

print()

"""

code_exec = compile(s, '', 'exec')

code_eval = compile('10 + 20', '', 'eval')

code_single = compile('name = input("Input Your Name: ")', '', 'single')

a = exec(code_exec)

b = eval(code_eval)

c = exec(code_single)

d = eval(code_single)

print('a: ', a)

print('b: ', b)

print('c: ', c)

print('name: ', name)

print('d: ', d)

print('name; ', name)

输出结果:

0123456789

Input Your Name: Tom

Input Your Name: Jerry

a: None

b: 30

c: None

name: Jerry

d: None

name; Jerry

5. 这几个函数的关系

comiple()函数、globals()函数、locals()函数的返回结果可以当作eval()函数与exec()函数的参数使用。

另外,我们可以通过判断globals()函数的返回值中是否包含某个key来判断,某个全局变量是否已经存在(被定义)。

0b1331709591d260c1c78e86d0c51c18.png

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/529483.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

linux更改语言脚本,Linux shell脚本入门——shell语言脚本【CentOS】

认识脚本是使用一种特定的描述性语言&#xff0c;依据一定的格式编写的可执行文件。脚本语言又被称为扩建的语言, 或者动态语言, 是一种编程语言, 用来控制软件应用程序, 脚本通常是以文本 (ASCⅡ) 保存, 只是在被调用时进行解释或者编译。学习shell脚本的用途对于一个合格的系…

linux可用的ftp,linuxunix下有很多可用的ftp服务器

一、ftp服务器简介linux/unix下有很多可用的ftp服务器&#xff0c;根据这些ftp服务器的可配置性大概可以分为3类&#xff1a;弱、中等、高。功能比较简单的ftp服务器软件有“ftpd”和“oftpd”。前者与ftp客户端工具“ftp”类似&#xff0c;只实现了标准的ftp功能&#xff0c;支…

linux视图版怎么输入命令,分享在Linux命令下操作MySQL视图实例代码

视图VIEW命令简介&#xff1a;VIEW视图就是存储下来的SELECT语句数据1。创建视图命令格式&#xff1a;创建[或更换][ALGORITHM {UNDEFINED | MERGE | 不是Temptable}][DEFINER {user | 当前用户 }][SQL SECURITY {DEFINER | INVOKER}]VIEW view_name [(column_list)]AS selec…

宝塔linux 做负载均衡,利用BT宝塔面板做网站多服务器负载均衡图文教程

对于我们做网站的来说&#xff0c;如果流量大了&#xff0c;一台服务器肯定是不够的&#xff0c;接下来要考虑很多方面&#xff0c;比如动静分离、比如数据库异步&#xff0c;比如负载均衡等等。因为我们很多新手站长都用的是BT宝塔面板&#xff0c;下面虾皮路就介绍一下利用BT…

c语言程序设计移动字母,C语言程序设计模拟试题二(含答案)

C语言程序设计模拟试题二(含答案)1、下列电子邮件地址中正确的是(其中□表示空格)A) Malin&http://www.doczj.com/doc/2969157fa26925c52cc5bfdc.html B) malinhttp://www.doczj.com/doc/2969157fa26925c52cc5bfdc.htmlC) Lin□Ma&http://www.doczj.com/doc/2969157fa2…

c语言字符串输出瘕b,c语言课件10tt函数(1)幻灯片资料(51页)-原创力文档

第 5 讲 ;第 8 章 函 数;引例 1;引例2b;m1cmpmax( a , b );cmpmax(int x , int y ){ int z; zx>y?x:y; return (z);};说 明;8.2 函数的调用;main( ){int i2,p; pf( i , i ); printf("%d\n",p);}int f(int a, int b){int c; if (a>b) c1; else if (a b) c0; el…

50行以上c语言程序代码,C语言非常简单的字符统计程序50行

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼该程序用于实现linux系统中wc命令的最简单模式wc 命令用于统计文件中字符信息。[xxlocalhost 1.5]$ wc 01.c 02.c 03.c15 23 131 01.c13 18 127 02.c14 20 128 03.c42 61 386 总用量使用c语言写出这种小程序。/** Name: count.c* T…

语音编码 c语言,语音编解码算法G.723.1在DSP - 嵌入式新闻 - 电子发烧友网

1 引言G.723.1是删组织于1996年推出的一种低码率的语音编码算法标准&#xff0c;也是目前该组织颁布的语音压缩标准中码率最低的一种标准。G.723.1主要用于对语音及其它多媒体声音信号的压缩&#xff0c;目前在一些数字音视频传输、高质量语音压缩等系统中都得到广泛应用。2 G.…

四川大学 设计专业 C语言必修,四川大学C语言2001年真题_跨考网

一、单项选择题(在每小题的四个备选答案中&#xff0c;选出一个正确的答案&#xff0c;并将其号码写在答题纸上。请注意注明题号。每小题1分&#xff0c;共计6分)1、‘\t’表示什么?①字符串常数②标识符③变量④字符常量答案&#xff1a;④2、对宏定义不正确的描述是哪一个?…

大整数乘法c语言数组,很大的数相乘怎么办?

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼#include&nbsp #include&nbsp using&nbsp namespace&nbsp std;int&nbsp main(int&nbsp argc,&nbsp char&nbsp *argv[]){&nbsp &nbsp&nbsp &nbsp long&nbsp i,j, c,l…

血型遗传关系c语言编程,根据血型遗传关系,编程实现:○1.输入

满意答案df4dfw5e562017.05.28采纳率&#xff1a;51% 等级&#xff1a;6已帮助&#xff1a;106人//仅作参考#include "stdio.h"#include "conio.h"#include "stdlib.h"#include "string.h"int studentNum 0;#define MAXSTUDENT (1…

linux tcb,在Linux中从潜藏密码迁移至tcb怎么做?

潜藏密码作为Linux产品的既定事实标准已经有好多年了&#xff0c;md5密码的运用亦是如此。但是&#xff0c;运用传统的潜藏密码要领也有不足之处&#xff0c;甚至md5也不像以前那么安全了。潜藏密码文件的一个缺点就是&#xff0c;任意一个须要查询个别潜藏密码(如您的密码)的使…

android 通话结束广播,在Android中以编程方式结束通话

侃侃尔雅您无需成为系统应用程序。首先&#xff0c;com.android.internal.telephony在您的项目中创建包&#xff0c;并将其放入名为“ ITelephony.aidl” 的文件中&#xff1a;package com.android.internal.telephony; interface ITelephony { boolean endCall(); vo…

android url 快捷方式,Android向桌面添加快捷方式,使其指向特定的(URL)网页

/** 在桌面添加快捷方式* param icon 快捷方式图标* param name 快捷方式名称* param uri 快捷方式的intent Uri*/public void addShortcut(Parcelable icon, String name, Uri uri){Intent intentAddShortcut new Intent(ACTION_ADD_S…

带nfc 的 android 华为,华为手机NFC功能,原来这么好用,不会用真可惜几千块钱了...

华为手机NFC功能&#xff0c;原来这么好用&#xff0c;不会用真可惜几千块钱了2019-05-06 17:40:259点赞12收藏6评论华为手机在国内也是数一数二的了&#xff0c;那么用华为手机的小伙伴&#xff0c;怎么能错过华为手机中NFC的功能呢&#xff1f;下面就随小编一起来了解一下吧。…

android adb apk包名,ADB命令简单使用--查看包名、activity等

1、连接设备adb connect ip2、查看连接的设备adb devices3、安装/卸载Android 应用adb install packagesnameadb uninstall packagesname4、查看设备安装包名adb shell pm list packages5、查看安装包的路劲adb shell pm path packagename6、包pull到本地adb shell pull 包路径…

小米3升级android 6.0,可升级Android 6.0机型一览 小米手机亮了

前不久&#xff0c;Android M被谷歌正式确定为6.0系统&#xff0c;代号Marshmallow&#xff0c;预计年底前发布。而对于普通用户来说&#xff0c;最关心的就是自己的手机能不能升级。不过别着急&#xff0c;在此之前&#xff0c;我们不妨看看Android 6.0有哪些新功能。一、Andr…

android 開發人員模式,Android

選取月份2021 年 5 月 (9)2021 年 4 月 (11)2021 年 3 月 (7)2021 年 2 月 (7)2021 年 1 月 (7)2020 年 12 月 (10)2020 年 11 月 (8)2020 年 10 月 (8)2020 年 9 月 (6)2020 年 8 月 (7)2020 年 7 月 (12)2020 年 6 月 (10)2020 年 5 月 (14)2020 年 4 月 (10)2…

安装华为鸿蒙,魅族选择与鸿蒙合作,华为这下要成了?

嚯&#xff0c;咱们的魅族可真争气&#xff01;眼看华为6月2日的大新闻箭在弦上蓄势待发&#xff0c;一句“你好&#xff0c;鸿蒙”的问候&#xff0c;瞬间引爆了微博&#xff1a;具体有多热闹&#xff0c;你们瞧瞧这转发和点赞&#xff1a;众所周知&#xff0c;华为鸿蒙自从公…

浏览器兼容性怎么设置HTML,ie10浏览器中兼容性设置在哪里

之前ie浏览器一直被诟病的因素之一就是兼容性&#xff0c;不过ie10浏览器可以对兼容性进行设置&#xff0c;使得在兼容性视图中显示所有网站&#xff0c;具体怎么设置呢。下面由学习啦小编为你整理了ie10浏览器兼容性设置在哪里的解决方法&#xff0c;希望对你有帮助!ie10兼容性…