一、神器1 —— 内置函数eval

eval是python中的内置函数,它的作用是将字符串变为所对应的表达式,也相当于一个功能代码加双引号变为字符串,而eval又将字符串转为相应的功能,它在使用过程中有绝对的优势,但是也存在使用风险,所以要在程序中正确使用,本人建议不要使用

eval的语法格式如下:

eval(expression[, globals[, locals]])
expression : 字符串
globals : 变量作用域,全局命名空间,如果被提供,则必须是一个字典对象。
locals : 变量作用域,局部命名空间,如果被提供,可以是任何映射对象。

结合globals和locals看看几个例子

传递globals参数值为{“age”:1822},
b = eval("{'name':'linux','age':age}",{"age":1822})
print(b) 结果:{‘name’: ‘linux’, ‘age’: 1822}
再加上locals变量
age=18
b = eval("{'name':'linux','age':age}",{"age":1822},locals())
print(b) 结果:{'name': 'linux', 'age': 18}

通过上述示例可以看出:

当只使用全局变量globals,不使用局部变量locals时,查找全局是否存在变量,如果存在则用全局的变量
如果同时使用全局和局部,优先查找局部locals中的变量,其次在找全局globals中的变量,局部参数中同名变量会覆盖全局中的变量的值,遵循取值顺序(局部—>全局—>内置)

1.eval强大之处

更改变量的值

x = 10

def func():
y = 20
a = eval('x+y')
print("a", a)
b = eval('x+y', {'x': 1, 'y': 2})
print("b", b)
c = eval('x+y', {'x': 1, 'y': 2}, {'y': 3, 'z': 4})
print("c", c) func() 结果:a 30
b 3
c 4

eval函数实现list、dict、tuple与str之间的转化

字符串转换成列表b = eval("[[1,2], [3,4], [5,6], [7,8], [9,0]]")
a = "[[1,2], [3,4], [5,6], [7,8], [9,0]]"
print(type(a))
b = eval(a)
print(type(b))
print(b) 结果:<class 'str'>
<class 'list'>
[[1, 2], [3, 4], [5, 6], [7, 8], [9, 0]]
字符串转换成字典b = eval("{1: 'a', 2: 'b'}")
a = "{1: 'a', 2: 'b'}"
print(type(a))
b = eval(a)
print(type(b))
print(b) 结果:<class 'str'>
<class 'dict'>
{1: 'a', 2: 'b'}
字符串转换成元组b = eval("([1,2], [3,4], [5,6], [7,8], (9,0))")
a = "([1,2], [3,4], [5,6], [7,8], (9,0))"
print(type(a))
b = eval(a)
print(type(b))
print(b) 结果:<class 'str'>
<class 'tuple'>
([1, 2], [3, 4], [5, 6], [7, 8], (9, 0))

从上边的例子中可以看出,给eval给个字符串,eval给一个表达式返回值,这就是它的好处

2.eval危险之处

eval虽然方便,但是要注意安全性,可以将字符串转成表达式并执行,就可以利用执行系统命令,删除文件等操作。
当使用者不清楚它的危险之处,输入如下:
eval("__import__('os').system('ls /Users/chunming.liu/Downloads/')")
它其实执行的是如下操作
os.system('ls /Users/chunming.liu/Downloads/')
那么继续输入:
eval("__import__('os').system('cat /Users/chunming.liu/Downloads/tls_asimov_cert.pem')")
再来一条删除命令,文件就会消失。比如
eval("__import__('os').system('rm /Users/chunming.liu/Downloads/车辆转发测试.png')")
所以使用eval,一方面享受他的了灵活性同时,也要注意安全性。

二、神器2 ——内置函数exec()

python3中删去了 execfile()方法,使用exec(),它能够执行复杂的代码:

with open('test1.py','r') as f:
exec(f.read())

exec格式语法如下:

exec(object[, globals[, locals]]]
object:必选参数,表示需要被指定的python代码,它必须是字符串或code对象。如果object是一个字符串,该字符串会被先解析为一组python语句,然后再执行。如果object是一个code对象,那么它只是被简单的执行
globals:可选参数,同eval函数
locals:可选参数,同eval函数
返回值:
exec函数的返回值永远为None
globals = {'x': 7, 'y': 10, 'lis': ['aa', 'bb', 'cc']}
locals = {} a = eval("3*x+4*y", globals, locals)
print(a) exec("for i in lis: print(i)", globals, locals) 结果:61
aa
bb
cc

上述示例中exec()中相当于执行了

globals = {'x': 7, 'y': 10, 'lis': ['aa', 'bb', 'cc']}

for i in lis:
print(i)

到这里我在跟大家说一下eval()函数与exec()函数的区别:

eval()函数只能计算单个表达式的值,而exec()函数可以动态运行代码段

eval()函数可以有返回值,而exec()函数返回值永远为None

