详解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 相关文章推荐
详解Django中的ifequal和ifnotequal标签使用
Jul 16 Python
pandas.dataframe中根据条件获取元素所在的位置方法(索引)
Jun 07 Python
解决pycharm无法识别本地site-packages的问题
Oct 13 Python
Python魔法方法详解
Feb 13 Python
基于树莓派的语音对话机器人
Jun 17 Python
python实现图片九宫格分割
Mar 07 Python
Django admin.py 在修改/添加表单界面显示额外字段的方法
Aug 22 Python
python错误调试及单元文档测试过程解析
Dec 19 Python
python实现扫雷游戏
Mar 03 Python
python如何支持并发方法详解
Jul 25 Python
利用Python读取微信朋友圈的多种方法总结
Aug 23 Python
Python使用华为API为图像设置多个锚点标签
Apr 12 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&amp;java(三)
2006/10/09 PHP
PHP中include()与require()的区别说明
2010/03/10 PHP
基于AppServ,XAMPP,WAMP配置php.ini去掉警告信息(NOTICE)的方法详解
2013/05/07 PHP
PHP防止跨域提交表单
2013/11/01 PHP
PHP面向对象程序设计之类常量用法实例
2014/08/20 PHP
laravel利用中间件防止未登录用户直接访问后台的方法
2019/09/30 PHP
php实现微信小程序授权登录功能(实现流程)
2019/11/13 PHP
浅谈JavaScript中面向对象技术的模拟
2006/09/25 Javascript
jQuery AnythingSlider滑动效果插件
2010/02/07 Javascript
JQueryEasyUI Layout布局框架的使用
2013/04/08 Javascript
javascript阻止浏览器后退事件防止误操作清空表单
2013/11/22 Javascript
JavaScript字符串对象toUpperCase方法入门实例(用于把字母转换为大写)
2014/10/17 Javascript
JavaScript Window浏览器对象模型方法与属性汇总
2015/04/20 Javascript
JS+CSS实现类似QQ好友及黑名单效果的树型菜单
2015/09/22 Javascript
bootstrap-treeview自定义双击事件实现方法
2016/01/09 Javascript
使用原生的javascript来实现轮播图
2017/02/24 Javascript
angular2路由切换改变页面title的示例代码
2017/08/23 Javascript
Vue 源码分析之 Observer实现过程
2018/03/29 Javascript
vue axios整合使用全攻略
2018/05/24 Javascript
解决layui中的form表单与button的点击事件冲突问题
2018/08/15 Javascript
NodeJs 文件系统操作模块fs使用方法详解
2018/11/26 NodeJs
JS实现多功能计算器
2020/10/28 Javascript
[52:26]完美世界DOTA2联赛决赛 FTD vs Phoenix 第一场 11.08
2020/11/11 DOTA
python的else子句使用指南
2016/02/27 Python
python 使用get_argument获取url query参数
2017/04/28 Python
Python+matplotlib绘制不同大小和颜色散点图实例
2018/01/19 Python
深入flask之异步非堵塞实现代码示例
2018/07/31 Python
python ipset管理 增删白名单的方法
2019/01/14 Python
pytorch之ImageFolder使用详解
2020/01/06 Python
python2和python3哪个使用率高
2020/06/23 Python
MUGLER官方网站:蒂埃里·穆勒香水
2019/11/26 全球购物
如何利用XMLHTTP检测URL及探测服务器信息
2013/11/10 面试题
初中家长寄语
2014/04/02 职场文书
研究生简历自我评价范文
2014/09/13 职场文书
工伤私了协议书范本
2014/11/24 职场文书
2015元旦家电促销活动策划方案
2014/12/09 职场文书