鱼C论坛

 找回密码
 立即注册
查看: 3764|回复: 2

[学习笔记] 【Pyhon 033讲心得体会】【 Try和Except】

[复制链接]
发表于 2018-11-29 15:00:58 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

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、
  1. try:
  2.     for i in range(3):
  3.         for j in range(3):
  4.             if i == 2:
  5.                 raise KeyboardInterrupt
  6.             print(i, j)
  7. except KeyboardInterrupt:
  8.     print('退出啦!')
复制代码


代码是弄明白了,但是raise的用法其实并没有我想象中的那么灵光。

度娘查了下,可以搭配if…else语句使用,自己抛出个异常,用法好像比较类似except。

这个坑暂且留下。



4、try except语句改进小游戏。

  1. import random

  2. secret = random.randint(1,10)
  3. print('------------------我爱鱼C工作室------------------')
  4. temp = input("不妨猜一下小甲鱼现在心里想的是哪个数字:")
  5. try:   
  6.     guess = int(temp)
  7. except ValueError:
  8.     print('输入错误!')
  9.     guess = secret
  10. while guess != secret:
  11.     temp = input("哎呀,猜错了,请重新输入吧:")
  12.     guess = int(temp)
  13.     if guess == secret:
  14.         print("我草,你是小甲鱼心里的蛔虫吗?!")
  15.         print("哼,猜中了也没有奖励!")
  16.     else:
  17.         if guess > secret:
  18.             print("哥,大了大了~~~")
  19.         else:
  20.             print("嘿,小了,小了~~~")
  21. 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小机器人给回收了。






本帖被以下淘专辑推荐:

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2019-5-1 17:36:34 | 显示全部楼层
  1. import random

  2. secret = random.randint(1,10)
  3. print('------------------我爱鱼C工作室------------------')
  4. while 1:
  5.     try:
  6.         temp = input("不妨猜一下小甲鱼现在心里想的是哪个数字:")
  7.         guess = int(temp)
  8.         while guess != secret:
  9.             while 1:
  10.                 try:
  11.                     temp = input("哎呀,猜错了,请重新输入吧:")
  12.                     guess = int(temp)
  13.                     if guess == secret:
  14.                         print("我草,你是小甲鱼心里的蛔虫吗?!")
  15.                         print("哼,猜中了也没有奖励!")
  16.                         break
  17.                     else:
  18.                         if guess > secret:
  19.                             print("哥,大了大了~~~")
  20.                         else:
  21.                             print("嘿,小了,小了~~~")
  22.                 except ValueError as e:
  23.                     print('输入的数字有误,请重新输入' + str(e))
  24.         print("游戏结束,不玩啦^_^")
  25.         break
  26.     except ValueError as e:
  27.         print('输入的数字有误,请重新输入'+str(e))
复制代码

这个答案我刚做了,你测试下,应该比较完善了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-8-15 15:37:45 | 显示全部楼层
good,最后一题分享的挺棒
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-6-4 15:19

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表