Skip to content

Commit 4808792

Browse files
committed
modified readme, add chapter[29,30,31,32]
1 parent ea7e7b1 commit 4808792

38 files changed

Lines changed: 439 additions & 3 deletions

README.md

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
11
# python 学习笔记
2-
32
<!--
43
作者:华校专
54
email: huaxz1986@163.com
@@ -31,9 +30,9 @@
3130
>`cutemarked`原版需要联网下载所需要的脚本文件,但是由于国内的网络问题,以及存在断网情况下使用等特殊需求
3231
>,我将它改造成了一个无需联网的本地化版本
3332
34-
**本文档仅用于个人学习目的,未经许可不得用于商业目的,转载请注明出处 **
33+
**本文档仅用于个人学习目的,未经许可不得用于商业目的,转载请注明出处**
3534

36-
** email: huaxz1986@163.com **
35+
**email: huaxz1986@163.com**
3736

3837

3938

chapter/29_python_try_except.md

Lines changed: 142 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,142 @@
1+
<!--
2+
作者:华校专
3+
email: huaxz1986@163.com
4+
** 本文档可用于个人学习目的,不得用于商业目的 **
5+
-->
6+
# 异常
7+
1.Python中,异常会根据错误自动地被触发,也能由代码主动触发和截获
8+
9+
2.捕捉异常的代码:
10+
11+
```
12+
try:
13+
statements #该代码执行主要的工作,并有可能引起异常
14+
except ExceptionType1: #except子句定义异常处理,这里捕捉特定的ExceptionType1类型的异常
15+
statements
16+
except (ExceptionType2,ExceptionType3): #except子句定义异常处理,
17+
#这里捕捉任何列出的异常(即只要是ExceptionType2类型或者ExceptionType3类型)
18+
statements
19+
except ExceptionType4 as excp: #这里捕捉特定的ExceptionType4类型异常,但是用变量名excp引用异常对象
20+
statements #这里可以使用excp引用捕捉的异常对象
21+
except: # 该子句捕获所有异常
22+
statements
23+
else: #如果没有发生异常,这来到这里;当发生了异常则不执行else子句
24+
statements
25+
```
26+
27+
*`try`子句执行时发生异常,则Python会执行第一个匹配该异常的`except`子句。当`except`子句执行完毕之后(除非该`except`子句 又引发了另一个异常),程序会跳转到整体语句之后执行。
28+
>整体语句就是指上面的`try..except..else`
29+
* 如果异常发生在`try`代码块内,且无匹配的`except`子句,则异常向上传递到本`try`块外层的`try`块中。如果已经传递到了顶层了异常还没有被捕捉,则Python会终止程序并且打印默认的出错消息
30+
* 如果`try`代码块内语句未产生异常,则Python会执行`else`子句,然后程序会在整体语句之后继续执行
31+
32+
![try..except..else语句](../imgs/python_29_1.JPG)
33+
34+
3.`try/finally`语句:
35+
36+
```
37+
try:
38+
statements
39+
finally:
40+
statements
41+
```
42+
无论`try`代码块执行时是否发生了异常,`finally`子句一定会被执行
43+
44+
*`try`子句无异常,则Python会接着执行`finally`子句,执行完之后程序会跳转到整体语句之后执行
45+
*`try`子句有异常,则Python会跳转到`finally`子句中,并接着把异常向上传递
46+
47+
![try..finally语句](../imgs/python_29_2.JPG)
48+
49+
4.Python中的`try|except|finally`统一格式:
50+
51+
```
52+
try:
53+
statements #该代码执行主要的工作,并有可能引起异常
54+
except ExceptionType1: #except子句定义异常处理,这里捕捉特定的ExceptionType1类型的异常
55+
statements
56+
except (ExceptionType2,ExceptionType3): #except子句定义异常处理,
57+
#这里捕捉任何列出的异常(即只要是ExceptionType2类型或者ExceptionType3类型)
58+
statements
59+
except ExceptionType4 as excp: #这里捕捉特定的ExceptionType4类型异常,但是用变量名excp引用异常对象
60+
statements #这里可以使用excp引用捕捉的异常对象
61+
except: # 该子句捕获所有异常
62+
statements
63+
else: # 如果没有发生异常,这来到这里;当发生了异常则不执行else子句
64+
statements
65+
finally: # 一定会执行这个子句
66+
statements
67+
```
68+
* `else``finally`子句可选;`except`子句可能有0个或者多个。但是如果有`else`子句,则至少有一个`except`
69+
* `finally`执行时机:无论有没有异常抛出,在程序跳出整体语句之前的最后时刻一定会执行
70+
>整体语句就是指上面的`try..except..else...finally`
71+
72+
![try..except...finally语句](../imgs/python_29_3.JPG)
73+
74+
5.要显式触发异常,可以用`raise`语句。有三种形式的形式:
75+
76+
* `raise exception_obj`:抛出一个异常实例
77+
* `raise Exception_type`:抛出一个指定异常类型的实例,调用`Exception_type()`获得
78+
* `raise <exceptionObj|Exception_type> from <exceptionObj2|Exception_type2>`:
79+
第二个异常实例会附加到第一个异常实例的`.__cause__`属性中并抛出第一个异常实例
80+
* `raise`:转发当前作用域中激活的异常实例。若当前作用域中没有激活的异常实例,则抛出`RuntimeError`实例对象
81+
82+
* 一旦异常在程序中由某个`except`子句捕获,则它就死掉了不会再传递
83+
* `raise`抛出的必须是一个`BaseException`实例或者`BaseException`子类,否则抛出`TypeError`
84+
>`BaseException`类是所有内建异常的父类。
85+
>
86+
>`Exception`类是所有内建异常、`non-system-exiting`异常的父类。用于自定义的异常类也应该从该类派生
87+
88+
![raise语句](../imgs/python_29_4.JPG)
89+
90+
![异常的死亡与活跃](../imgs/python_29_5.JPG)
91+
92+
6.在一个异常处理器内部`raise`一个异常时,前一个异常会附加到新异常的`__context__`属性
93+
94+
* 如果在异常处理器内部`raise`被捕获的异常自己,则并不会添加到`__context__`属性
95+
96+
![异常处理器内的raise](../imgs/python_29_6.JPG)
97+
98+
* 在异常处理器内部`raise``raise e`效果相同
99+
100+
![raise与raise e](../imgs/python_29_7.JPG)
101+
102+
7. `assert`语句可能会引起`AssertionError`。其用法为:`assert <test>,<data>`。这等价于:
103+
104+
```
105+
if __debug__:
106+
if not <test>:
107+
raise AssertionError(<data>)
108+
```
109+
110+
* `<test>`表达式用于计算真假,`<data>`表达式用于作为异常的参数。若`<test>`计算为假,则抛出`AssertionError`
111+
* 若执行时用命令行 `-0`标志位,则关闭`assert`功能(默认是打开的)。
112+
> `__debug__`是内置变量名。当有`-0`标志位时,它为0;否则为1
113+
* 通常`assert`用于给定约束条件,而不是用于捕捉程序的错误。
114+
115+
![assert](../imgs/python_29_8.JPG)
116+
117+
8.Python3中有一种新的异常相关语句:`with/as`语句。它是作为`try/finally`的替代方案。用法为:
118+
119+
```
120+
with expression [as var]:
121+
statements
122+
```
123+
`expression`必须返回一个对象,该对象必须支持环境管理协议。其工作方式为:
124+
125+
* 计算`expression`表达式的值,得到环境管理器对象。环境管理器对象必须有`.__enter__(self)`方法和`.__exit__(self, exc_type, exc_value, traceback)`方法
126+
* 调用环境管理器对象的`.__enter__(self)`方法。如果有`as`子句,`.__enter__(self)`方法返回值赋值给`as`子句中的变量`var`;如果没有`as`子句,则`.__enter__(self)`方法返回值直接丢弃。**<font color='red'>并不是将环境管理器对象赋值给`var`</font>**
127+
* 执行`statements`代码块
128+
* 如果`statements`代码块抛出异常,则`.__exit__(self, exc_type, exc_value, traceback)`方法自动被调用
129+
>在内部这几个实参由`sys.exc_info()`返回`(exc_type, exc_value, traceback)`信息,
130+
131+
* 若`.__exit__()`方法返回值为`False`,则重新抛出异常到`with`语句之外
132+
* 若`.__exit__()`方法返回值为`True`,则异常终止于此,并不会抛出`with`语句之外
133+
* 如果`statements`代码块未抛出异常,则`.__exit__(self, exc_type, exc_value, traceback)`方法自动被调用,调用参数为:`.__exit__(self,None,None,None)`
134+
135+
![with语句](../imgs/python_29_9.JPG)
136+
137+
9.Python3.1之后,`with`语句可以指定多个环境管理器,以逗号分隔。根据定义的顺序这些环境管理器对象的`.__enter__(self)`方法顺序调用,`.__exit__(self, exc_type, exc_value, traceback)`方法逆序调用
138+
>如果对象要支持环境管理协议,则必须实现`.__enter__(self)`方法和`.__exit__(self, exc_type, exc_value, traceback)`方法
139+
140+
![多个with](../imgs/python_29_10.JPG)
141+
142+
Lines changed: 67 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,67 @@
1+
<!--
2+
作者:华校专
3+
email: huaxz1986@163.com
4+
** 本文档可用于个人学习目的,不得用于商业目的 **
5+
-->
6+
# 异常对象
7+
1.Python3中,内置异常与用户自定义异常都是类的实例对象
8+
9+
2.在`try...except`语句进行`except ExceptionType`子句匹配时,采用的是`isinstance(exception_obj,ExceptionType)`这种匹配规则。因此如果`ExceptionType``exception_obj`所属类的超类,则匹配也成功。
10+
11+
3.Python中的内置异常类继承树:
12+
13+
~~~mermaid
14+
graph BT
15+
id1(OverflowError) -->|继承|id2(ArithmeticError)
16+
id2 -->|继承|id3(Exception)
17+
id4(IndexError) -->|继承|id3
18+
id3-->|继承|id5(BaseException)
19+
~~~
20+
21+
* 用户自定义异常类不要直接从`BaseException`继承。`BaseException`提供了默认的打印和状态保持行为
22+
* 在构造时传给异常类的所有参数都将作为一个元组存储在`.args`属性中
23+
* 在构造时传入的字符串作为`.__str(self)__`方法返回。如果传入的不是字符串,
24+
则将先调用`str()`将该参数转换为字符串
25+
* `Exception`是所有内置异常类的超类。用户自定义的异常类都继承自它
26+
* 系统退出事件`SystemExit`、`KeyboardInterrupt`、`GeneratorExit`不能继承自它
27+
28+
![BaseException](../imgs/python_30_1.JPG)
29+
30+
4.自定义异常类:通常继承自`Exception`
31+
32+
* 若想自定义打印显示,则必须重写`.__str__(self)`方法
33+
* 如果想定制初始化方法,必须重写`.__init__(self,args)`方法。此时超类的`.args`属性同样也会起作用
34+
35+
![用户的自定义异常类](../imgs/python_30_2.JPG)
36+
37+
5.Python在运行时会将`try`语句放入堆栈中。抛出异常时,Python跳转至最近的`try`块中,找到匹配该异常的异常处理器(即`except子句`),执行异常处理的`except`子句。一旦异常被捕获并且处理,则其生命周期结束
38+
39+
* 异常的传递:向上返回到先前进入但是尚未离开的`try`
40+
41+
6.Python中所有的错误都是异常。但是并非所有的异常都是错误
42+
43+
* 内置的`input`函数每次调用时,遇到文件末尾时引发内置的`EOFError`
44+
* 调用`sys.exit()`会触发`SystemExit`异常
45+
* 在键盘上按下`Ctrl-C`键时,会触发`KeyboardInterrupt`异常
46+
47+
![系统级的异常事件](../imgs/python_30_3.JPG)
48+
49+
7.用户自定义的异常可以用于触发信号条件。这是利用异常来传递信息的方法
50+
51+
8.`try...finally`通常用于释放系统资源。虽然垃圾收集时资源会自动释放,但是垃圾收集的时机不可控,由算法自动调度
52+
53+
9.可以在顶层代码中使用`try`以及空的`except`来进行调试,从捕获程序有什么意外情况发生
54+
55+
10.`sys.exc_info()`函数返回最近引发的异常信息,它返回一个三元素的元组:`(type,value,traceback)`
56+
57+
* `type`:异常类型
58+
* `value`:异常实例对象
59+
* `traceback`:一个`traceback`对象,代表异常发生时所调用的堆栈
60+
61+
![sys.exc_info函数](../imgs/python_30_4.JPG)
62+
63+
11.为了拦截具体的异常,`except `应该具体化,避免拦截无关事件
64+
65+
* 空的`except`子句拦截任何异常,包括内存错误、系统推出、键盘中断等等
66+
* 但是太具体化不利于扩展
67+

