初学Python之eval函数的嵌套eval中的eval
今天老师布置了一个作业,很简单的几行代码。但是也算让我彻底知道了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)))
- 1
- 2
- 3
- 4
- 5
- 6
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
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
s1是代表s这个字符串,Python中的字符串是有单引号‘’或是双引号“”的,而输出则就是将其字符串输出出来,不需要带引号。
>>> print(eval(s1))
3**3**2
>>> print(s)
3**3**2
- 1
- 2
- 3
- 4
我们从这里可以看到s和eval(s1)的效果是一样的,而s就仅仅比s1多了一个引号。
所以我们可以知道的就是eval(s1)的返回值就是返回s当中的值,注意此时都是字符串的形式。我们可以验证一下。
>>> isinstance(s,str)
True
>>> isinstance(s1,str)
True
- 1
- 2
- 3
- 4
那么问题来了,eval(eval())呢?
现在问题就变得很简单了。eval(s1)就是‘3 ** 3 ** 2’,再对其进行eval就是返回这个表达式的结果了。PS:这个幂运算的结合性是从右往左的呦~
>>> print(eval(eval(s1)))
19683
>>> print(eval(s))
19683
- 1
- 2
- 3
- 4
那么就是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
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
但是这里能如果你想有一次性输出的话呢,可以在每一句的后面加一个;\即可,如下图所示:
>>> s='3**3**2';\
s1='s';\
print(s1);\
print(eval(s1));\
print(eval(eval(s1)))
s
3**3**2
19683
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
就是这样啦嘻嘻收工!
最后说一下,本人只是大一新生,初学编程,也是刚接触Python不久,这篇文章也只是我自己看书做题上网查了之后,自己思考的结果。如果我有什么地方不正确的话,恳请各位大佬斧正!谢谢!
文章来源: blog.csdn.net,作者:小生凡一,版权归原作者所有,如需转载,请联系作者。
原文链接:blog.csdn.net/weixin_45304503/article/details/104432543
- 点赞
- 收藏
- 关注作者
评论(0)