Python中两大神器&exec() &eval()的更多相关文章

  1. [转载]为何 Emacs 和 Vim 被称为两大神器

    Emacs 是神的编辑器,而 Vim 是编辑器之神.二者为何会有如此美誉,且听本文向你一一道来. 目 录 0. 序章:神器的传说 1. 无敌的可扩展性 1.1 可扩展性给了软件强大的生命 1.2 Em ...

  2. python中的那些“神器”

    "武林至尊,宝刀屠龙,号令天下,莫敢不从,倚天不出,谁与争锋",这是神器.不过今天要说的python中的"神器"就没有这么厉害了,这里要说的"神器&q ...

  3. 只需一行代码!Python中9大时间序列预测模型

    在时间序列问题上,机器学习被广泛应用于分类和预测问题.当有预测模型来预测未知变量时,在时间充当独立变量和目标因变量的情况下,时间序列预测就出现了. 预测值可以是潜在雇员的工资或银行账户持有人的信用评分 ...

  4. python中两种栈实现方式的性能对比

    在计算机的世界中,同一个问题,使用不同的数据结构和算法实现,所使用的资源有很大差别 为了方便量化python中算法的资源消耗,对性能做测试非常有必要,这里针对stack做了python语言 下的性能分 ...

  5. Python中的可视化神器:pyecharts

    pyecharts是一款将python与echarts结合的强大的数据可视化工具,本文将为你阐述pyecharts的使用细则 前言 我们都知道python上的一款可视化工具matplotlib,而前些 ...

  6. Python中的可视化神器!你知道是啥吗?没错就是pyecharts!

    pyecharts是一款将python与echarts结合的强大的数据可视化工具,本文将为你阐述pyecharts的使用细则 前言 我们都知道python上的一款可视化工具matplotlib,而前些 ...

  7. Python中两种处理错误方法的比较

    我所说的处理错误的方法,其实是try:,except和raise这两种. 首先抛出一个实例, dictt={'a':1,'b':2,'c':3} try: if dictt['d']>1: #字 ...

  8. python中两种方法实现二分法查找,细致分析二分法查找算法

    之前分析了好多排序算法,可难理解了呢!!(泣不成声)这次我要把二分查找总结一下,这个算法不算难度特别大,欢迎大家参考借鉴我不喜欢太官方的定义,太晦涩的语言,让人看了就头晕.我希望加入我自己的理解,能帮 ...

  9. python预编译函数compile,exec,eval

    funcname = "func" func = "def %s():\n" % funcname funccontent = 'print "hel ...

随机推荐

  1. Django框架(二十八)—— Django缓存机制

    目录 Django缓存机制 一.什么是缓存 二.Django的6中缓存方式及配置(只需要改配置文件) 1.开发调试缓存(此模式为开发调试使用,实际上不执行任何操作) 2.内存缓存(将缓存内容保存至内存 ...

  2. poi 处理空单元格

    http://poi.apache.org/spreadsheet/quick-guide.html 用google翻译 找到

  3. 使用正则限制input框只能输入数字/英文/中文等等

    常用HTML正则表达式 1.只能输入数字和英文的: 复制代码代码如下: <input onkeyup="value=value.replace(/[/W]/g,'') " o ...

  4. 数据批量导入HBase

    测试数据: datas 1001 lilei 17 13800001111 1002 lily 16 13800001112 1003 lucy 16 13800001113 1004 meimei ...

  5. nutch1.9 + solr4.72

    solr.server.url : URL of the SOLR instance (mandatory) solr.commit.size : buffer size when sending t ...

  6. [POI2010]OWC-Sheep

    题目 不难猜到或者发现的性质,如果连了一条对角线划分出了奇数个点,那么这条对角线肯定不合法:因为划分成三角形就不可能有对角线相交,于是划分成奇数的那一边怎么样也不可能划分成全是偶数 于是我们需要对每一 ...

  7. 在MVC4.5.1中使用Ninject

    看完Pro ASP.NET MVC5的前14章之后,终于开始了自己的项目搭建. 打算在实际项目中使用Ninject 但是总是出现各种问题.这里记录一下 在书中使用的Ninject的版本是: Insta ...

  8. 【教程】虚拟机安装CentOS 7 ping不通百度/并且使用Xshell 连接

    最近需要在电脑虚拟机上安装CentOS 7 ,之前对虚拟机并不熟悉,捅咕了两天时间,如果终于安装成功. 之前遇到的坑:安装完CentOS 7 之后一直ping 不通www.baidu.com 网上查询 ...

  9. [网络流24题] 洛谷P2761 软件补丁问题

    题意:某公司发现其研制的一个软件中有 n个错误,随即为该软件发放了一批共 m 个补丁程序.对于每一个补丁 i ,都有 2 个与之相应的错误集合 B1(i)和 B2(i),使得仅当软件包含 B1(i)中 ...

  10. Android 使用android-support-multidex解决Dex超出方法数的限制问题,让你的应用不再爆棚(转)

    如有转载,请声明出处: 时之沙: http://blog.csdn.net/t12x3456    (来自时之沙的csdn博客) 随着应用不断迭代,业务线的扩展,应用越来越大(比如集成了各种第三方sd ...