Python学习笔记:第十一站 全民来找茬

Python学习笔记


课程笔记参考B站视频: Python全栈开发教程


第十一站 全民来找茬

1. Bug的由来及分类

  1. 粗心导致的语法错误 SyntaxError,比如:
  • input()函数返回的时str类型,后续使用计算时要转换类型
  • if-else块、fordef等块语句的声明最后要加冒号
  • while循环遵循循环四步法,一定要记得修改循环变量。
  • 经常被误用的中文符号:括号、冒号、引号。
  • 比较运算符 判等号 一定是两个等号。
  • 缩进错误,一定注意非注释语句连一个空格都不能多。
  • 字符串拼接(加号)的时候,把字符串和数字等不同的类型拼接在一起。
  1. 知识不熟练导致的错误(多敲代码就能避免):
  • 索引越界问题会导致IndexError。
  • 方法使用不熟练,不要用等号,要用点。
  1. 思路不清导致的问题解决方案:
  1. 使用print()函数。
  2. 使用"#"暂时注释部分代码。

下面是代码示例:

lst=[{'rating':[9.7,2062397], 'id':'1292052', 'type':['犯罪','剧情'], 'title':'肖申克的救赎', 'actors':['蒂姆.罗宾斯’,’摩根.弗里曼']},
    {'rating':[9.6,1528760], 'id':'1291546', 'type':['剧情','爱情','同性'], 'title':'霸王别姬', 'actors':['张国荣','张丰毅','巩俐','葛优']},
    {'rating':[9.5,1559181], 'id':'1292720', 'type':['剧情','爱情'], 'title':'阿甘正传', 'actors':['汤姆.汉克斯','罗宾.怀特']}]
name = input('请输入你要查询的演员:')
for item in lst:
   actors = item['actors']
   if name in actors:
       print(name + '出演了:' + item['title'])
  • 运行结果
请输入你要查询的演员:张国荣
张国荣出演了:霸王别姬
  1. 被动掉坑:程序代码逻辑没有错,只是因为用户错误操作或者一些“例外情况”而导致的程序崩溃。Python提供了异常处理机制,可以在异常出现时即时捕获,然后内部“消化”,让程序继续运行,标准格式如下:
try:
   可能会出现异常的代码段
except 可能的异常类型:
   报错后的执行代码
except ...:
   ...
except BaseException as e:
   print(e)
else:
   没有错误就执行这个代码块
finally:
   print('无论是否有异常,一定会被执行')
print('这一句表明程序会继续执行')

若有多个错误类型(即定义多个except),捕获异常的顺序按照先子类后父亲类的顺序。为了避免遗漏可能出现的异常,可以在最后增加BaseException,表示若出现未定义的错误类型,就可以直接打印。假如try块中最终没有抛出异常,则会执行else块。finally块无论是否发生异常都会被执行,能常用来释放try块中申请的资源。上面几个块的执行结构为:

try
顺序查找所有except块
finally块
else块

当然上面几个块都可以单独拿出来使用,可执行的模式有:

  1. try–except
  2. try–excep–except
  3. try–except–else
  4. try–except-elsep–finally

下面以“ 除以0 ”这个错误来演示 try...except的使用:

try:
   a = int(input('请输入第一个数字:'))
   b = int(input('请输入第二个数字:'))
   result = a/b
except ValueError:
   print('报错:你输入的不是整数吧,编译器说这不是它认识的整数')
except ZeroDivisionError:
   print('报错:除数不能为0,你个老六')
except BaseException as e:
   print('报了个错,编译器给你的原话是:', e)
else:
   print('奈斯!你的输入没有让程序报错。')
   print('相除的结果为:', result)
finally:
   print('谢谢您的使用')
print('这一句表示程序会继续执行')
  • 运行结果
请输入第一个数字:10
请输入第二个数字:0
报错:除数不能为0,你个老六
谢谢您的使用
这一句表示程序会继续执行

2. 不同异常类型的处理方式

