详解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中的With语句
Mar 18 Python
python 简单的绘图工具turtle使用详解
Jun 21 Python
Python Socket使用实例
Dec 18 Python
Python matplotlib 画图窗口显示到gui或者控制台的实例
May 24 Python
python使用多进程的实例详解
Sep 19 Python
python利用tkinter实现屏保
Jul 30 Python
Django shell调试models输出的SQL语句方法
Aug 29 Python
Python中的相关分析correlation analysis的实现
Aug 29 Python
Python numpy数组转置与轴变换
Nov 15 Python
Python定时器线程池原理详解
Feb 26 Python
利用python批量爬取百度任意类别的图片的实现方法
Oct 07 Python
python实现的web监控系统
Apr 27 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 去除html标记--strip_tags与htmlspecialchars的区别详解
2013/06/26 PHP
Thinkphp 框架基础之源码获取、环境要求与目录结构分析
2020/04/27 PHP
Js-$.extend扩展方法使方法参数更灵活
2013/01/15 Javascript
jquery中获取id值方法小结
2013/09/22 Javascript
jquery checkbox实现单选小例
2013/11/27 Javascript
javascript中的取反再取反~~没有意义
2014/04/06 Javascript
js Dialog 去掉右上角的X关闭功能
2014/04/23 Javascript
JQuery调用WebServices的方法和4个实例
2014/05/06 Javascript
JS 新增Cookie 取cookie值 删除cookie 举例详解
2014/10/10 Javascript
javascript实现图片循环渐显播放的方法
2015/02/24 Javascript
JavaScript移除数组内重复元素的方法
2015/03/18 Javascript
深入探讨前端框架react
2015/12/09 Javascript
JavaScript获取tr td 的三种方式全面总结(推荐)
2017/08/15 Javascript
判断jQuery是否加载完成,没完成继续判断的解决方法
2017/12/06 jQuery
微信小程序API—获取定位的详解
2019/04/30 Javascript
浅谈Node 异步IO和事件循环
2019/05/05 Javascript
深入解析koa之中间件流程控制
2019/06/17 Javascript
JavaScript实现拖动对话框效果的实现代码
2020/10/12 Javascript
[03:47]2015国际邀请赛第三日现场精彩回顾
2015/08/08 DOTA
[01:06:25]Secret vs Liquid 2018国际邀请赛淘汰赛BO3 第一场 8.25
2018/08/29 DOTA
java直接调用python脚本的例子
2014/02/16 Python
Python ORM框架SQLAlchemy学习笔记之映射类使用实例和Session会话介绍
2014/06/10 Python
python实现得到一个给定类的虚函数
2014/09/28 Python
python爬虫headers设置后无效的解决方法
2017/10/21 Python
Python爬虫实现爬取京东手机页面的图片(实例代码)
2017/11/30 Python
python os.path.isfile 的使用误区详解
2019/11/29 Python
Python字典底层实现原理详解
2019/12/18 Python
Python使用type动态创建类操作示例
2020/02/29 Python
次世代生活态度:Hypebeast
2018/07/05 全球购物
Linux内核的同步机制是什么?主要有哪几种内核锁
2013/01/03 面试题
幼儿园义卖活动方案
2014/01/17 职场文书
农村优秀教师事迹材料
2014/08/27 职场文书
党员干部观看《周恩来四个昼夜》思想汇报
2014/09/10 职场文书
校友会致辞
2015/07/30 职场文书
解决Go gorm踩过的坑
2021/04/30 Golang
把77A收信机改造成收音机
2022/04/05 无线电