更新了代码和文档中的bug

pull/133/head
jackfrued 2019-05-18 23:43:59 +08:00
commit 2768776290
25 changed files with 72 additions and 58 deletions

BIN
.DS_Store vendored 100644

Binary file not shown.

3
.gitpod.yml 100644
View File

@ -0,0 +1,3 @@
tasks:
- before: gp open Day01-15/Day01/code/hello.py
command: python3 Day01-15/Day01/code/hello.py

View File

@ -193,19 +193,24 @@ Anaconda指的是一个开源的Python发行版本其包含了conda、Python
- 首先可以通过[官方网站](https://www.sublimetext.com/)下载安装程序安装Sublime 3或Sublime 2。 - 首先可以通过[官方网站](https://www.sublimetext.com/)下载安装程序安装Sublime 3或Sublime 2。
- 安装包管理工具。通过快捷键Ctrl+`或者在View菜单中选择Show Console打开控制台输入下面的代码。 - 安装包管理工具。
1. 通过快捷键Ctrl+`或者在View菜单中选择Show Console打开控制台输入下面的代码。
- Sublime 3 - Sublime 3
```Python ```Python
import urllib.request,os;pf='Package Control.sublime-package';ipp=sublime.installed_packages_path();urllib.request.install_opener(urllib.request.build_opener(urllib.request.ProxyHandler()));open(os.path.join(ipp,pf),'wb').write(urllib.request.urlopen('http://sublime.wbond.net/'+pf.replace(' ','%20')).read()) import urllib.request,os;pf='Package Control.sublime-package';ipp=sublime.installed_packages_path();urllib.request.install_opener(urllib.request.build_opener(urllib.request.ProxyHandler()));open(os.path.join(ipp,pf),'wb').write(urllib.request.urlopen('http://sublime.wbond.net/'+pf.replace(' ','%20')).read())
``` ```
- Sublime 2 - Sublime 2
```Python ```Python
import urllib2,os;pf='Package Control.sublime-package';ipp=sublime.installed_packages_path();os.makedirs(ipp)ifnotos.path.exists(ipp)elseNone;urllib2.install_opener(urllib2.build_opener(urllib2.ProxyHandler()));open(os.path.join(ipp,pf),'wb').write(urllib2.urlopen('http://sublime.wbond.net/'+pf.replace(' ','%20')).read());print('Please restart Sublime Text to finish installation') import urllib2,os;pf='Package Control.sublime-package';ipp=sublime.installed_packages_path();os.makedirs(ipp)ifnotos.path.exists(ipp)elseNone;urllib2.install_opener(urllib2.build_opener(urllib2.ProxyHandler()));open(os.path.join(ipp,pf),'wb').write(urllib2.urlopen('http://sublime.wbond.net/'+pf.replace(' ','%20')).read());print('Please restart Sublime Text to finish installation')
``` ```
2. 手动安装浏览器输入 https://sublime.wbond.net/Package%20Control.sublime-package 下载这个文件
下载好以后打开sublime text选择菜单Preferences->Browse Packages... 打开安装目录
此时会进入到一个叫做Packages的目录下点击进入上一层目录Sublime Text3在此目录下有一个文件夹叫做Installed Packages把刚才下载的文件放到这里就可以了。然后重启sublime text3观察Preferences菜单最下边是否有Package Settings 和Package Control两个选项如果有则代表安装成功了。
- 安装插件。通过Preference菜单的Package Control或快捷键Ctrl+Shift+P打开命令面板在面板中输入Install Package就可以找到安装插件的工具然后再查找需要的插件。我们推荐大家安装以下几个插件 - 安装插件。通过Preference菜单的Package Control或快捷键Ctrl+Shift+P打开命令面板在面板中输入Install Package就可以找到安装插件的工具然后再查找需要的插件。我们推荐大家安装以下几个插件
@ -221,6 +226,12 @@ PyCharm的安装、配置和使用我们在后面会进行介绍。
![](./res/python-pycharm.png) ![](./res/python-pycharm.png)
#### Gitpod - 一键式在线开发工具
只需单击即可在GitHub上打开任何Python项目。
[![Open in Gitpod](https://gitpod.io/button/open-in-gitpod.svg)](https://gitpod.io/#https://github.com/jackfrued/Python-100-Days)
### 练习 ### 练习
1. 在Python交互环境中查看下面的代码结果并将内容翻译成中文。 1. 在Python交互环境中查看下面的代码结果并将内容翻译成中文。

View File

@ -99,11 +99,11 @@ print(type(e))
在对变量类型进行转换时可以使用Python的内置函数准确的说下面列出的并不是真正意义上的函数而是后面我们要讲到的创建对象的构造方法 在对变量类型进行转换时可以使用Python的内置函数准确的说下面列出的并不是真正意义上的函数而是后面我们要讲到的创建对象的构造方法
- int():将一个数值或字符串转换成整数,可以指定进制。 - `int()`:将一个数值或字符串转换成整数,可以指定进制。
- float():将一个字符串转换成浮点数。 - `float()`:将一个字符串转换成浮点数。
- str():将指定的对象转换成字符串形式,可以指定编码。 - `str()`:将指定的对象转换成字符串形式,可以指定编码。
- chr():将整数转换成该编码对应的字符串(一个字符)。 - `chr()`:将整数转换成该编码对应的字符串(一个字符)。
- ord():将字符串(一个字符)转换成对应的编码(整数)。 - `ord()`:将字符串(一个字符)转换成对应的编码(整数)。
### 运算符 ### 运算符
@ -118,13 +118,13 @@ Python支持多种运算符下表大致按照优先级从高到低的顺序
| `+` `-` | 加,减 | | `+` `-` | 加,减 |
| `>>` `<<` | 右移,左移 | | `>>` `<<` | 右移,左移 |
| `&` | 按位与 | | `&` | 按位与 |
| `^` `|` | 按位异或,按位或 | | `^` `\|` | 按位异或,按位或 |
| `<=` `<` `>` `>=` | 小于等于,小于,大于,大于等于 | | `<=` `<` `>` `>=` | 小于等于,小于,大于,大于等于 |
| `==` `!=` | 等于,不等于 | | `==` `!=` | 等于,不等于 |
| `is` `is not` | 身份运算符 | | `is` `is not` | 身份运算符 |
| `in` `not in` | 成员运算符 | | `in` `not in` | 成员运算符 |
| `not` `or` `and` | 逻辑运算符 | | `not` `or` `and` | 逻辑运算符 |
| `=` `+=` `-=` `*=` `/=` `%=` `//=` `**=` `&=` `|=` `^=` `>>=` `<<=` | (复合)赋值运算符 | | `=` `+=` `-=` `*=` `/=` `%=` `//=` `**=` `&=` `\|=` `^=` `>>=` `<<=` | (复合)赋值运算符 |
>**说明:** 在实际开发中,如果搞不清楚优先级可以使用括号来确保运算的执行顺序。 >**说明:** 在实际开发中,如果搞不清楚优先级可以使用括号来确保运算的执行顺序。

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.9 KiB

View File

@ -31,7 +31,7 @@ else:
当然如果要构造出更多的分支,可以使用`if…elif…else…`结构,例如下面的分段函数求值。 当然如果要构造出更多的分支,可以使用`if…elif…else…`结构,例如下面的分段函数求值。
$$f(x)=\begin{cases} 3x-5&\text{(x>1)}\\x+2&\text{(-1}\leq\text{x}\leq\text{1)}\\5x+3&\text {(x<-1)}\end{cases}$$ ![$$f(x)=\begin{cases} 3x-5&\text{(x>1)}\\x+2&\text{(-1}\leq\text{x}\leq\text{1)}\\5x+3&\text {(x<-1)}\end{cases}$$](./res/formula_1.png)
```Python ```Python
""" """

Binary file not shown.

After

Width:  |  Height:  |  Size: 487 B

View File

@ -6,7 +6,7 @@
### for-in循环 ### for-in循环
如果明确的知道循环执行的次数或者是要对一个容器进行迭代(后面会讲到),那么我们推荐使用`for-in`循环,例如下面代码中计算$\sum_{n=1}^{100}n$。 如果明确的知道循环执行的次数或者是要对一个容器进行迭代(后面会讲到),那么我们推荐使用`for-in`循环,例如下面代码中计算![$\sum_{n=1}^{100}n$](./res/formula_1.png)
```Python ```Python
""" """

Binary file not shown.

After

Width:  |  Height:  |  Size: 618 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

View File

@ -2,11 +2,11 @@
在讲解本章节的内容之前,我们先来研究一道数学题,请说出下面的方程有多少组正整数解。 在讲解本章节的内容之前,我们先来研究一道数学题,请说出下面的方程有多少组正整数解。
$$x_1 + x_2 + x_3 + x_4 = 8$$ ![$$x_1 + x_2 + x_3 + x_4 = 8$$](./res/formula_1.png)
事实上上面的问题等同于将8个苹果分成四组每组至少一个苹果有多少种方案。想到这一点问题的答案就呼之欲出了。 事实上上面的问题等同于将8个苹果分成四组每组至少一个苹果有多少种方案。想到这一点问题的答案就呼之欲出了。
$$C_M^N =\frac{M!}{N!(M-N)!}, \text{(M=7, N=3)} $$ ![$$C_M^N =\frac{M!}{N!(M-N)!}, \text{(M=7, N=3)} $$](./res/formula_2.png)
可以用Python的程序来计算出这个值代码如下所示。 可以用Python的程序来计算出这个值代码如下所示。
@ -337,7 +337,7 @@ if __name__ == '__main__':
在实际开发中,我们应该尽量减少对全局变量的使用,因为全局变量的作用域和影响过于广泛,可能会发生意料之外的修改和使用,除此之外全局变量比局部变量拥有更长的生命周期,可能导致对象占用的内存长时间无法被[垃圾回收](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))。事实上,减少对全局变量的使用,也是降低代码之间耦合度的一个重要举措,同时也是对[迪米特法则](https://zh.wikipedia.org/zh-hans/%E5%BE%97%E5%A2%A8%E5%BF%92%E8%80%B3%E5%AE%9A%E5%BE%8B)的践行。减少全局变量的使用就意味着我们应该尽量让变量的作用域在函数的内部,但是如果我们希望将一个局部变量的生命周期延长,使其在函数调用结束后依然可以访问,这时候就需要使用[闭包](https://zh.wikipedia.org/wiki/%E9%97%AD%E5%8C%85_(%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6)),这个我们在后续的内容中进行讲解。 在实际开发中,我们应该尽量减少对全局变量的使用,因为全局变量的作用域和影响过于广泛,可能会发生意料之外的修改和使用,除此之外全局变量比局部变量拥有更长的生命周期,可能导致对象占用的内存长时间无法被[垃圾回收](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))。事实上,减少对全局变量的使用,也是降低代码之间耦合度的一个重要举措,同时也是对[迪米特法则](https://zh.wikipedia.org/zh-hans/%E5%BE%97%E5%A2%A8%E5%BF%92%E8%80%B3%E5%AE%9A%E5%BE%8B)的践行。减少全局变量的使用就意味着我们应该尽量让变量的作用域在函数的内部,但是如果我们希望将一个局部变量的生命周期延长,使其在函数调用结束后依然可以访问,这时候就需要使用[闭包](https://zh.wikipedia.org/wiki/%E9%97%AD%E5%8C%85_(%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6)),这个我们在后续的内容中进行讲解。
> **说明**很多人经常会将“闭包”一词和[“匿名函数”](https://zh.wikipedia.org/wiki/%E5%8C%BF%E5%90%8D%E5%87%BD%E6%95%B0)混为一谈,但实际上它们是不同的概念,如果想提前了解这个概念,推荐看看[维基百科](https://zh.wikipedia.org/wiki/)或者[知乎](https://www.zhihu.com/)上对这个概念的讨论。 > **说明** 很多人经常会将“闭包”一词和[“匿名函数”](https://zh.wikipedia.org/wiki/%E5%8C%BF%E5%90%8D%E5%87%BD%E6%95%B0)混为一谈,但实际上它们是不同的概念,如果想提前了解这个概念,推荐看看[维基百科](https://zh.wikipedia.org/wiki/)或者[知乎](https://www.zhihu.com/)上对这个概念的讨论。
说了那么多其实结论很简单从现在开始我们可以将Python代码按照下面的格式进行书写这一点点的改进其实就是在我们理解了函数和作用域的基础上跨出的巨大的一步。 说了那么多其实结论很简单从现在开始我们可以将Python代码按照下面的格式进行书写这一点点的改进其实就是在我们理解了函数和作用域的基础上跨出的巨大的一步。

Binary file not shown.

After

Width:  |  Height:  |  Size: 816 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 365 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 311 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 798 B

View File

@ -2,7 +2,7 @@
### 使用字符串 ### 使用字符串
第二次世界大战促使了现代电子计算机的诞生当初的想法很简单就是用计算机来计算导弹的弹道因此在计算机刚刚诞生的那个年代计算机处理的信息主要是数值而世界上的第一台电子计算机ENIAC每秒钟能够完成约5000次浮点运算。随着时间的推移虽然对数值运算仍然是计算机日常工作中最为重要的事情之一但是今天的计算机处理得更多的数据都是以文本信息的方式存在的而Python表示文本信息的方式我们在很早以前就说过了那就是字符串类型。所谓**字符串**,就是由零个或多个字符组成的有限序列,一般记为[$${\displaystyle s=a_{1}a_{2}\dots a_{n}(0\leq n \leq \infty)}$$](https://wikimedia.org/api/rest_v1/media/math/render/svg/e29bf631b090323edd6889f810e6cff29538b161)。 第二次世界大战促使了现代电子计算机的诞生当初的想法很简单就是用计算机来计算导弹的弹道因此在计算机刚刚诞生的那个年代计算机处理的信息主要是数值而世界上的第一台电子计算机ENIAC每秒钟能够完成约5000次浮点运算。随着时间的推移虽然对数值运算仍然是计算机日常工作中最为重要的事情之一但是今天的计算机处理得更多的数据都是以文本信息的方式存在的而Python表示文本信息的方式我们在很早以前就说过了那就是字符串类型。所谓**字符串**,就是由零个或多个字符组成的有限序列,一般记为![$${\displaystyle s=a_{1}a_{2}\dots a_{n}(0\leq n \leq \infty)}$$](./res/formula_1.png)。
我们可以通过下面的代码来了解字符串的使用。 我们可以通过下面的代码来了解字符串的使用。
@ -183,11 +183,11 @@ if __name__ == '__main__':
除了上面提到的生成器语法Python中还有另外一种定义生成器的方式就是通过`yield`关键字将一个普通函数改造成生成器函数。下面的代码演示了如何实现一个生成[斐波拉切数列](https://zh.wikipedia.org/wiki/%E6%96%90%E6%B3%A2%E9%82%A3%E5%A5%91%E6%95%B0%E5%88%97)的生成器。所谓斐波拉切数列可以通过下面[递归](https://zh.wikipedia.org/wiki/%E9%80%92%E5%BD%92)的方法来进行定义: 除了上面提到的生成器语法Python中还有另外一种定义生成器的方式就是通过`yield`关键字将一个普通函数改造成生成器函数。下面的代码演示了如何实现一个生成[斐波拉切数列](https://zh.wikipedia.org/wiki/%E6%96%90%E6%B3%A2%E9%82%A3%E5%A5%91%E6%95%B0%E5%88%97)的生成器。所谓斐波拉切数列可以通过下面[递归](https://zh.wikipedia.org/wiki/%E9%80%92%E5%BD%92)的方法来进行定义:
$${\displaystyle F_{0}=0}$$ ![$${\displaystyle F_{0}=0}$$](./res/formula_2.png)
$${\displaystyle F_{1}=1}$$ ![$${\displaystyle F_{1}=1}$$](./res/formula_3.png)
$${\displaystyle F_{n}=F_{n-1}+F_{n-2}}({n}\geq{2})$$ ![$${\displaystyle F_{n}=F_{n-1}+F_{n-2}}({n}\geq{2})$$](./res/formula_4.png)
![](./res/fibonacci-blocks.png) ![](./res/fibonacci-blocks.png)
@ -307,7 +307,7 @@ if __name__ == '__main__':
main() main()
``` ```
> **说明**Python中允许通过一些特殊的方法来为某种类型或数据结构自定义运算符后面的章节中会讲到上面的代码中我们对集合进行运算的时候可以调用集合对象的方法也可以直接使用对应的运算符例如`&`运算符跟intersection方法的作用就是一样的但是使用运算符让代码更加直观。 > **说明** Python中允许通过一些特殊的方法来为某种类型或数据结构自定义运算符后面的章节中会讲到上面的代码中我们对集合进行运算的时候可以调用集合对象的方法也可以直接使用对应的运算符例如`&`运算符跟intersection方法的作用就是一样的但是使用运算符让代码更加直观。
### 使用字典 ### 使用字典
@ -530,7 +530,7 @@ if __name__ == '__main__':
main() main()
``` ```
> **说明**上面使用random模块的sample函数来实现从列表中选择不重复的n个元素。 > **说明** 上面使用random模块的sample函数来实现从列表中选择不重复的n个元素。
#### 综合案例2[约瑟夫环问题](https://zh.wikipedia.org/wiki/%E7%BA%A6%E7%91%9F%E5%A4%AB%E6%96%AF%E9%97%AE%E9%A2%98) #### 综合案例2[约瑟夫环问题](https://zh.wikipedia.org/wiki/%E7%BA%A6%E7%91%9F%E5%A4%AB%E6%96%AF%E9%97%AE%E9%A2%98)
@ -609,4 +609,4 @@ if __name__ == '__main__':
main() main()
``` ```
>**说明**最后这个案例来自[《Python编程快速上手:让繁琐工作自动化》](https://item.jd.com/11943853.html)一书这本书对有编程基础想迅速使用Python将日常工作自动化的人来说还是不错的选择对代码做了一点点的调整。 >**说明** 最后这个案例来自[《Python编程快速上手:让繁琐工作自动化》](https://item.jd.com/11943853.html)一书这本书对有编程基础想迅速使用Python将日常工作自动化的人来说还是不错的选择对代码做了一点点的调整。

View File

@ -8,13 +8,13 @@
![](./res/oop-zhihu.png) ![](./res/oop-zhihu.png)
> **说明**以上的内容来自于网络,不代表作者本人的观点和看法,与作者本人立场无关,相关责任不由作者承担。 > **说明** 以上的内容来自于网络,不代表作者本人的观点和看法,与作者本人立场无关,相关责任不由作者承担。
之前我们说过“程序是指令的集合”我们在程序中书写的语句在执行时会变成一条或多条指令然后由CPU去执行。当然为了简化程序的设计我们引入了函数的概念把相对独立且经常重复使用的代码放置到函数中在需要使用这些功能的时候只要调用函数即可如果一个函数的功能过于复杂和臃肿我们又可以进一步将函数继续切分为子函数来降低系统的复杂性。但是说了这么多不知道大家是否发现所谓编程就是程序员按照计算机的工作方式控制计算机完成各种任务。但是计算机的工作方式与正常人类的思维模式是不同的如果编程就必须得抛弃人类正常的思维方式去迎合计算机编程的乐趣就少了很多“每个人都应该学习编程”这样的豪言壮语就只能说说而已。当然这些还不是最重要的最重要的是当我们需要开发一个复杂的系统时代码的复杂性会让开发和维护工作都变得举步维艰所以在上世纪60年代末期“[软件危机](https://zh.wikipedia.org/wiki/%E8%BD%AF%E4%BB%B6%E5%8D%B1%E6%9C%BA)”、“[软件工程](https://zh.wikipedia.org/wiki/%E8%BD%AF%E4%BB%B6%E5%B7%A5%E7%A8%8B)”等一系列的概念开始在行业中出现。 之前我们说过“程序是指令的集合”我们在程序中书写的语句在执行时会变成一条或多条指令然后由CPU去执行。当然为了简化程序的设计我们引入了函数的概念把相对独立且经常重复使用的代码放置到函数中在需要使用这些功能的时候只要调用函数即可如果一个函数的功能过于复杂和臃肿我们又可以进一步将函数继续切分为子函数来降低系统的复杂性。但是说了这么多不知道大家是否发现所谓编程就是程序员按照计算机的工作方式控制计算机完成各种任务。但是计算机的工作方式与正常人类的思维模式是不同的如果编程就必须得抛弃人类正常的思维方式去迎合计算机编程的乐趣就少了很多“每个人都应该学习编程”这样的豪言壮语就只能说说而已。当然这些还不是最重要的最重要的是当我们需要开发一个复杂的系统时代码的复杂性会让开发和维护工作都变得举步维艰所以在上世纪60年代末期“[软件危机](https://zh.wikipedia.org/wiki/%E8%BD%AF%E4%BB%B6%E5%8D%B1%E6%9C%BA)”、“[软件工程](https://zh.wikipedia.org/wiki/%E8%BD%AF%E4%BB%B6%E5%B7%A5%E7%A8%8B)”等一系列的概念开始在行业中出现。
当然,程序员圈子内的人都知道,现实中并没有解决上面所说的这些问题的“[银弹](https://zh.wikipedia.org/wiki/%E6%B2%A1%E6%9C%89%E9%93%B6%E5%BC%B9)”真正让软件开发者看到希望的是上世纪70年代诞生的[Smalltalk](https://zh.wikipedia.org/wiki/Smalltalk)编程语言中引入的面向对象的编程思想(面向对象编程的雏形可以追溯到更早期的[Simula](https://zh.wikipedia.org/wiki/Simula)语言)。按照这种编程理念,程序中的数据和操作数据的函数是一个逻辑上的整体,我们称之为“对象”,而我们解决问题的方式就是创建出需要的对象并向对象发出各种各样的消息,多个对象的协同工作最终可以让我们构造出复杂的系统来解决现实中的问题。 当然,程序员圈子内的人都知道,现实中并没有解决上面所说的这些问题的“[银弹](https://zh.wikipedia.org/wiki/%E6%B2%A1%E6%9C%89%E9%93%B6%E5%BC%B9)”真正让软件开发者看到希望的是上世纪70年代诞生的[Smalltalk](https://zh.wikipedia.org/wiki/Smalltalk)编程语言中引入的面向对象的编程思想(面向对象编程的雏形可以追溯到更早期的[Simula](https://zh.wikipedia.org/wiki/Simula)语言)。按照这种编程理念,程序中的数据和操作数据的函数是一个逻辑上的整体,我们称之为“对象”,而我们解决问题的方式就是创建出需要的对象并向对象发出各种各样的消息,多个对象的协同工作最终可以让我们构造出复杂的系统来解决现实中的问题。
> **说明**当然面向对象也不是解决软件开发中所有问题的最后的“银弹”所以今天的高级程序设计语言几乎都提供了对多种编程范式的支持Python也不例外。 > **说明** 当然面向对象也不是解决软件开发中所有问题的最后的“银弹”所以今天的高级程序设计语言几乎都提供了对多种编程范式的支持Python也不例外。
### 类和对象 ### 类和对象
@ -44,10 +44,10 @@ class Student(object):
if self.age < 18: if self.age < 18:
print('%s只能观看《熊出没》.' % self.name) print('%s只能观看《熊出没》.' % self.name)
else: else:
print('%s正在观看岛国爱情动作片.' % self.name print('%s正在观看岛国爱情动作片.' % self.name)
``` ```
> **说明**写在类中的函数,我们通常称之为(对象的)方法,这些方法就是对象可以接收的消息。 > **说明** 写在类中的函数,我们通常称之为(对象的)方法,这些方法就是对象可以接收的消息。
### 创建和使用对象 ### 创建和使用对象
@ -237,4 +237,4 @@ if __name__ == '__main__':
main() main()
``` ```
> **说明**本章中的插图来自于Grady Booch等著作的[《面向对象分析与设计》](https://item.jd.com/20476561918.html)一书,该书是讲解面向对象编程的经典著作,有兴趣的读者可以购买和阅读这本书来了解更多的面向对象的相关知识。 > **说明** 本章中的插图来自于Grady Booch等著作的[《面向对象分析与设计》](https://item.jd.com/20476561918.html)一书,该书是讲解面向对象编程的经典著作,有兴趣的读者可以购买和阅读这本书来了解更多的面向对象的相关知识。

View File

@ -636,7 +636,7 @@ if __name__ == '__main__':
main() main()
``` ```
>**说明**大家可以自己尝试在上面代码的基础上写一个简单的扑克游戏例如21点(Black Jack),游戏的规则可以自己在网上找一找。 >**说明** 大家可以自己尝试在上面代码的基础上写一个简单的扑克游戏例如21点(Black Jack),游戏的规则可以自己在网上找一找。
#### 案例3工资结算系统 #### 案例3工资结算系统

View File

@ -174,14 +174,14 @@ if __name__ == '__main__':
```JSON ```JSON
{ {
'name': '骆昊', "name": "骆昊",
'age': 38, "age": 38,
'qq': 957658, "qq": 957658,
'friends': ['王大锤', '白元芳'], "friends": ["王大锤", "白元芳"],
'cars': [ "cars": [
{'brand': 'BYD', 'max_speed': 180}, {"brand": "BYD", "max_speed": 180},
{'brand': 'Audi', 'max_speed': 280}, {"brand": "Audi", "max_speed": 280},
{'brand': 'Benz', 'max_speed': 320} {"brand": "Benz", "max_speed": 320}
] ]
} }
``` ```

View File

@ -32,7 +32,7 @@
| \| | 分支 | foo\|bar | 可以匹配foo或者bar | | \| | 分支 | foo\|bar | 可以匹配foo或者bar |
| (?#) | 注释 | | | | (?#) | 注释 | | |
| (exp) | 匹配exp并捕获到自动命名的组中 | | | | (exp) | 匹配exp并捕获到自动命名的组中 | | |
| (?&lt;name&gt;exp) | 匹配exp并捕获到名为name的组中 | | | | (?&nbsp;&lt;name&gt;exp) | 匹配exp并捕获到名为name的组中 | | |
| (?:exp) | 匹配exp但是不捕获匹配的文本 | | | | (?:exp) | 匹配exp但是不捕获匹配的文本 | | |
| (?=exp) | 匹配exp前面的位置 | \\b\\w+(?=ing) | 可以匹配I'm dancing中的danc | | (?=exp) | 匹配exp前面的位置 | \\b\\w+(?=ing) | 可以匹配I'm dancing中的danc |
| (?<=exp) | 匹配exp后面的位置 | (?<=\\bdanc)\\w+\\b | 可以匹配I love dancing and reading中的第一个ing | | (?<=exp) | 匹配exp后面的位置 | (?<=\\bdanc)\\w+\\b | 可以匹配I love dancing and reading中的第一个ing |
@ -98,7 +98,7 @@ if __name__ == '__main__':
main() main()
``` ```
> **提示**上面在书写正则表达式时使用了“原始字符串”的写法在字符串前面加上了r所谓“原始字符串”就是字符串中的每个字符都是它原始的意义说得更直接一点就是字符串中没有所谓的转义字符啦。因为正则表达式中有很多元字符和需要进行转义的地方如果不使用原始字符串就需要将反斜杠写作\\\\,例如表示数字的\\d得书写成\\\\d这样不仅写起来不方便阅读的时候也会很吃力。 > **提示** 上面在书写正则表达式时使用了“原始字符串”的写法在字符串前面加上了r所谓“原始字符串”就是字符串中的每个字符都是它原始的意义说得更直接一点就是字符串中没有所谓的转义字符啦。因为正则表达式中有很多元字符和需要进行转义的地方如果不使用原始字符串就需要将反斜杠写作\\\\,例如表示数字的\\d得书写成\\\\d这样不仅写起来不方便阅读的时候也会很吃力。
#### 例子2从一段文字中提取出国内手机号码。 #### 例子2从一段文字中提取出国内手机号码。
@ -136,7 +136,7 @@ if __name__ == '__main__':
main() main()
``` ```
> **说明**上面匹配国内手机号的正则表达式并不够好因为像14开头的号码只有145或147而上面的正则表达式并没有考虑这种情况要匹配国内手机号更好的正则表达式的写法是`(?<=\D)(1[38]\d{9}|14[57]\d{8}|15[0-35-9]\d{8}|17[678]\d{8})(?=\D)`国内最近好像有19和16开头的手机号了但是这个暂时不在我们考虑之列。 > **说明** 上面匹配国内手机号的正则表达式并不够好因为像14开头的号码只有145或147而上面的正则表达式并没有考虑这种情况要匹配国内手机号更好的正则表达式的写法是`(?<=\D)(1[38]\d{9}|14[57]\d{8}|15[0-35-9]\d{8}|17[678]\d{8})(?=\D)`国内最近好像有19和16开头的手机号了但是这个暂时不在我们考虑之列。
#### 例子3替换字符串中的不良内容 #### 例子3替换字符串中的不良内容
@ -155,7 +155,7 @@ if __name__ == '__main__':
main() main()
``` ```
> **说明**re模块的正则表达式相关函数中都有一个flags参数它代表了正则表达式的匹配标记可以通过该标记来指定匹配时是否忽略大小写、是否进行多行匹配、是否显示调试信息等。如果需要为flags参数指定多个值可以使用[按位或运算符](http://www.runoob.com/python/python-operators.html#ysf5)进行叠加,如`flags=re.I | re.M`。 > **说明** re模块的正则表达式相关函数中都有一个flags参数它代表了正则表达式的匹配标记可以通过该标记来指定匹配时是否忽略大小写、是否进行多行匹配、是否显示调试信息等。如果需要为flags参数指定多个值可以使用[按位或运算符](http://www.runoob.com/python/python-operators.html#ysf5)进行叠加,如`flags=re.I | re.M`。
#### 例子4拆分长字符串 #### 例子4拆分长字符串

View File

@ -70,9 +70,9 @@ JSON的例子
```JSON ```JSON
{ {
'from': 'Alice', "from": "Alice",
'to': 'Bob', "to": "Bob",
'content': 'Will you marry me?' "content": "Will you marry me?"
} }
``` ```
@ -291,7 +291,7 @@ if __name__ == '__main__':
在这个案例中我们使用了JSON作为数据传输的格式通过JSON格式对传输的数据进行了序列化和反序列化的操作但是JSON并不能携带二进制数据因此对图片的二进制数据进行了Base64编码的处理。Base64是一种用64个字符表示所有二进制数据的编码方式通过将二进制数据每6位一组的方式重新组织刚好可以使用0~9的数字、大小写字母以及“+”和“/”总共64个字符表示从`000000`到`111111`的64种状态。[维基百科](https://zh.wikipedia.org/wiki/Base64)上有关于Base64编码的详细讲解不熟悉Base64的读者可以自行阅读。 在这个案例中我们使用了JSON作为数据传输的格式通过JSON格式对传输的数据进行了序列化和反序列化的操作但是JSON并不能携带二进制数据因此对图片的二进制数据进行了Base64编码的处理。Base64是一种用64个字符表示所有二进制数据的编码方式通过将二进制数据每6位一组的方式重新组织刚好可以使用0~9的数字、大小写字母以及“+”和“/”总共64个字符表示从`000000`到`111111`的64种状态。[维基百科](https://zh.wikipedia.org/wiki/Base64)上有关于Base64编码的详细讲解不熟悉Base64的读者可以自行阅读。
> **说明**上面的代码主要为了讲解网络编程的相关内容因此并没有对异常状况进行处理,请读者自行添加异常处理代码来增强程序的健壮性。 > **说明** 上面的代码主要为了讲解网络编程的相关内容因此并没有对异常状况进行处理,请读者自行添加异常处理代码来增强程序的健壮性。
#### UDP套接字 #### UDP套接字