序号异常类型描述
1zeroDivisionError除(或取模)零(所有数据类型)
2IndexError序列中没有此索引(index)
3KeyError映射中没有这个键
4NameError未声明/初始化对象(没有属性)
5SyntaxErrorPython 语法错误
6ValueError传入无效的参数

下面是代码示例:

'''演示各个异常是怎么产生的'''
print('-----1.数学运算异常-------')
# print(10/0)              # ZeroDivisionError: division by zero
print('-----2.索引异常-------')
lst = range(6)
# print(lst[9])            # IndexError: range object index out of range
print('-----3.没有定义键-------')
dic = {'name':'张三', 'age':20}
# print(dic['gender'])     # KeyError: 'gender'
print('-----4.没有声明-------')
# print(num)               # NameError: name 'num' is not defined
print('-----5.语法错误-------')
# int a = 20               # SyntaxError: invalid syntax
print('-----6.传入无效-------')
# a = int('张三')           # ValueError: invalid literal for int() with base 10: '张三'
print('-----7.还有很多异常...-------')

3. 异常处理机制

Python使用traceback模块打印异常信息,比如直接执行语句print(10/0),运行结果如下:

Traceback (most recent call last):
 File "E:/python_learn/proiect1/chp11/demo4.py", line 3, in <module>
   print(10/0)
ZeroDivisionError: division by zero

下面展示一下手动导入traceback模块的代码:

import traceback
try:
   print('开始输出')
   print(10/0)
except:
   traceback.print_exc()
  • 运行结果有两种:
Traceback (most recent call last):
 File "E:/python_learn/proiect1/chp11/demo4.py", line 7, in <module>
   print(10/0)
ZeroDivisionError: division by zero
开始输出
开始输出
Traceback (most recent call last):
 File "E:/python_learn/proiect1/chp11/demo4.py", line 7, in <module>
   print(10/0)
ZeroDivisionError: division by zero

注意之所以会有这两种输出,是因为多线程问题,后面学习到的时候会再进行讨论。

之所以要手动导入这些模块,是因为后续可能会 将异常信息输出到日志文件 中,而控制台的信息不会默认写入文件中。

4. PyCharm的调试模式

本节介绍在Pycharm中使用调试的两个概念。

断点:程序运行到此处,暂时挂起,停止执行。此时可以详细观察程序的运行情况,方便做出进一步的判断。
进入调试视图有以下三种方式:

  1. 单击工具栏上的小虫子(调试,debugger)按钮。
  2. 右键单击编辑区,点击 debug ‘模块名’。
  3. 小虫子按钮的快捷键:shift+F9。

5. 本章作业

1. 编写程序输入学员成绩

说明:让用户输入0~100之间的成绩,其他字符均无效,并给出用户提示。

下面是代码示例:

try:
   a = int(input('请输入一个[0,100]之间的整数:'))
   if 0<=a<=100:
       print('分数为:', a)
   else:
       raise Exception('输入不在范围内') # 手动抛出异常
       # raise就是告诉编译器,我给你加了一个报错的情况,名字叫Exception
except Exception as e:
   print(e)
  • 运行结果
请输入一个[0,100]之间的整数:120
输入不在范围内

2. 判断三个参数能否构成三角形

新知识点:手动抛出异常对象 raise()

下面是代码示例:

def is_triangle(a,b,c):
   if a<0 or b<0 or c<0:
       raise Exception('三角边不能是负数')

   if a+b>c and a+c>b and b+c>a:
       print(f'{a}, {b}, {c} 可以构成三角形')
   else:
       print(f'{a}, {b}, {c} 不可以构成三角形')

if __name__ == '__main__':
   try:
       a = int(input('请输入第一个边:'))
       b = int(input('请输入第二个边:'))
       c = int(input('请输入第三个边:'))
       is_triangle(a,b,c)
   except Exception as e:
       print(e)
  • 运行结果
请输入第一个边:1
请输入第二个边:2
请输入第三个边:3
1, 2, 3 不可以构成三角形
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

虎慕

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值