Python学习笔记011——内置函数eval()
1 描述
eval() 函数用来执行一个字符串表达式,并返回表达式的值
2 语法
原文
eval(expression[, globals=None[, locals=None]])
expression(sourse) -- 字符串表达式。也即,再写该表达式时不能忘记引号“ ”
=语句字符串
globals -- 变量作用域,全局命名空间,如果被提供,则必须是一个字典对象。
= 全局变量,若有,必须是字典。
locals -- 变量作用域,局部命名空间,如果被提供,可以是任何映射对象。
=局部变量,若有,必须是字典,若无,则等同于globals
3 返回值
返回表达式expression执行结果
4 练习
4.1 执行动态语句
>>> eval("1+2") 3
print(eval("1+2")) #3
4.2 globals 与locals 省略
官方示例
>>> x=1 >>> eval("x+1") 2
也可以时多个参数
x = 1 y = 2 a = eval("x+y") print("a =",a)
运行:
a = 3
注意:
a = eval("x+y")
等价于
a = eval("x+y",{"x":1,"y":2},{"x":1,"y":2})
4.2 globals和locals省略问题
x = 100 y = 200 ls = {"x":1,"y":2} c = eval("x+y",ls) print("c =",c) print("x = %d,y = %d"%(x,y))
运行
c = 3 x = 100,y = 200
x = 100 y = 200 ls = {"x":1,"y":2} gs = {"x":3,"y":4} a = eval("x+y",ls,gs) print("a =",a) #a = 7 print("ls[x] = %d,ls[y] = %d"%(ls["x"],ls["y"])) #ls[x] = 1,ls[y] = 2 print("gs[x] = %d,gs[y] = %d"%(gs["x"],gs["y"])) #gs[x] = 3,gs[y] = 4 print("x = %d, y = %d"%(x,y)) #x = 100, y = 200 print("-------------------------------") b = eval("x+y",ls) print("b =",b) #b = 3 print("ls[x] = %d,ls[y] = %d"%(ls["x"],ls["y"])) #ls[x] = 1,ls[y] = 2 print("gs[x] = %d,gs[y] = %d"%(gs["x"],gs["y"])) #gs[x] = 3,gs[y] = 4 print("x = %d, y = %d"%(x,y)) #x = 100, y = 200 print("-------------------------------") c = eval("x+y",ls,None) print("c =",c) #c = 3 print("ls[x] = %d,ls[y] = %d"%(ls["x"],ls["y"])) #ls[x] = 1,ls[y] = 2 print("gs[x] = %d,gs[y] = %d"%(gs["x"],gs["y"])) #gs[x] = 3,gs[y] = 4 print("x = %d, y = %d"%(x,y)) #x = 100, y = 200 print("-------------------------------") d = eval("x+y",None,gs) print("d =",d) d = 7 print("ls[x] = %d,ls[y] = %d"%(ls["x"],ls["y"])) #ls[x] = 1,ls[y] = 2 print("gs[x] = %d,gs[y] = %d"%(gs["x"],gs["y"])) #gs[x] = 3,gs[y] = 4 print("x = %d, y = %d"%(x,y)) #x = 100, y = 200
运行
a = 7 ls[x] = 1,ls[y] = 2 gs[x] = 3,gs[y] = 4 x = 100, y = 200 ------------------------------- b = 3 ls[x] = 1,ls[y] = 2 gs[x] = 3,gs[y] = 4 x = 100, y = 200 ------------------------------- c = 3 ls[x] = 1,ls[y] = 2 gs[x] = 3,gs[y] = 4 x = 100, y = 200 ------------------------------- d = 7 ls[x] = 1,ls[y] = 2 gs[x] = 3,gs[y] = 4 x = 100, y = 200
4.4关于变量绑定时的报错
尽管 x 已经定义,但是不是全局变量
>>> {"x":1} {'x': 1} >>> eval("x+1") # 在全部变量中没有定义 Traceback (most recent call last): File "<stdin>", line 1, in <module> File "<string>", line 1, in <module> NameError: name 'x' is not defined
>>> a = {"x":1} >>> eval("a['x']+1") # 这里一定要注意不能内外均是双引号,这样会报错 2
>>> a = {"x":1} >>> eval("x+1",a) #在a中有x的定义,可以执行 2
5 原技术文档
eval
(expression, globals=None, locals=None)
The arguments are a string and optional globals and locals. If provided, globals must be a dictionary. If provided, locals can be any mapping object.
The expression argument is parsed and evaluated as a Python expression (technically speaking, a condition list) using the globals and locals dictionaries as global and local namespace. If the globals dictionary is present and lacks ‘__builtins__’, the current globals are copied into globals before expression is parsed. This means that expression normally has full access to the standard builtins
module and restricted environments are propagated. If the locals dictionary is omitted it defaults to the globals dictionary. If both dictionaries are omitted, the expression is executed in the environment where eval()
is called. The return value is the result of the evaluated expression. Syntax errors are reported as exceptions. Example:
>>> x = 1 >>> eval('x+1') 2
This function can also be used to execute arbitrary code objects (such as those created by compile()
). In this case pass a code object instead of a string. If the code object has been compiled with 'exec'
as the mode argument, eval()
‘s return value will be None
.
Hints: dynamic execution of statements is supported by the exec()
function. The globals()
and locals()
functions returns the current global and local dictionary, respectively, which may be useful to pass around for use by eval()
or exec()
.
See ast.literal_eval()
for a function that can safely evaluate strings with expressions containing only literals.
6 参考
https://www.cnblogs.com/sesshoumaru/p/5995712.html
-
6 参考
Python学习笔记011——内置函数eval()的更多相关文章
- Python学习笔记011——内置函数exec()
1 描述 把一个字符串当成语句执行 exec() 执行储存在字符串或文件中的 Python 语句,相比于 eval() , exec() 可以执行更复杂的 Python 代码. exec函数和ev ...
- python学习笔记011——内置函数pow()
1 语法 pow(x, y[, z]) x -- 数值表达式. y -- 数值表达式. z -- 数值表达式. 函数是计算 x 的 y 次方,如果 z 在存在,则再对结果进行取模,其结果等效于pow( ...
- python学习笔记011——内置函数dir()
1 描述 dir()函数可以查看(打印)对象的属性和方法.不管时那种对象(python中一切皆对象)类型(数据,模块)都有自己的属性和方法. dir() 函数不带参数时,返回当前范围内的变量.方法和定 ...
- python学习笔记011——内置函数__module__、__name__
1 __module__描述 __module__ : 如果当前模块为顶层模块执行 则打印__main__ 如果当前模块为被调用模块的时候 打印当前模块的名称 2 __module__示例 def f ...
- python学习笔记011——内置函数sorted()
1 描述 sorted() 函数对所有可迭代的对象进行排序操作. sorted() 与sort()函数之间的区别 1 排序对象 sorted:所有可迭代对象的排序 sort:list列表的排序 2 返 ...
- python学习笔记011——内置函数filter()
1 描述 filter() 函数用于过滤序列,过滤掉不符合条件的元素,返回由符合条件元素组成的新列表. 2 语法 filter(function, iterable) function -- 函数,过 ...
- python学习笔记011——内置函数sum()
1 描述 sum() 方法对系列进行求和计算. 2 语法 sum(iterable[, start]) iterable:可迭代对象,如列表. start:指定相加的参数,如果没有设置这个值,默认为0 ...
- python学习笔记011——内置函数__sizeof__()
1 描述 __sizeof__() : 打印系统分配空间的大小 2 示例 def fun(): pass print(fun.__sizeof__()) 运行 112
- Python学习笔记-Day3-python内置函数
python内置函数 1.abs 求绝对值 2.all 判断迭代器中的所有数据是否都为true 如果可迭代的数据的所有数据都为true或可迭代的数据为空,返回True.否则返回False 3.a ...
随机推荐
- OTL翻译(9) --常量的SQL语句
常量的SQL语句 一个没有绑定变量的SQL语句.SQL语句块或是存储过程就被称为常量的SQL语句.OTL通过一个静态的函数来执行这样的SQL语句. 例如: // static otl_cursor:: ...
- 内存泄漏 Memory Leaks 内存优化 MD
Markdown版本笔记 我的GitHub首页 我的博客 我的微信 我的邮箱 MyAndroidBlogs baiqiantao baiqiantao bqt20094 baiqiantao@sina ...
- CSS3中background属性的调整
CSS3对于background做了一些修改,最明显的一个就是采用设置多背景,不但添加了4个新属性,并且还对目前的属性进行了调整增强. 1.多个背景图片 在css3里面,你可以再一个标签元素里应用多个 ...
- 升级iOS10后http网页定位失效解决方案
最近我们在做项目时遇到这样一个新问题,用户在升级 iOS10 后,在 http 下使用 geolocation api 会报错,控制台输出 [blocked] Access to geolocatio ...
- 2015 HDU 多校联赛 5363 Key Set
2015 HDU 多校联赛 5363 Key Set 题目: http://acm.hdu.edu.cn/showproblem.php? pid=5363 依据前面给出的样例,得出求解公式 fn = ...
- System.Net.Http.Formatting的nuget版本冲突问题
已经添加了nuget Microsoft.AspNet.WebApi.Client 调用System.Net.Http.HttpClient.PostAsJsonAsync的时候报如下的错误: C ...
- netdata的安装与使用
具体的netdata介绍请参照GIT:https://github.com/firehol/netdata/wiki 以下只介绍centos下的netdata的安装与使用: 1.安装Netdata需要 ...
- 下载RAD
1.登录https://w3-103.ibm.com/software/xl/download/ticket.do 2.输入Intranet ID和pswd,然后选I Agree. 3.然后点Sear ...
- PS常用技能综合
1.ps中怎么吧选中的一块区域覆盖到另一个区域中? 1.用PS中选取工具或套索工具--选好后用移动工具把你选取的区域移动到你要覆盖的地方2.或用图章工具中的仿制图章 2.如何将选中的区域新建为一个新图 ...
- Modifying a Request or Response
To make custom changes to web requests and responses, use FiddlerScript to add rules to Fiddler's On ...