详解python eval函数的妙用


Posted in Python onNovember 16, 2017

python eval函数功能:将字符串str当成有效的表达式来求值并返回计算结果。

函数定义:

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

将字符串str当成有效的表达式来求值并返回计算结果。globals和locals参数是可选的,如果提供了globals参数,那么它必须是dictionary类型;如果提供了locals参数,那么它可以是任意的map对象。

python的全局名字空间存储在一个叫globals()的dict对象中;局部名字空间存储在一个叫locals()的dict对象中。我们可以用print (locals())来查看该函数体内的所有变量名和变量值。

Python版本兼容:

  1. Python2.7
  2. Python3.x

eval()主要作用:

1)在编译语言里要动态地产生代码,基本上是不可能的,但动态语言是可以,意味着软件已经部署到服务器上了,但只要作很少的更改,只好直接修改这部分的代码,就可立即实现变化,不用整个软件重新加载。
2)在machin learning里根据用户使用这个软件频率,以及方式,可动态地修改代码,适应用户的变化。

英文解释:

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:

例子:

a=1
g={'a':20}
eval("a+1",g)

结果:
1

例子2, 测试globals, locals

x = 1
y = 1
num1 = eval("x+y")
print (num1)
def g(): 
 x = 2 
 y = 2 
 num3 = eval("x+y") 
 print (num3)  
 num2 = eval("x+y",globals()) 
 #num2 = eval("x+y",globals(),locals()) 
 print (num2)
  
g()

num1的值是2;num3的值也很好理解,是4;num2的值呢?由于提供了globals()参数,那么首先应当找全局的x和y值,也就是都为1,那么显而易见,num2的值也是2。如果注释掉该句,执行下面一句呢?根据第3)点可知,结果为4

实例展示:

可以把list,tuple,dict和string相互转化。

#################################################
字符串转换成列表
>>>a = "[[1,2], [3,4], [5,6], [7,8], [9,0]]"
>>>type(a)
<type 'str'>
>>> b = eval(a)
>>> print b
[[1, 2], [3, 4], [5, 6], [7, 8], [9, 0]]
>>> type(b)
<type 'list'>
#################################################
字符串转换成字典
>>> a = "{1: 'a', 2: 'b'}"
>>> type(a)
<type 'str'>
>>> b = eval(a)
>>> print b
{1: 'a', 2: 'b'}
>>> type(b)
<type 'dict'>
#################################################
字符串转换成元组
>>> a = "([1,2], [3,4], [5,6], [7,8], (9,0))"
>>> type(a)
<type 'str'>
>>> b = eval(a)
>>> print b
([1, 2], [3, 4], [5, 6], [7, 8], (9, 0))
>>> type(b)
<type 'tuple'>

安全问题:

因为eval的特型, 很可能被黑客利用,造成安全问题。

怎么避免安全问题?

1、自行写检查函数;

2、使用ast.literal_eval代替

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
关于你不想知道的所有Python3 unicode特性
Nov 28 Python
Python格式化压缩后的JS文件的方法
Mar 05 Python
Python手机号码归属地查询代码
May 04 Python
python处理html转义字符的方法详解
Jul 01 Python
Python实现字典按照value进行排序的方法分析
Dec 23 Python
python3实现SMTP发送邮件详细教程
Jun 19 Python
python面向对象之类属性和类方法案例分析
Dec 30 Python
解决pytorch DataLoader num_workers出现的问题
Jan 14 Python
Python控制台输出时刷新当前行内容而不是输出新行的实现
Feb 21 Python
python如何调用字典的key
May 25 Python
python uuid生成唯一id或str的最简单案例
Jan 13 Python
Python基于argparse与ConfigParser库进行入参解析与ini parser
Feb 02 Python
Python算法之图的遍历
Nov 16 #Python
Python之Scrapy爬虫框架安装及使用详解
Nov 16 #Python
python字典操作实例详解
Nov 16 #Python
python实现报表自动化详解
Nov 16 #Python
TF-IDF算法解析与Python实现方法详解
Nov 16 #Python
疯狂上涨的Python 开发者应从2.x还是3.x着手?
Nov 16 #Python
Python自然语言处理之词干,词形与最大匹配算法代码详解
Nov 16 #Python
You might like
Terran魔法科技
2020/03/14 星际争霸
php ftp文件上传函数(基础版)
2010/06/03 PHP
8个必备的PHP功能开发
2015/10/02 PHP
PHP7创建销毁session的实例方法
2020/02/03 PHP
js 跳出页面的frameset框架示例介绍
2013/12/23 Javascript
详解JavaScript逻辑And运算符
2015/12/04 Javascript
原生js实现移动端瀑布流式代码示例
2015/12/18 Javascript
一种Javascript解释ajax返回的json的好方法(推荐)
2016/06/02 Javascript
javascript时间戳和日期字符串相互转换代码(超简单)
2016/06/22 Javascript
Bootstrap Table从服务器加载数据进行显示的实现方法
2016/09/29 Javascript
JS实现禁止鼠标右键的功能
2016/10/15 Javascript
angular ng-click防止重复提交实例
2017/06/16 Javascript
Bootstrap + AngularJS 实现简单的数据过滤字符查找功能
2017/07/27 Javascript
JavaScript 中Date对象的格式化代码方法汇总
2017/09/06 Javascript
Cookbook组件形式:优化 Vue 组件的运行时性能
2018/11/25 Javascript
Vue + Element UI图片上传控件使用详解
2019/08/20 Javascript
vue项目中监听手机物理返回键的实现
2020/01/18 Javascript
Vue微信公众号网页分享的示例代码
2020/05/28 Javascript
[03:39]2015国际邀请赛主赛事首日精彩回顾
2015/08/05 DOTA
Python常用的文件及文件路径、目录操作方法汇总介绍
2015/05/21 Python
Python缩进和冒号详解
2016/06/01 Python
详解Python 数据库的Connection、Cursor两大对象
2018/06/25 Python
python getopt模块使用实例解析
2019/12/18 Python
使用tensorflow实现VGG网络,训练mnist数据集方式
2020/05/26 Python
PyQt5实现简单的计算器
2020/05/30 Python
Python 存取npy格式数据实例
2020/07/01 Python
html5响应式开发自动计算fontSize的方法
2020/01/13 HTML / CSS
瑞典最好的运动鞋专卖店:Sneakersnstuff
2016/08/29 全球购物
GANT英国官方网上商店:甘特衬衫
2018/02/06 全球购物
自荐书封面下载
2013/11/29 职场文书
揭牌仪式主持词
2014/03/19 职场文书
为什么node.js不适合大型项目
2021/04/28 Javascript
详解Python牛顿插值法
2021/05/11 Python
MySQL query_cache_type 参数与使用详解
2021/07/01 MySQL
浅谈JavaScript浅拷贝和深拷贝
2021/11/07 Javascript
Go语言读取txt文档的操作方法
2022/01/22 Golang