详解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 Trie树实现字典排序
Mar 28 Python
编写Python脚本把sqlAlchemy对象转换成dict的教程
May 29 Python
TensorFlow搭建神经网络最佳实践
Mar 09 Python
pandas数值计算与排序方法
Apr 12 Python
浅谈python写入大量文件的问题
Nov 09 Python
在PyCharm中实现关闭一个死循环程序的方法
Nov 29 Python
对python当中不在本路径的py文件的引用详解
Dec 15 Python
Python实现简单查找最长子串功能示例
Feb 26 Python
pyqt5 实现多窗口跳转的方法
Jun 19 Python
python3反转字符串的3种方法(小结)
Nov 07 Python
python:HDF和CSV存储优劣对比分析
Jun 08 Python
解决python打开https出现certificate verify failed的问题
Sep 03 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
第七节 类的静态成员 [7]
2006/10/09 PHP
生成卡号php代码
2008/04/09 PHP
跟我学Laravel之安装Laravel
2014/10/15 PHP
php中使用gd库实现下载网页中所有图片
2015/05/12 PHP
给PHP开发者的编程指南 第一部分降低复杂程度
2016/01/18 PHP
LNMP部署laravel以及xhprof安装使用教程
2017/09/14 PHP
laravel中短信发送验证码的实现方法
2018/04/25 PHP
javascript Deferred和递归次数限制实例
2014/10/21 Javascript
Nodejs极简入门教程(三):进程
2014/10/27 NodeJs
jQuery实现的输入框选择时间插件用法实例
2015/02/28 Javascript
javascript格式化指定日期对象的方法
2015/04/21 Javascript
基于JQuery和CSS3实现仿Apple TV海报背景视觉差特效源码分享
2015/09/21 Javascript
详解 javascript中offsetleft属性的用法
2015/11/11 Javascript
全面解析Bootstrap表单使用方法(表单控件状态)
2015/11/24 Javascript
浅析Nodejs npm常用命令
2016/06/14 NodeJs
Javascript中的async awai的用法
2017/05/17 Javascript
Angular2 http jsonp的实例详解
2017/08/31 Javascript
webpack打包并将文件加载到指定的位置方法
2018/02/22 Javascript
[45:44]完美世界DOTA2联赛PWL S2 FTD vs PXG 第一场 11.27
2020/12/01 DOTA
python基础教程之获取本机ip数据包示例
2014/02/10 Python
在PyCharm环境中使用Jupyter Notebook的两种方法总结
2018/05/24 Python
Django打印出在数据库中执行的语句问题
2019/07/25 Python
pandas的to_datetime时间转换使用及学习心得
2019/08/11 Python
keras load model时出现Missing Layer错误的解决方式
2020/06/11 Python
让IE下支持Html5的placeholder属性的插件
2014/09/02 HTML / CSS
vue+django实现下载文件的示例
2021/03/24 Vue.js
成教毕业生自我鉴定
2013/10/23 职场文书
数控技术专业推荐信
2013/11/01 职场文书
公司同意接收函
2014/01/13 职场文书
大学生学年自我鉴定
2014/02/10 职场文书
国庆节演讲稿范文2014
2014/09/19 职场文书
食品安全责任书范本
2015/05/09 职场文书
余世维讲座观后感
2015/06/11 职场文书
解约证明模板
2015/06/19 职场文书
python flask开发的简单基金查询工具
2021/06/02 Python
sql查询语句之平均分、最高最低分及排序语句
2022/05/30 MySQL