今天老师布置了一个作业,很简单的几行代码。但是也算让我彻底知道了Python中的eval这个函数了,因为之前学过一点Python,以为自己已经知道了eval函数的用法(还以为这是用来自动识别输入类型,可以用来输入字典)
结果啪啪打脸了。呜呜呜。。。
首先明确一下eval的用法:
value=eval(<字符串>)
读取字符串参数的内容
1.如果该字符串的内容为包含运算符的python表达式,则计算该表达式并返回结果。
2.若该字符串参数的内容为变量,则返回该变量的值。
3.若该字符串的内容为常量,则返回该常量。
题目如下:
在Python窗口界面的shell window执行下列代码,观察输出结果,掌握**eval()**函数的使用方法。(没办法老师要求用shell)
>>> s = ‘3**3**2’ >>> s1 = ‘s’ >>> s1 >>> print(s1) >>> print(eval(s1)) >>> print(eval(eval(s1)))
PS:这是老师在word里面打出来的,所以就是这个样子啦.
(<<<也是老师自己打出来的)
我一开始看见了eval(eval()),确实人都有点傻了,很是奇怪,反应了一会才反应过来。
首先我们所以知道的eval函数的返回值是返回表达式的计算结果
那么现在我们先明白这些变量的值
s=‘3 ** 3 ** 2’,再将‘s’的值赋给s1,那么我认为此时就可以相当于字符串中的字符串
那么s1就可以相当于‘ ‘3 ** 3 ** 2’ ’(为了和双引号分开,我在两个单引号中加了个空格),此时的s1就有两层,在我的理解看来,此时使用eval函数就像剥开洋葱一样,返回其中所蕴含的值。
>>> s='3**3**2' >>> s1='s' >>> s1 's' >>> s '3**3**2' >>> print(s1) s
s1是代表s这个字符串,Python中的字符串是有单引号‘’或是双引号“”的,而输出则就是将其字符串输出出来,不需要带引号。
>>> print(eval(s1)) 3**3**2 >>> print(s) 3**3**2
我们从这里可以看到s和eval(s1)的效果是一样的,而s就仅仅比s1多了一个引号。
所以我们可以知道的就是eval(s1)的返回值就是返回s当中的值,注意此时都是字符串的形式。我们可以验证一下。
>>> isinstance(s,str) True >>> isinstance(s1,str) True
那么问题来了,eval(eval())呢?
现在问题就变得很简单了。eval(s1)就是‘3 ** 3 ** 2’,再对其进行eval就是返回这个表达式的结果了。PS:这个幂运算的结合性是从右往左的呦~
>>> print(eval(eval(s1))) 19683 >>> print(eval(s)) 19683
那么就是3的9次方啦
总代码如下:
>>> s='3**3**2' >>> s1='s' >>> s1 's' >>> print(s1) s >>> print(eval(s1)) 3**3**2 >>> print(s) 3**3**2 >>> print(eval(eval(s1))) 19683 >>> print(eval(s)) 19683
但是这里能如果你想有一次性输出的话呢,可以在每一句的后面加一个;\即可,如下图所示:
>>> s='3**3**2';\ s1='s';\ print(s1);\ print(eval(s1));\ print(eval(eval(s1))) s 3**3**2 19683