详解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 相关文章推荐
简明 Python 基础学习教程
Feb 08 Python
Python实现3行代码解简单的一元一次方程
Aug 18 Python
Python编写一个闹钟功能
Jul 11 Python
Python爬虫实现百度图片自动下载
Feb 04 Python
python如何实现反向迭代
Mar 20 Python
python 编码规范整理
May 05 Python
Python判断telnet通不通的实例
Jan 26 Python
详解Python用户登录接口的方法
Apr 17 Python
Python Django模板之模板过滤器与自定义模板过滤器示例
Oct 18 Python
Python数据结构dict常用操作代码实例
Mar 12 Python
Django视图、传参和forms验证操作
Jul 15 Python
Python 读写 Matlab Mat 格式数据的操作
May 19 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
php获取mysql版本的几种方法小结
2008/03/25 PHP
PHP实现通过URL提取根域名
2016/03/31 PHP
基于JQuery的asp.net树实现代码
2010/11/30 Javascript
wap手机图片滑动切换特效无css3元素js脚本编写
2014/07/28 Javascript
理解javascript闭包
2015/12/15 Javascript
JS限制条件补全问题实例分析
2016/12/16 Javascript
JS使用正则截取两个字符串之间的字符串实现方法详解
2017/01/06 Javascript
详解vue2.0的Element UI的表格table列时间戳格式化
2017/06/13 Javascript
JavaScript之promise_动力节点Java学院整理
2017/07/03 Javascript
Vue兼容ie9的问题全面解决方案
2018/06/19 Javascript
Angular7.2.7路由使用初体验
2019/03/01 Javascript
微信小程序云开发之使用云存储
2019/05/17 Javascript
Vuex的实战使用详解
2019/10/31 Javascript
JavaScript常用工具函数大全
2020/05/06 Javascript
使用Vant完成DatetimePicker 日期的选择器操作
2020/11/12 Javascript
[02:47]2018年度DOTA2最佳辅助位选手4号位-完美盛典
2018/12/17 DOTA
python实现线程池的方法
2015/06/30 Python
Python操作RabbitMQ服务器实现消息队列的路由功能
2016/06/29 Python
go和python变量赋值遇到的一个问题
2017/08/31 Python
python批量复制图片到另一个文件夹
2018/09/17 Python
使用 Python 快速实现 HTTP 和 FTP 服务器的方法
2019/07/22 Python
Window版下在Jupyter中编写TensorFlow的环境搭建
2020/04/10 Python
tensorflow安装成功import tensorflow 出现问题
2020/04/16 Python
Pycharm调试程序技巧小结
2020/08/08 Python
让IE支持CSS3的不完全兼容方案
2014/09/19 HTML / CSS
css3实现文字扫光渐变动画效果的示例
2017/11/07 HTML / CSS
Html5页面二次分享的实现
2018/07/30 HTML / CSS
新领导上任欢迎词
2014/01/13 职场文书
美术教师岗位职责
2014/03/18 职场文书
求职自荐信的格式
2014/04/07 职场文书
乡镇领导干部个人对照检查材料思想汇报
2014/09/23 职场文书
教师党员整改措施
2014/10/24 职场文书
乐山大佛导游词
2015/02/02 职场文书
银行求职自荐信范文
2015/03/04 职场文书
《原神》新角色演示“神里绫人:林隐泓洄” 宠妹狂魔
2022/04/03 其他游戏
SQLyog的下载、安装、破解、配置教程(MySQL可视化工具安装)
2022/09/23 MySQL