分享

初学Python之eval函数的嵌套eval中的eval

 小生凡一 2021-11-30

今天老师布置了一个作业,很简单的几行代码。但是也算让我彻底知道了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

就是这样啦嘻嘻收工!
最后说一下,本人只是大一新生,初学编程,也是刚接触Python不久,这篇文章也只是我自己看书做题上网查了之后,自己思考的结果。如果我有什么地方不正确的话,恳请各位大佬斧正!谢谢!

    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多