Python学习笔记
课程笔记参考B站视频: Python全栈开发教程。
第十一站 全民来找茬
1. Bug的由来及分类
- 粗心导致的语法错误 SyntaxError,比如:
input()
函数返回的时str类型,后续使用计算时要转换类型。if-else
块、for
、def
等块语句的声明最后要加冒号。while
循环遵循循环四步法,一定要记得修改循环变量。- 经常被误用的中文符号:括号、冒号、引号。
- 比较运算符 判等号 一定是两个等号。
- 缩进错误,一定注意非注释语句连一个空格都不能多。
- 字符串拼接(加号)的时候,把字符串和数字等不同的类型拼接在一起。
- 知识不熟练导致的错误(多敲代码就能避免):
- 索引越界问题会导致IndexError。
- 方法使用不熟练,不要用等号,要用点。
- 思路不清导致的问题解决方案:
- 使用print()函数。
- 使用"#"暂时注释部分代码。
下面是代码示例:
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'])
- 运行结果
请输入你要查询的演员:张国荣
张国荣出演了:霸王别姬
- 被动掉坑:程序代码逻辑没有错,只是因为用户错误操作或者一些“例外情况”而导致的程序崩溃。Python提供了异常处理机制,可以在异常出现时即时捕获,然后内部“消化”,让程序继续运行,标准格式如下:
try:
可能会出现异常的代码段
except 可能的异常类型:
报错后的执行代码
except ...:
...
except BaseException as e:
print(e)
else:
没有错误就执行这个代码块
finally:
print('无论是否有异常,一定会被执行')
print('这一句表明程序会继续执行')
若有多个错误类型(即定义多个except
),捕获异常的顺序按照先子类后父亲类的顺序。为了避免遗漏可能出现的异常,可以在最后增加BaseException
,表示若出现未定义的错误类型,就可以直接打印。假如try
块中最终没有抛出异常,则会执行else
块。finally
块无论是否发生异常都会被执行,能常用来释放try
块中申请的资源。上面几个块的执行结构为:
当然上面几个块都可以单独拿出来使用,可执行的模式有:
- try–except
- try–excep–except
- try–except–else
- 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. 不同异常类型的处理方式
序号 | 异常类型 | 描述 |
---|---|---|
1 | zeroDivisionError | 除(或取模)零(所有数据类型) |
2 | IndexError | 序列中没有此索引(index) |
3 | KeyError | 映射中没有这个键 |
4 | NameError | 未声明/初始化对象(没有属性) |
5 | SyntaxError | Python 语法错误 |
6 | ValueError | 传入无效的参数 |
下面是代码示例:
'''演示各个异常是怎么产生的'''
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中使用调试的两个概念。
断点:程序运行到此处,暂时挂起,停止执行。此时可以详细观察程序的运行情况,方便做出进一步的判断。
进入调试视图有以下三种方式:
- 单击工具栏上的小虫子(调试,debugger)按钮。
- 右键单击编辑区,点击 debug ‘模块名’。
- 小虫子按钮的快捷键: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 不可以构成三角形