详解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实现新浪博客备份的方法
Apr 27 Python
Python实现的自定义多线程多进程类示例
Mar 23 Python
python3+PyQt5泛型委托详解
Apr 24 Python
python excel使用xlutils类库实现追加写功能的方法
May 02 Python
浅析python3中的os.path.dirname(__file__)的使用
Aug 30 Python
Python判断一个三位数是否为水仙花数的示例
Nov 13 Python
python 内置模块详解
Jan 01 Python
python抓取需要扫微信登陆页面
Apr 29 Python
python实现随机漫步方法和原理
Jun 10 Python
Python 把序列转换为元组的函数tuple方法
Jun 27 Python
Python3 用matplotlib绘制sigmoid函数的案例
Dec 11 Python
利用python查看数组中的所有元素是否相同
Jan 08 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实现清除wordpress里恶意代码
2015/10/21 PHP
ExtJs设置GridPanel表格文本垂直居中示例
2013/07/15 Javascript
js控制表单操作的常用代码小结
2013/08/15 Javascript
查找Oracle高消耗语句的方法
2014/03/22 Javascript
JS操作COOKIE实现备忘记录的方法
2016/04/01 Javascript
JQuery解析XML的方法小结
2016/04/02 Javascript
js实现楼层效果的简单实例
2016/07/15 Javascript
基于jQuery实现文字打印动态效果
2017/04/21 jQuery
使用Bootstrap打造特色进度条效果
2017/05/02 Javascript
关于redux-saga中take使用方法详解
2018/02/27 Javascript
vue2 全局变量的设置方法
2018/03/09 Javascript
Angular6新特性之Angular Material
2018/12/28 Javascript
微信小程序获取用户信息的两种方法wx.getUserInfo与open-data实例分析
2019/05/03 Javascript
JS使用new操作符创建对象的方法分析
2019/05/30 Javascript
JS实现音量控制拖动
2020/01/15 Javascript
Vue 401配合Vuex防止多次弹框的案例
2020/11/11 Javascript
javascript实现左右缓动动画函数
2020/11/25 Javascript
vue监听键盘事件的相关总结
2021/01/29 Vue.js
python调用java的Webservice示例
2014/03/10 Python
python中的五种异常处理机制介绍
2014/09/02 Python
python比较2个xml内容的方法
2015/05/11 Python
Python字符串大小写转换拼接删除空白
2019/09/19 Python
Python二元赋值实用技巧解析
2019/10/25 Python
flask利用flask-wtf验证上传的文件的方法
2020/01/17 Python
使用Python中tkinter库简单gui界面制作及打包成exe的操作方法(二)
2020/10/12 Python
matplotlib绘制鼠标的十字光标的实现(内置方式)
2021/01/06 Python
新英格兰最大的特色礼品连锁店:The Paper Store
2018/07/23 全球购物
struct与class的区别
2014/02/03 面试题
J2EE相关知识面试题
2013/08/26 面试题
店长助理岗位职责
2013/12/13 职场文书
个人实习生的自我评价
2014/02/16 职场文书
关于保护环境的建议书
2014/05/13 职场文书
学校政风行风自查自纠报告
2014/10/21 职场文书
学校领导班子成员查摆问题及整改措施
2014/10/28 职场文书
银行客户经理岗位职责
2015/04/09 职场文书
SpringCloud中分析讲解Feign组件添加请求头有哪些坑梳理
2022/06/21 Java/Android