03-python 之 eval()函数

描述

eval() 函数用来执行一个字符串表达式,并返回表达式的值。

语法

以下是 eval() 方法的语法:

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

举例:

x = 7
eval( ‘3 * x’ )
21
eval(‘pow(2,2)’)
4

eval(‘2 + 2’)
4

n=81
eval(“n + 4”)
85

eval 执行过程: 它会将第一个expression字符串参数的引号去掉,然后对引号中的式子进行解析和计算。

举例一:

a=10;
b={'a':4}
print(eval("a+1",b))

执行结果为:5

    这里面可能有点绕啊,初学者得理理清楚。在这次的代码中,
    我们在 eval中提供了globals参数,
    这时候eval的作用域就是b指定的这个字典了,
    也就是外面的a=10被屏蔽掉了,
    eval是看不见的,所以使用了a为4的值。

举例二:

a=10
b=20
c=30
g={'a':6,'b':8}
t={'b':100,'c':10}
print(eval('a+b+c',g,t))

执行的结果为:116

   这里面就更有点绕人了,此次执行的结果中,a是6,b是100,c是10。
   我们首先来看一下,对于a为6我们是没有疑问的,因为在上个例子中已经说了,g会屏蔽程序中的全局变量的,而这里最主要的是为什么b是100呢?
   还记得我们在参数介绍的时候说过,当locals和globals起冲突时,locals是起决定作用的,这在很多编程语言里都是一样的,是作用域的覆盖问题,
   当前指定的小的作用域会覆盖以前大的作用域,
   这可以理解为一张小的纸盖在了一张大的纸上,
   纸是透明的,上面写的东西是不透明的,
   而它们重合的地方就可以理解成两个作用域冲突的地方,
   自然是小的显现出来了。

举例三:

s="abck"
print(eval(s))

执行的结果为:NameError: name ‘abck’ is not defined

对于当面的代码,我们可以看到,字符串s并不满足表达式的要求。当eval剥去了"abck"的外面的引号的时候,它会对它进行解析,然后满足要求后进行计算,然后它解析到的是abcd,请注意,程序报出的错误是NameError,也就是说,当它解析到这个表达式是不可以计算后,它就会查找它是不是一个变量的名字,如果是一个变量的名字,那么它会输出这个变量的内容,否则就会产生这种报错。

s="abck"
print(eval('s')) 

执行的结果为:abck

c=12
b={'a':4, 'b':5}
print(a)
print(eval("a+1+b+c", b))

NameError: name ‘c’ is not defined
只会在b 里面找c , 找不到就报错了!!!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值