有歧义?
有歧义?
今天在学习Python的时候,遇到一道练习题,花费了我很多的时间,如图所示。
?
?
其实他的要求,我能满足,但是在运行过程中的,我尝试用键盘输入了很多种格式,就发现了一个问题,当我输入“hello”“kk+1”这样的时候,电脑就会报错,说变量未定义,可是键盘输入的不都是字符型吗?如果我给这些再加一个双引号,就不会报错了,而是原样输出,但是数学计算这些又不会计算了,也是原样输出。
后面经过我很多次的修改,和搜索,其中还包括看了Python的官方文档。
一开始我发现这个题目似乎有点歧义,自己还是刚刚学,也不大敢说题目错了,当然,其实也不能说是题目错了,更可能是我理解错了,顶多说是有歧义吧,后面慢慢研究得深入,又发现似乎没什么问题,但是这对我对编程的理解有很大帮助,下面我讲讲我的学习过程。
首先,我要指出题目的歧义在哪,其实就是第一句话——“内置函数eval接收一个字符串并使用Python解释器对它进行求值”。这里面的“它”就很容易产生歧义,其实求值针对的应该是根据这个字符串所解析出来的表达式,而不是字符串,但是从语文里的联系上下文,很容易以为这个“它”就是指的“字符串”。
然后,我说说我的误会在哪里吧,其实一开始,我对这个函数也不熟悉,第一次见,也没有认真去研究他的定义,而是看一些例子,后面再用浏览器搜了一下这个函数,了解了它大概是怎么用的——好像就是能把平时不能计算的“字符串”计算出一个值。这个理解也不算错,就是不够全面深入。
接着,我来说说,我的测试以及分析吧。如图所示
???
?
前面4个都能运行正常,就是最后一个说是“hello”没有定义,这个错误我很熟悉啊,这是把“hello”当成变量了,可是我不是已经加了单引号了吗?加了应该就是字符串了啊,我也不知道eval函数内部是什么样子的。
但是,我猜测他是先把外面这个引号给去掉了,像第一个算式就是这样的,去掉之后,把那些数字当成int或者float型,然后按照操作符该怎么计算就怎么计算。
那这样说,我要想用键盘输入一串字母不出错,就要在外面再加一对引号?可是这样的话,原本的计算又不会计算了,因为去掉一对引号,还有引号,那就不能当成“表达式”来计算,而是继续当成“字符串”原样输出?
有点像是陷入两难境地了,其实也有一个取巧的办法解决,那就是在这之前,定义一下要输入的那一串字母,就可以不用多加引号了。或者前面多一个检测条件啥的。
但是,这要写成程序,还是前者好写,就是不知道的人,容易输错,然后报错。但是我还想继续深入研究一下这个函数,后来仔细看了官方文档,我发现重点是落在“解析表达式”上面了,虽然接收的是“字符串”,但在内部还是换算成了“表达式”来计算。
而表达式的定义就是“变量、操作符和值的组合,可以表示一个单独的结果值”。有了这句话,再加上之前笑来老师的《自学是门手艺》里讲到的,操作符和值,其实各种运算都可以看作是在用操作符操作值。
有了这些,我发现我的问题根源在哪里了,为什么会这样报错啊。
原来是把输入的字符串解析为表达式之后,他要按照这个表达式的操作符对相应的值进行相应的操作啊。那单纯的几个字母,不就是会被计算机误以为是“变量”吗?而前面又没有对其赋值,自然就成了未定义了,同时还会有其他的报错,比如我还尝试了“int”不能和“type”进行“+”运算这样的错误,其实和表达式都是一样的,当然,让我收获比较大的一点是,按照这样推理,那type(a)其实也是一个表达式,最终也是各种值在进行操作而得出的结果值。
有了这些,我对《自学是门手艺》里的那句——接下来要学习的无非是各种数据类型的运算而已。就有了更深的理解,当有了这样的基础之后,再去看这个函数,其实也没有多么难,本质上还是对各种不同数据类型的操作。而在这个操作的过程中,又会涉及很多的规则,比如变量需要先定义,一般只有同类型的值才能运算等等。
最后,再回到这个题目上,“对字符串求值?”,虽然说字符串也是一种数据类型,但是总感觉怪怪的,之所以怪,是因为我们平时觉得的求值,一般是指数学上的运算。但是如果放在广义上的“运算”,那其实也可以这样说,应该是“对字符串进行操作”或者说“对字符串进行运算”(把字符串解析为表达式,也可以看作是一种对数据类型的操作……这样想就好多了)。因此,还是自己理解得有一些问题吧,正好借这个错误纠正了一下,还加深了理解与记忆,哈哈哈,这还告诉了我们一个道理——不要轻易放过一个错误,或许那就是我们成长的机会。
如发现本站有涉嫌抄袭侵权/违法违规等内容,请<举报!一经查实,本站将立刻删除。