详解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网络编程学习笔记(10):webpy框架
Jun 09 Python
Python使用requests及BeautifulSoup构建爬虫实例代码
Jan 24 Python
Python 统计字数的思路详解
May 08 Python
django中使用Celery 布式任务队列过程详解
Jul 29 Python
python中类的输出或类的实例输出为这种形式的原因
Aug 12 Python
使用遗传算法求二元函数的最小值
Feb 11 Python
Python安装whl文件过程图解
Feb 18 Python
快速解决jupyter notebook启动需要密码的问题
Apr 21 Python
Python中的Cookie模块如何使用
Jun 04 Python
python实现自动清理重复文件
Aug 24 Python
互斥锁解决 Python 中多线程共享全局变量的问题(推荐)
Sep 28 Python
python 爬取哔哩哔哩up主信息和投稿视频
Jun 07 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
程序员编程十条戒律
2009/07/09 PHP
Laravel中unique和exists验证规则的优化详解
2018/01/28 PHP
jquery ajax同步异步的执行最终解决方案
2013/04/26 Javascript
node.js中的fs.mkdir方法使用说明
2014/12/17 Javascript
JQuery分屏指示器图片轮换效果实例
2015/05/21 Javascript
JavaScript实现同一页面内两个表单互相传值的方法
2015/08/12 Javascript
jquery实现简单实用的弹出层效果代码
2015/10/15 Javascript
JavaScript仿flash遮罩动画效果
2016/06/15 Javascript
bootstrap laydate日期组件使用详解
2017/01/04 Javascript
jQuery学习之DOM节点的插入方法总结
2017/01/22 Javascript
bootstarp modal框居中显示的实现代码
2017/02/18 Javascript
VueAwesomeSwiper在VUE中的使用以及遇到的一些问题
2018/01/11 Javascript
使用sessionStorage解决vuex在页面刷新后数据被清除的问题
2018/04/13 Javascript
JS面向对象编程基础篇(一) 对象和构造函数实例详解
2020/03/03 Javascript
vue+iview框架实现左侧动态菜单功能的示例代码
2020/07/23 Javascript
JS+CSS实现过渡特效
2021/01/02 Javascript
[00:32]2018DOTA2亚洲邀请赛Secret出场
2018/04/03 DOTA
[01:08:56]DOTA2-DPC中国联赛 正赛 Magma vs LBZS BO3 第一场 2月7日
2021/03/11 DOTA
Python 不同对象比较大小示例探讨
2014/08/21 Python
使用Python中的greenlet包实现并发编程的入门教程
2015/04/16 Python
Python实现屏幕截图的代码及函数详解
2016/10/01 Python
python GUI实例学习
2017/11/21 Python
python3.x上post发送json数据
2018/03/04 Python
Python中分支语句与循环语句实例详解
2018/09/13 Python
python使用zip将list转为json的方法
2018/12/31 Python
python利用selenium进行浏览器爬虫
2019/04/25 Python
pandas按行按列遍历Dataframe的几种方式
2019/10/23 Python
python自动分箱,计算woe,iv的实例代码
2019/11/22 Python
pandas分组聚合详解
2020/04/10 Python
Python configparser模块常用方法解析
2020/05/22 Python
英语专业推荐信
2013/11/16 职场文书
党员公开承诺事项
2014/03/25 职场文书
我们的节日清明节活动总结
2014/04/30 职场文书
行政人事专员岗位职责
2015/04/07 职场文书
小学二年级班主任工作经验交流材料
2015/11/02 职场文书
Python PIL按比例裁剪图片
2022/05/11 Python