chapter/31_python_unicode_bytes.md

Lines changed: 128 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,128 @@
1+
<!--
2+
作者:华校专
3+
email: huaxz1986@163.com
4+
** 本文档可用于个人学习目的,不得用于商业目的 **
5+
-->
6+
# Unicode与字节串
7+
1.字符编码:
8+
9+
* `ASCII`编码:每个字符存储在一个字节中。字符码值从 0~127
10+
* `Latin-1`编码:每个字符存储在一个字节中。字符码值从 0~255。其中码值128~255分配给特殊字符;码值0~127部分与
11+
`ASCII`编码相同。
12+
* `UTF-8`编码:每个字符存储的字节数量可变,不再是固定编码
13+
> `ASCII`编码是`UTF-8`编码的子集,也是`Latin-1`编码的子集
14+
15+
2.`Unicode`文本通常叫做“宽字符”字符串,因为每个字符可能表示为多个字节
16+
17+
3.查看字符的`Unicode`码值: `ord()`函数;
18+
查看`Unicode`码值对应的字符:`chr()`函数
19+
>这里的`Unicode`码值都是整数,可以是十进制、二进制、八进制、十六进制整数等
20+
21+
![字符与Unicode码值的转换](../imgs/python_31_1.JPG)
22+
23+
4.Python大约支持上百中不同的编码。可以导入`encodings`模块,并运行`help(encodings)`显示很多编码名称。有一些编码是Python中实现的,一些是C中实现的。
24+
>有些编码对应多个不同的名称
25+
26+
![encodings模块](../imgs/python_31_2.JPG)
27+
28+
5.Python3中有三种字符串相关类型:
29+
30+
* `str`类型表示`Unicode`文本(8位和更宽的位数),为不可变的字符序列,称为字符串
31+
* `bytes`表示二进制数据,称为字节串。`bytes`对象其实是小整数的一个序列,每个整数的范围在0~255之间。
32+
* 索引一个`bytes`实例返回一个整数
33+
* 分片一个`bytes`实例返回一个新的`bytes`实例
34+
* `list(bytes_obj)`返回一个整数列表而不是字符列表
35+
> `bytes`类型几乎支持所有的`str`操作,但是不支持字符串格式化操作(没有字节串格式化操作)
36+
37+
* `bytearray`是一种可变的`bytes`类型,称为可变字节串。`bytearray``bytes`的一个变体,
38+
它是可变的且支持原地修改。它支持`str``bytes`的常见操作,以及与列表相同的一些原地修改操作。
39+
40+
![str、bytes、bytearray](../imgs/python_31_3.JPG)
41+
42+
6.`sys.getdefaultencoding()`函数返回平台默认的编码方式。`sys.getfilesystemencoding()`返回系统文件的默认编码方式。
43+
44+
![系统默认编码](../imgs/python_31_4.JPG)
45+
46+
7.Python3中,当一个文件以文本模式打开时,读取其数据会自动将其内容解码,并返回一个字符串;当一个文件以文本模式写打开时,写入一个字符串会在将该字符串写入文件之前自动编码它。
47+
48+
* 编码和解码的类型是系统的平台默认编码类型,或者你手动设定的编码类型
49+
* 根据编码类型,Python自动处理文件起始处的字节标记序列(通常用于标记文件编码类型)
50+
* Python自动对行尾换行符转换。在windows下,换行符`\n`在写入文件时转换为windows下的换行符`\r\n`。在读取文件时windows下的换行符`\r\n`转换为标准换行符`\n`
51+
52+
当一个文件以二进制模式打开时,读取其数据直接返回其原生内容而并不以任何方式解码,也不做任何方式修改(即不转换换行符),直接作为`bytes`实例返回;写入会接受一个`bytes`实例或者一个`bytearray`实例,并且不加修改地写入到文件(即不转换换行符)
53+
54+
![文件和编码](../imgs/python_31_5.JPG)
55+
56+
8.在Python3中,`'xxx'``"xxx"``'''xxx'''`均创建一个字符串常量,而添加一个`b`或者`B`中创建一个`bytes`常量`b'xxx'``B"xxx"``b'''xxx'''`
57+
58+
* 尽管`bytes`打印出来是字符串(若无对应的字符则输出内存表示),但它本质上是一个小整数序列
59+
* Python3中所有字符串都是Unicode字符(是ASCII字符的超集)
60+
61+
![bytes常量](../imgs/python_31_6.JPG)
62+
63+
9.Python3中,虽然字符串与`bytes`的内存表示相同,但是二者不能混用,因为二者无法自动转换。对于期待一个`str`实例作为参数的函数,它不能接受一个`bytes`实例;反之亦然
64+
65+
* 字符串的`.encode(encoding)`方法和`bytes``bytes(a_string,encoding)`函数将一个字符串实例转换为它原生`bytes`形式
66+
* 字符串的`str(a_bytes,encoding)`函数和`bytes``.decode(encoding)`方法将一个`bytes`实例解码成字符串形式。
67+
68+
>字符串的`.encode(encoding)`方法的`encoding`参数可以为空,此时表示使用平台默认编码
69+
70+
>`str(a_bytes)`函数返回的是`bytes`实例的打印字符串,而不是执行编码转换过程
71+
72+
![bytes和字符串的编解码](../imgs/python_31_7.JPG)
73+
74+
10.Python的字符串常量支持:
75+
76+
* `'\xNN'`:单字节字符(8位),等价于`\u00NN`
77+
* `'\uNNNN'`:双字节字符,16位
78+
* `'\UNNNNNNNN'`:4字节字符,32位
79+
>这里的`N`均为十六进制整数的一个整数位[0~F]
80+
81+
![单字节字符与多字节字符](../imgs/python_31_8.JPG)
82+
83+
11.编解码ASCII字符非常简单,无需显示指定编解码类型(当然你可以随意指定一个编解码类型,因为ASCII编码是任何编码类型的子集)
84+
85+
![ASCII字符编码](../imgs/python_31_9.JPG)
86+
87+
编解码非ASCII字符则要注意,对该字符的编码类型必须与解码类型一致,否则乱码或者抛出`UnicodeDecodeError`
88+
89+
![ASCII字符编码](../imgs/python_31_10.JPG)
90+
91+
12.生成Unicode字符串你可以通过Unicode转义序列来创建,如`'A\u4e2d\u56fd'`;也可以通过`chr()`函数来创建,如
92+
`'A'+chr(0x4e2d)+chr(0x56fd)`,最终结果都是`'A中国'`
93+
94+
13.字符串常量与`bytes`常量区别:
95+
96+
* 对字符串常量,`'\xNN'``'\u00NN'`是等价的;对`bytes`常量,`b'\xNN'``b'\u00NN'`是不等的
97+
>`b'\xE8'`长度为2字节,`b'\u00E8'`长度为6字节
98+
* 字符串常量可以包含任意字符;`bytes`常量要求字符要么是ASCII字符,要么是转义字符
99+
* `len(string_literal)`得到字符串常量的字符个数;`len(bytes_literal)`得到`bytes`常量的字节数
100+
101+
![字符串常量与bytes常量](../imgs/python_31_11.JPG)
102+
103+
14.指定Python源文件字符集编码声明:在脚本的第一行写入:
104+
105+
```
106+
# -*- coding: latin-1 -*-
107+
```
108+
109+
15.`bytes`实例的构造:
110+
111+
* `b'abc'`:构造`bytes`常量
112+
* `bytes('abc',encoding='ascii')`:通过构造函数传入字符串和编码构造
113+
* `bytes([97,98,99])`:通过传入小整数可迭代对象构造
114+
* `'abc'.encode('ascii')`:从字符串编码获取
115+
116+
16.`bytearray`实例的构造:
117+
118+
* `bytearray('abc',encoding='ascii')`:通过构造函数传入字符串和编码构造
119+
* `bytearray(b'abc')`:通过`bytes`常量构造
120+
121+
![bytes构造与bytearray构造](../imgs/python_31_12.JPG)
122+
123+
17.打开文件时,可以通过`encoding`关键字参数指定打开文件的编码方式
124+
125+
18.Python的`struct`模块可以从字符串创建和提取打包的`bytes`
126+
127+
19.`pickle`模块存储`pickle`化的对象用的是`bytes`
128+

0 commit comments

Comments
 (0)