马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
本帖最后由 heidern0612 于 2018-12-17 10:08 编辑
写心得的过程都是自我思考的过程,里面借鉴了大量论坛前辈和版主的见解,如有错误恳请广大鱼油指出,感激不尽。
1、Try、except、else语句:
在执行的程序中,难免会碰到因为一些原因如输入输出导致致命性错误产生的情况(如因为输入的文件名错误而导致无法运行相关的代码。)。
此时你不希望程序直接挂掉,而是通过显示一些信息,使其平稳的结束。
就可以使用try,except和else这三个关键字来组成一个包容性很好的程序。
分别解释三个关键字:
try:执行可能会出错的试探性语句,即这里面的语句是可以导致致命性错误使得程序无法继续执行下去;
except:如果try里面的语句无法正确执行,那么就执行except里面的语句,这里面可以是错误信息或者其他的可执行语句;
else:如果try里面的语句可以正常执行,那么就执行else里面的语句(相当于程序没有碰到致命性错误)。
2、常见的异常种类:
SyntaxError:语法逻辑错误,无法执行;
NameError:使用了未赋值的变量;
TypeError:传入的对象类型与要求不符;(例如字符串和数字相加)
AttributeError:试图访问一个对象没有属性;
IOError:输入输出异常,通常是打开一个不存在的文件时引起;
IndexError:在使用中不存在的所引进并发;(例如索引值超过范围)
IndentationError:语法错误,代码没有对对齐;
KeyboardInterrupt:Ctrl+C被按下,程序被强制终止;
AssertionError:assert语句失败;
3、try:
for i in range(3):
for j in range(3):
if i == 2:
raise KeyboardInterrupt
print(i, j)
except KeyboardInterrupt:
print('退出啦!')
代码是弄明白了,但是raise的用法其实并没有我想象中的那么灵光。
度娘查了下,可以搭配if…else语句使用,自己抛出个异常,用法好像比较类似except。
这个坑暂且留下。
4、try except语句改进小游戏。
import random
secret = random.randint(1,10)
print('------------------我爱鱼C工作室------------------')
temp = input("不妨猜一下小甲鱼现在心里想的是哪个数字:")
try:
guess = int(temp)
except ValueError:
print('输入错误!')
guess = secret
while guess != secret:
temp = input("哎呀,猜错了,请重新输入吧:")
guess = int(temp)
if guess == secret:
print("我草,你是小甲鱼心里的蛔虫吗?!")
print("哼,猜中了也没有奖励!")
else:
if guess > secret:
print("哥,大了大了~~~")
else:
print("嘿,小了,小了~~~")
print("游戏结束,不玩啦^_^")
游戏倒没什么说的,就是里面的语句有点绕。
except 语句下面跟了个guess = secret,这个语句作用是什么呢?想了半天,想明白了:
1、用作跳出下面while循环的否定,(这一层应该都能想到)。
2、把guess 重新赋值。对,你没看错,把guess赋值,为啥要把guess重新赋值呢?
听我道来:
一开始我尝试注释掉guess = secret这句,结果爆出个名字错误语句,告诉我guess未赋值。
我就比较好奇,上面分明对guess赋值了啊,把guess = int(temp)了,temp是用户输入的数值。
后来想了半天才开窍,原来except语句里,用户输入的并不是数值类型,而是其他类型的数值。
导致temp无法被int化,自然guess = int(temp)这句就无效了。所以guess在except语句里一直未被赋值。
所以有了下面的guess = secret,一方面用作不执行while循环,一方面重新给guess赋值。
说起来麻烦,其实思考下也蛮简单的,主要还是之前学的不扎实,这里卡壳了下。
但是小甲鱼老师的这个错误处理并不完善,只能检测一次,假如第一次我输入对了,进入了while循环,第二次瞎输入,就还是会跳异常了。
5、理解起来应该不难,但是最后一个local()的用法有点意外:
查了下IDLE,里面如下解释:
Update and return a dictionary representing the current local symbol table.
Free variables are returned by locals() when it is called in function blocks, but not in class blocks.
鸟文什么意思呢?大致意思通过locals指令的下达,程序更新并返回一个表示当前局部标识符表的字典。
自由变量在函数内部被调用时,会被locals()函数返回;自由变量在类累不被调用时,不会被locals()函数返回。
说来说去其实就一句话:
locasl()会把当前代码中所有未被回收的自定义变量都自动收集其中,如果变量没有被回收,都会放在这个字典里。
locals() 函数会以字典类型返回当前位置的全部局部变量,对于函数, 方法, lambda 函式, 类, 它都返回 True。
如果还是不甚理解的同学可以看看这个帖子版主的解释:戳我前进
通俗点说就是:
在idle里输入locals(), 可以看到所有变量的名字和值,如果有这个变量,就说明赋值(这里是打开文件)的过程中没有出错。
如果还是不理解,我再举个更接地气的解释:
locals指令相当于我把当前所有能用的上的变量都扔进一个大箱子里(我就跟大箱子干上了……举的例子都是大箱子)。
这个大箱子里的东西都是乱七八糟的变量,有能用上的都留下来了,用不上的(出错的)都被Python小机器人给回收了。
|