Merge branch 'jackfrued:master' into master

pull/617/head
JevonsGuo 2023-10-13 23:03:17 +08:00 committed by GitHub
commit 23255908db
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
889 changed files with 56939 additions and 6855 deletions

0
.gitignore vendored 100644 → 100755
View File

4
Day01-15/01.初识Python.md 100644 → 100755
View File

@ -10,7 +10,7 @@
4. 2000年10月16日Python 2.0发布,增加了完整的[垃圾回收](https://zh.wikipedia.org/wiki/%E5%9E%83%E5%9C%BE%E5%9B%9E%E6%94%B6_(%E8%A8%88%E7%AE%97%E6%A9%9F%E7%A7%91%E5%AD%B8)),提供了对[Unicode](https://zh.wikipedia.org/wiki/Unicode)的支持。与此同时Python的整个开发过程更加透明社区对开发进度的影响逐渐扩大生态圈开始慢慢形成。 4. 2000年10月16日Python 2.0发布,增加了完整的[垃圾回收](https://zh.wikipedia.org/wiki/%E5%9E%83%E5%9C%BE%E5%9B%9E%E6%94%B6_(%E8%A8%88%E7%AE%97%E6%A9%9F%E7%A7%91%E5%AD%B8)),提供了对[Unicode](https://zh.wikipedia.org/wiki/Unicode)的支持。与此同时Python的整个开发过程更加透明社区对开发进度的影响逐渐扩大生态圈开始慢慢形成。
5. 2008年12月3日Python 3.0发布它并不完全兼容之前的Python代码不过因为目前还有不少公司在项目和运维中使用Python 2.x版本所以Python 3.x的很多新特性后来也被移植到Python 2.6/2.7版本中。 5. 2008年12月3日Python 3.0发布它并不完全兼容之前的Python代码不过因为目前还有不少公司在项目和运维中使用Python 2.x版本所以Python 3.x的很多新特性后来也被移植到Python 2.6/2.7版本中。
目前我使用的Python 3.7.x的版本是在2018年发布的Python的版本号分为三段形如A.B.C。其中A表示大版本号一般当整体重写或出现不向后兼容的改变时增加AB表示功能更新出现新功能时增加BC表示小的改动例如修复了某个Bug只要有修改就增加C。如果对Python的历史感兴趣可以阅读名为[《Python简史》](http://www.cnblogs.com/vamei/archive/2013/02/06/2892628.html)的网络文章。 目前我使用的Python 3.7.x的版本是在2018年发布的Python的版本号分为三段形如A.B.C。其中A表示大版本号一般当整体重写或出现不向后兼容的改变时增加AB表示功能更新出现新功能时增加BC表示小的改动例如修复了某个Bug只要有修改就增加C。如果对Python的历史感兴趣可以阅读名为[《Python简史》](http://www.cnblogs.com/vamei/archive/2013/02/06/2892628.html)的网络文章。
#### Python的优缺点 #### Python的优缺点
@ -218,7 +218,7 @@ pip3 install ipython
#### PyCharm - Python开发神器 #### PyCharm - Python开发神器
PyCharm的安装、配置和使用在[《玩转PyCharm》](../玩转PyCharm.md)进行了介绍,有兴趣的读者可以选择阅读。 PyCharm的安装、配置和使用在[《玩转PyCharm》](../番外篇/玩转PyCharm.md)进行了介绍,有兴趣的读者可以选择阅读。
![](./res/python-pycharm.png) ![](./res/python-pycharm.png)

2
Day01-15/02.语言元素.md 100644 → 100755
View File

@ -193,7 +193,7 @@ c = (f - 32) / 1.8
print('%.1f华氏度 = %.1f摄氏度' % (f, c)) print('%.1f华氏度 = %.1f摄氏度' % (f, c))
``` ```
> **说明**:在使用`print`函数输出时,也可以对字符串内容进行格式化处理,上面`print`函数中的字符串`%1.f`是一个占位符,稍后会由一个`float`类型的变量值替换掉它。同理,如果字符串中有`%d`,后面可以用一个`int`类型的变量值替换掉它,而`%s`会被字符串的值替换掉。除了这种格式化字符串的方式外,还可以用下面的方式来格式化字符串,其中`{f:.1f}`和`{c:.1f}`可以先看成是`{f}`和`{c}`,表示输出时会用变量`f`和变量`c`的值替换掉这两个占位符,后面的`:.1f`表示这是一个浮点数小数点后保留1位有效数字。 > **说明**:在使用`print`函数输出时,也可以对字符串内容进行格式化处理,上面`print`函数中的字符串`%.1f`是一个占位符,稍后会由一个`float`类型的变量值替换掉它。同理,如果字符串中有`%d`,后面可以用一个`int`类型的变量值替换掉它,而`%s`会被字符串的值替换掉。除了这种格式化字符串的方式外,还可以用下面的方式来格式化字符串,其中`{f:.1f}`和`{c:.1f}`可以先看成是`{f}`和`{c}`,表示输出时会用变量`f`和变量`c`的值替换掉这两个占位符,后面的`:.1f`表示这是一个浮点数小数点后保留1位有效数字。
> >
> ```Python > ```Python
> print(f'{f:.1f}华氏度 = {c:.1f}摄氏度') > print(f'{f:.1f}华氏度 = {c:.1f}摄氏度')

0
Day01-15/03.分支结构.md 100644 → 100755
View File

2
Day01-15/04.循环结构.md 100644 → 100755
View File

@ -168,7 +168,7 @@ y = int(input('y = '))
if x > y: if x > y:
# 通过下面的操作将y的值赋给x, 将x的值赋给y # 通过下面的操作将y的值赋给x, 将x的值赋给y
x, y = y, x x, y = y, x
# 从两个数中较的数开始做递减的循环 # 从两个数中较的数开始做递减的循环
for factor in range(x, 0, -1): for factor in range(x, 0, -1):
if x % factor == 0 and y % factor == 0: if x % factor == 0 and y % factor == 0:
print('%d和%d的最大公约数是%d' % (x, y, factor)) print('%d和%d的最大公约数是%d' % (x, y, factor))

0
Day01-15/05.构造程序逻辑.md 100644 → 100755
View File

View File

@ -200,7 +200,7 @@ from module1 import foo
foo() foo()
``` ```
需要说明的是,如果我们导入的模块除了定义函数之外还有可以执行代码那么Python解释器在导入这个模块时就会执行这些代码事实上我们可能并不希望如此因此如果我们在模块中编写了执行代码最好是将这些执行代码放入如下所示的条件中这样的话除非直接运行该模块if条件下的这些代码是不会执行的因为只有直接执行的模块的名字才是"\_\_main\_\_" 需要说明的是如果我们导入的模块除了定义函数之外还有可以执行代码那么Python解释器在导入这个模块时就会执行这些代码事实上我们可能并不希望如此因此如果我们在模块中编写了执行代码最好是将这些执行代码放入如下所示的条件中这样的话除非直接运行该模块if条件下的这些代码是不会执行的因为只有直接执行的模块的名字才是"\_\_main\_\_"
`module3.py` `module3.py`

View File

@ -2,7 +2,7 @@
### 使用字符串 ### 使用字符串
第二次世界大战促使了现代电子计算机的诞生最初计算机被应用于导弹弹道的计算而在计算机诞生后的很多年时间里计算机处理的信息基本上都是数值型的信息。世界上的第一台电子计算机叫ENIAC电子数值积分计算机诞生于美国的宾夕法尼亚大学每秒钟能够完成约5000次浮点运算。随着时间的推移虽然数值运算仍然是计算机日常工作中最为重要的事情之一但是今天的计算机处理得更多的数据可能都是以文本的方式存在的如果我们希望通过Python程序操作这些文本信息,就必须要先了解字符串类型以及与它相关的知识。 第二次世界大战促使了现代电子计算机的诞生最初计算机被应用于导弹弹道的计算而在计算机诞生后的很多年时间里计算机处理的信息基本上都是数值型的信息。世界上的第一台电子计算机叫ENIAC电子数值积分计算机诞生于美国的宾夕法尼亚大学每秒钟能够完成约5000次浮点运算。随着时间的推移虽然数值运算仍然是计算机日常工作中最为重要的事情之一但是今天的计算机处理得更多的数据可能都是以文本的方式存在的如果我们希望通过Python程序操作这些文本信息就必须要先了解字符串类型以及与它相关的知识。
所谓**字符串**,就是由零个或多个字符组成的有限序列,一般记为![$${\displaystyle s=a_{1}a_{2}\dots a_{n}(0\leq n \leq \infty)}$$](./res/formula_5.png)。在Python程序中如果我们把单个或多个字符用单引号或者双引号包围起来就可以表示一个字符串。 所谓**字符串**,就是由零个或多个字符组成的有限序列,一般记为![$${\displaystyle s=a_{1}a_{2}\dots a_{n}(0\leq n \leq \infty)}$$](./res/formula_5.png)。在Python程序中如果我们把单个或多个字符用单引号或者双引号包围起来就可以表示一个字符串。

View File

0
Day01-15/09.面向对象进阶.md 100644 → 100755
View File

View File

0
Day01-15/11.文件和异常.md 100644 → 100755
View File

View File

6
Day01-15/13.进程和线程.md 100644 → 100755
View File

@ -316,7 +316,7 @@ if __name__ == '__main__':
但是切换作业是有代价的比如从语文切到数学要先收拾桌子上的语文书本、钢笔这叫保存现场然后打开数学课本、找出圆规直尺这叫准备新环境才能开始做数学作业。操作系统在切换进程或者线程时也是一样的它需要先保存当前执行的现场环境CPU寄存器状态、内存页等然后把新任务的执行环境准备好恢复上次的寄存器状态切换内存页等才能开始执行。这个切换过程虽然很快但是也需要耗费时间。如果有几千个任务同时进行操作系统可能就主要忙着切换任务根本没有多少时间去执行任务了这种情况最常见的就是硬盘狂响点窗口无反应系统处于假死状态。所以多任务一旦多到一个限度反而会使得系统性能急剧下降最终导致所有任务都做不好。 但是切换作业是有代价的比如从语文切到数学要先收拾桌子上的语文书本、钢笔这叫保存现场然后打开数学课本、找出圆规直尺这叫准备新环境才能开始做数学作业。操作系统在切换进程或者线程时也是一样的它需要先保存当前执行的现场环境CPU寄存器状态、内存页等然后把新任务的执行环境准备好恢复上次的寄存器状态切换内存页等才能开始执行。这个切换过程虽然很快但是也需要耗费时间。如果有几千个任务同时进行操作系统可能就主要忙着切换任务根本没有多少时间去执行任务了这种情况最常见的就是硬盘狂响点窗口无反应系统处于假死状态。所以多任务一旦多到一个限度反而会使得系统性能急剧下降最终导致所有任务都做不好。
是否采用多任务的第二个考虑是任务的类型可以把任务分为计算密集型和I/O密集型。计算密集型任务的特点是要进行大量的计算消耗CPU资源比如对视频进行编码解码或者格式转换等等这种任务全靠CPU的运算能力虽然也可以用多任务完成但是任务越多花在任务切换的时间就越多CPU执行任务的效率就越低。计算密集型任务由于主要消耗CPU资源这类任务用Python这样的脚本语言去执行效率通常很低最能胜任这类任务的是C语言我们之前提到Python中有嵌入C/C++代码的机制。 是否采用多任务的第二个考虑是任务的类型可以把任务分为计算密集型和I/O密集型。计算密集型任务的特点是要进行大量的计算消耗CPU资源比如对视频进行编码解码或者格式转换等等这种任务全靠CPU的运算能力虽然也可以用多任务完成但是任务越多花在任务切换的时间就越多CPU执行任务的效率就越低。计算密集型任务由于主要消耗CPU资源这类任务用Python这样的脚本语言去执行效率通常很低最能胜任这类任务的是C语言我们之前提到Python中有嵌入C/C++代码的机制。
除了计算密集型任务其他的涉及到网络、存储介质I/O的任务都可以视为I/O密集型任务这类任务的特点是CPU消耗很少任务的大部分时间都在等待I/O操作完成因为I/O的速度远远低于CPU和内存的速度。对于I/O密集型任务如果启动多任务就可以减少I/O等待时间从而让CPU高效率的运转。有一大类的任务都属于I/O密集型任务这其中包括了我们很快会涉及到的网络应用和Web应用。 除了计算密集型任务其他的涉及到网络、存储介质I/O的任务都可以视为I/O密集型任务这类任务的特点是CPU消耗很少任务的大部分时间都在等待I/O操作完成因为I/O的速度远远低于CPU和内存的速度。对于I/O密集型任务如果启动多任务就可以减少I/O等待时间从而让CPU高效率的运转。有一大类的任务都属于I/O密集型任务这其中包括了我们很快会涉及到的网络应用和Web应用。
@ -324,9 +324,9 @@ if __name__ == '__main__':
### 单线程+异步I/O ### 单线程+异步I/O
现代操作系统对I/O操作的改进中最为重要的就是支持异步I/O。如果充分利用操作系统提供的异步I/O支持就可以用单进程单线程模型来执行多任务这种全新的模型称为事件驱动模型。Nginx就是支持异步I/O的Web服务器它在单核CPU上采用单进程模型就可以高效地支持多任务。在多核CPU上可以运行多个进程数量与CPU核心数相同充分利用多核CPU。用Node.js开发的服务器端程序也使用了这种工作模式这也是当下实现多任务编程的一种趋势 现代操作系统对I/O操作的改进中最为重要的就是支持异步I/O。如果充分利用操作系统提供的异步I/O支持就可以用单进程单线程模型来执行多任务这种全新的模型称为事件驱动模型。Nginx就是支持异步I/O的Web服务器它在单核CPU上采用单进程模型就可以高效地支持多任务。在多核CPU上可以运行多个进程数量与CPU核心数相同充分利用多核CPU。用Node.js开发的服务器端程序也使用了这种工作模式这也是当下并发编程的一种流行方案
在Python语言中单线程+异步I/O的编程模型称为协程有了协程的支持就可以基于事件驱动编写高效的多任务程序。协程最大的优势就是极高的执行效率因为子程序切换不是线程切换而是由程序自身控制因此没有线程切换的开销。协程的第二个优势就是不需要多线程的锁机制因为只有一个线程也不存在同时写变量冲突在协程中控制共享资源不用加锁只需要判断状态就好了所以执行效率比多线程高很多。如果想要充分利用CPU的多核特性最简单的方法是多进程+协程,既充分利用多核,又充分发挥协程的高效率,可获得极高的性能。关于这方面的内容,我稍后会做一个专题来进行讲解。 在Python语言中单线程+异步I/O的编程模型称为协程有了协程的支持就可以基于事件驱动编写高效的多任务程序。协程最大的优势就是极高的执行效率因为子程序切换不是线程切换而是由程序自身控制因此没有线程切换的开销。协程的第二个优势就是不需要多线程的锁机制因为只有一个线程也不存在同时写变量冲突在协程中控制共享资源不用加锁只需要判断状态就好了所以执行效率比多线程高很多。如果想要充分利用CPU的多核特性最简单的方法是多进程+协程,既充分利用多核,又充分发挥协程的高效率,可获得极高的性能。关于这方面的内容,在后续的课程中会进行讲解。
### 应用案例 ### 应用案例

View File

0
Day01-15/code/Day01/flag.py 100644 → 100755
View File

0
Day01-15/code/Day01/hello.py 100644 → 100755
View File

0
Day01-15/code/Day01/peppa_pig.py 100644 → 100755
View File

0
Day01-15/code/Day02/centigrade.py 100644 → 100755
View File

0
Day01-15/code/Day02/circle.py 100644 → 100755
View File

0
Day01-15/code/Day02/leap.py 100644 → 100755
View File

0
Day01-15/code/Day02/operator.py 100644 → 100755
View File

0
Day01-15/code/Day02/strings.py 100644 → 100755
View File

0
Day01-15/code/Day02/variable1.py 100644 → 100755
View File

0
Day01-15/code/Day02/variable2.py 100644 → 100755
View File

0
Day01-15/code/Day02/variable3.py 100644 → 100755
View File

0
Day01-15/code/Day02/variable4.py 100644 → 100755
View File

0
Day01-15/code/Day02/variable5.py 100644 → 100755
View File

0
Day01-15/code/Day03/conversion.py 100644 → 100755
View File

0
Day01-15/code/Day03/grade.py 100644 → 100755
View File

0
Day01-15/code/Day03/piecewise.py 100644 → 100755
View File

0
Day01-15/code/Day03/rolldice.py 100644 → 100755
View File

0
Day01-15/code/Day03/tax.py 100644 → 100755
View File

0
Day01-15/code/Day03/triangle.py 100644 → 100755
View File

0
Day01-15/code/Day03/verify.py 100644 → 100755
View File

0
Day01-15/code/Day04/for1.py 100644 → 100755
View File

0
Day01-15/code/Day04/for2.py 100644 → 100755
View File

0
Day01-15/code/Day04/for3.py 100644 → 100755
View File

0
Day01-15/code/Day04/for4.py 100644 → 100755
View File

0
Day01-15/code/Day04/for5.py 100644 → 100755
View File

0
Day01-15/code/Day04/for6.py 100644 → 100755
View File

0
Day01-15/code/Day04/while1.py 100644 → 100755
View File

0
Day01-15/code/Day04/while2.py 100644 → 100755
View File

0
Day01-15/code/Day05/chicken.py 100644 → 100755
View File

0
Day01-15/code/Day05/craps.py 100644 → 100755
View File

0
Day01-15/code/Day05/fibonacci.py 100644 → 100755
View File

0
Day01-15/code/Day05/guess.py 100644 → 100755
View File

0
Day01-15/code/Day05/lily.py 100644 → 100755
View File

0
Day01-15/code/Day05/palindrome.py 100644 → 100755
View File

2
Day01-15/code/Day05/perfect.py 100644 → 100755
View File

@ -9,7 +9,7 @@ Date: 2018-03-02
""" """
import math import math
for num in range(1, 10000): for num in range(2, 10000):
result = 0 result = 0
for factor in range(1, int(math.sqrt(num)) + 1): for factor in range(1, int(math.sqrt(num)) + 1):
if num % factor == 0: if num % factor == 0:

0
Day01-15/code/Day05/prime.py 100644 → 100755
View File

0
Day01-15/code/Day05/table.py 100644 → 100755
View File

0
Day01-15/code/Day06/function1.py 100644 → 100755
View File

0
Day01-15/code/Day06/function2.py 100644 → 100755
View File

0
Day01-15/code/Day06/function3.py 100644 → 100755
View File

0
Day01-15/code/Day06/function4.py 100644 → 100755
View File

0
Day01-15/code/Day06/function5.py 100644 → 100755
View File

0
Day01-15/code/Day06/function6.py 100644 → 100755
View File

0
Day01-15/code/Day07/avgscore.py 100644 → 100755
View File

0
Day01-15/code/Day07/dict1.py 100644 → 100755
View File

0
Day01-15/code/Day07/dict2.py 100644 → 100755
View File

0
Day01-15/code/Day07/fibonacci.py 100644 → 100755
View File

0
Day01-15/code/Day07/findmax.py 100644 → 100755
View File

0
Day01-15/code/Day07/list1.py 100644 → 100755
View File

0
Day01-15/code/Day07/list2.py 100644 → 100755
View File

0
Day01-15/code/Day07/list3.py 100644 → 100755
View File

0
Day01-15/code/Day07/lottery.py 100644 → 100755
View File

0
Day01-15/code/Day07/marquee.py 100644 → 100755
View File

0
Day01-15/code/Day07/scoretable.py 100644 → 100755
View File

0
Day01-15/code/Day07/set1.py 100644 → 100755
View File

0
Day01-15/code/Day07/set2.py 100644 → 100755
View File

View File

0
Day01-15/code/Day07/tuple.py 100644 → 100755
View File

0
Day01-15/code/Day07/yanghui.py 100644 → 100755
View File

0
Day01-15/code/Day08/access.py 100644 → 100755
View File

0
Day01-15/code/Day08/circle.py 100644 → 100755
View File

0
Day01-15/code/Day08/clock.py 100644 → 100755
View File

0
Day01-15/code/Day08/guess.py 100644 → 100755
View File

0
Day01-15/code/Day08/hack.py 100644 → 100755
View File

0
Day01-15/code/Day08/rect.py 100644 → 100755
View File

0
Day01-15/code/Day08/student.py 100644 → 100755
View File

View File

0
Day01-15/code/Day09/car1.py 100644 → 100755
View File

0
Day01-15/code/Day09/car2.py 100644 → 100755
View File

0
Day01-15/code/Day09/clock.py 100644 → 100755
View File

0
Day01-15/code/Day09/dependency.py 100644 → 100755
View File

0
Day01-15/code/Day09/diamond.py 100644 → 100755
View File

0
Day01-15/code/Day09/employee.py 100644 → 100755
View File

0
Day01-15/code/Day09/multi.py 100644 → 100755
View File

0
Day01-15/code/Day09/pet.py 100644 → 100755
View File

0
Day01-15/code/Day09/rational.py 100644 → 100755
View File

0
Day01-15/code/Day09/shape.py 100644 → 100755
View File

0
Day01-15/code/Day09/triangle.py 100644 → 100755
View File

0
Day01-15/code/Day10/ball.py 100644 → 100755
View File

0
Day01-15/code/Day10/gui1.py 100644 → 100755
View File

0
Day01-15/code/Day10/gui2.py 100644 → 100755
View File

0
Day01-15/code/Day10/gui3.py 100644 → 100755
View File

0
Day01-15/code/Day10/renju.py 100644 → 100755
View File

0
Day01-15/code/Day10/snake.py 100644 → 100755
View File

Some files were not shown because too many files have changed in this diff Show More