Commit b0818796 authored by jackfrued's avatar jackfrued

开始更新语言基础部分的文档

parent 21bdcc26
...@@ -10,7 +10,7 @@ ...@@ -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表示大版本号,一般当整体重写,或出现不向后兼容的改变时,增加A;B表示功能更新,出现新功能时增加B;C表示小的改动(如修复了某个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表示大版本号,一般当整体重写,或出现不向后兼容的改变时,增加A;B表示功能更新,出现新功能时增加B;C表示小的改动(例如:修复了某个Bug),只要有修改就增加C。如果对Python的历史感兴趣,可以阅读名为[《Python简史》](http://www.cnblogs.com/vamei/archive/2013/02/06/2892628.html)的博文。
#### Python的优缺点 #### Python的优缺点
...@@ -38,7 +38,9 @@ Python的缺点主要集中在以下几点。 ...@@ -38,7 +38,9 @@ Python的缺点主要集中在以下几点。
#### Windows环境 #### Windows环境
可以在[Python官方网站](https://www.python.org)下载到Python的Windows安装程序(exe文件),需要注意的是如果在Windows 7环境下安装Python 3.x,需要先安装Service Pack 1补丁包(可以通过一些工具软件自动安装系统补丁的功能来安装),安装过程建议勾选“Add Python 3.6 to PATH”(将Python 3.6添加到PATH环境变量)并选择自定义安装,在设置“Optional Features”界面最好将“pip”、“tcl/tk”、“Python test suite”等项全部勾选上。强烈建议使用自定义的安装路径并保证路径中没有中文。安装完成会看到“Setup was successful”的提示。如果稍后运行Python程序时,出现因为缺失一些动态链接库文件而导致Python解释器无法工作的问题,可以按照后面说的方法加以解决。如果系统显示api-ms-win-crt\*.dll文件缺失,可以参照[《api-ms-win-crt\*.dll缺失原因分析和解决方法》]()一文讲解的方法进行处理或者直接在[微软官网](https://www.microsoft.com/zh-cn/download/details.aspx?id=48145)下载Visual C++ Redistributable for Visual Studio 2015文件进行修复;如果是因为更新Windows的DirectX之后导致某些动态链接库文件缺失问题,可以下载一个DirectX修复工具进行修复。 可以在[Python官方网站](https://www.python.org)下载到Python的Windows安装程序(exe文件),需要注意的是如果在Windows 7环境下安装Python 3.x,需要先安装Service Pack 1补丁包(可以通过一些工具软件自动安装系统补丁的功能来安装),安装过程建议勾选“Add Python 3.x to PATH”(将Python 3.x添加到PATH环境变量)并选择自定义安装,在设置“Optional Features”界面最好将“pip”、“tcl/tk”、“Python test suite”等项全部勾选上。强烈建议选择自定义的安装路径并保证路径中没有中文。安装完成会看到“Setup was successful”的提示。如果稍后运行Python程序时,出现因为缺失一些动态链接库文件而导致Python解释器无法工作的问题,可以按照下面的方法加以解决。
如果系统显示api-ms-win-crt\*.dll文件缺失,可以参照[《api-ms-win-crt\*.dll缺失原因分析和解决方法》](<https://zhuanlan.zhihu.com/p/32087135>)一文讲解的方法进行处理或者直接在[微软官网](https://www.microsoft.com/zh-cn/download/details.aspx?id=48145)下载Visual C++ Redistributable for Visual Studio 2015文件进行修复;如果是因为更新Windows的DirectX之后导致某些动态链接库文件缺失问题,可以下载一个[DirectX修复工具](<https://dl.pconline.com.cn/download/360074-1.html>)进行修复。
#### Linux环境 #### Linux环境
...@@ -81,6 +83,8 @@ export PATH=$PATH:/usr/local/python37/bin ...@@ -81,6 +83,8 @@ export PATH=$PATH:/usr/local/python37/bin
# ... 此处省略下面的代码 ... # ... 此处省略下面的代码 ...
``` ```
激活环境变量。
```Shell ```Shell
source .bash_profile source .bash_profile
``` ```
...@@ -115,7 +119,7 @@ print(sys.version) ...@@ -115,7 +119,7 @@ print(sys.version)
#### 编写Python源代码 #### 编写Python源代码
可以用文本编辑工具(推荐使用Sublime、TextMate、Visual Studio Code等高级文本编辑工具)编写Python源代码并用py作为后缀名保存该文件,代码内容如下所示。 可以用文本编辑工具(推荐使用[Sublime](<https://www.sublimetext.com/>)[Atom](<https://atom.io/>)[Visual Studio Code](<https://code.visualstudio.com/>)等高级文本编辑工具)编写Python源代码并用py作为后缀名保存该文件,代码内容如下所示。
```Python ```Python
print('hello, world!') print('hello, world!')
...@@ -206,7 +210,7 @@ jupyter notebook ...@@ -206,7 +210,7 @@ jupyter notebook
![](./res/python-jupyter-2.png) ![](./res/python-jupyter-2.png)
#### Sublime - 文本编辑神 #### Sublime / Visual Studio Code - 高级文本编辑
![](./res/python-sublime.png) ![](./res/python-sublime.png)
...@@ -238,7 +242,7 @@ jupyter notebook ...@@ -238,7 +242,7 @@ jupyter notebook
- Python PEP8 Autoformat - PEP8规范自动格式化插件。 - Python PEP8 Autoformat - PEP8规范自动格式化插件。
- ConvertToUTF8 - 将本地编码转换为UTF-8。 - ConvertToUTF8 - 将本地编码转换为UTF-8。
> 说明:事实上Visual Studio Code可能是更好的选择,它不用花钱并提供了更为完整和强大的功能。 > 说明:事实上Visual Studio Code可能是更好的选择,它不用花钱并提供了更为完整和强大的功能,有兴趣的读者可以自行研究
#### PyCharm - Python开发神器 #### PyCharm - Python开发神器
...@@ -256,25 +260,6 @@ PyCharm的安装、配置和使用在[《玩转PyCharm》](../玩转PyCharm.md) ...@@ -256,25 +260,6 @@ PyCharm的安装、配置和使用在[《玩转PyCharm》](../玩转PyCharm.md)
> 说明:当前键入上面的命令后会在交互式环境中看到如下所示的输出,这段内容被称为“Python之禅”,里面讲述的道理不仅仅适用于Python,也适用于其他编程语言。 > 说明:当前键入上面的命令后会在交互式环境中看到如下所示的输出,这段内容被称为“Python之禅”,里面讲述的道理不仅仅适用于Python,也适用于其他编程语言。
> >
> Beautiful is better than ugly.
> Explicit is better than implicit.
> Simple is better than complex.
> Complex is better than complicated.
> Flat is better than nested.
> Sparse is better than dense.
> Readability counts.
> Special cases aren't special enough to break the rules.
> Although practicality beats purity.
> Errors should never pass silently.
> Unless explicitly silenced.
> In the face of ambiguity, refuse the temptation to guess.
> There should be one-- and preferably only one --obvious way to do it.
> Although that way may not be obvious at first unless you're Dutch.
> Now is better than never.
> Although never is often better than \*right\* now.
> If the implementation is hard to explain, it's a bad idea.
> If the implementation is easy to explain, it may be a good idea.
> Namespaces are one honking great idea -- let's do more of those!
2. 学习使用turtle在屏幕上绘制图形。 2. 学习使用turtle在屏幕上绘制图形。
......
...@@ -2,7 +2,9 @@ ...@@ -2,7 +2,9 @@
#### 指令和程序 #### 指令和程序
计算机的硬件系统通常由五大部件构成,包括:运算器、控制器、存储器、输入设备和输出设备。其中,运算器和控制器放在一起就是我们通常所说的中央处理器,它的功能是执行各种运算和控制指令以及处理计算机软件中的数据。我们通常所说的程序实际上就是指令的集合,我们程序就是将一系列的指令按照某种方式组织到一起,然后通过这些指令去控制计算机做我们想让它做的事情。今天我们使用的计算机虽然器件做工越来越精密,处理能力越来越强大,但究其本质来说仍然属于[“冯·诺依曼结构”](https://zh.wikipedia.org/wiki/%E5%86%AF%C2%B7%E8%AF%BA%E4%BC%8A%E6%9B%BC%E7%BB%93%E6%9E%84)的计算机。“冯·诺依曼结构”有两个关键点,一是指出要将存储设备与中央处理器分开,二是提出了将数据以二进制方式编码。二进制是一种“逢二进一”的计数法,跟我们人类使用的“逢十进一”的计数法没有实质性的区别,人类因为有十根手指所以使用了十进制(因为在数数时十根手指用完之后就只能进位了,当然凡事都有例外,玛雅人可能是因为长年光着脚的原因把脚趾头也算上了,于是他们使用了二十进制的计数法,在这种计数法的指导下玛雅人的历法就与我们平常使用的历法不一样,而按照玛雅人的历法,2012年是上一个所谓的“太阳纪”的最后一年,而2013年则是新的“太阳纪”的开始,后来这件事情被以讹传讹的方式误传为”2012年是玛雅人预言的世界末日“这种荒诞的说法,今天我们可以大胆的猜测,玛雅文明之所以发展缓慢估计也与使用了二十进制有关)。对于计算机来说,二进制在物理器件上来说是最容易实现的(高电压表示1,低电压表示0),于是在“冯·诺依曼结构”的计算机都使用了二进制。虽然我们并不需要每个程序员都能够使用二进制的思维方式来工作,但是了解二进制以及它与我们生活中的十进制之间的转换关系,以及二进制与八进制和十六进制的转换关系还是有必要的。如果你对这一点不熟悉,可以自行使用[维基百科](https://zh.wikipedia.org/wiki/%E4%BA%8C%E8%BF%9B%E5%88%B6)或者[百度百科](https://baike.baidu.com)科普一下。 计算机的硬件系统通常由五大部件构成,包括:运算器、控制器、存储器、输入设备和输出设备。其中,运算器和控制器放在一起就是我们通常所说的中央处理器,它的功能是执行各种运算和控制指令以及处理计算机软件中的数据。我们通常所说的程序实际上就是指令的集合,我们程序就是将一系列的指令按照某种方式组织到一起,然后通过这些指令去控制计算机做我们想让它做的事情。今天我们大多数时候使用的计算机,虽然它们的元器件做工越来越精密,处理能力越来越强大,但究其本质来说仍然属于[“冯·诺依曼结构”](https://zh.wikipedia.org/wiki/%E5%86%AF%C2%B7%E8%AF%BA%E4%BC%8A%E6%9B%BC%E7%BB%93%E6%9E%84)的计算机。“冯·诺依曼结构”有两个关键点,一是指出要将存储设备与中央处理器分开,二是提出了将数据以二进制方式编码。二进制是一种“逢二进一”的计数法,跟我们人类使用的“逢十进一”的计数法没有实质性的区别,人类因为有十根手指所以使用了十进制(因为在数数时十根手指用完之后就只能进位了,当然凡事都有例外,玛雅人可能是因为长年光着脚的原因把脚趾头也算上了,于是他们使用了二十进制的计数法,在这种计数法的指导下玛雅人的历法就与我们平常使用的历法不一样,而按照玛雅人的历法,2012年是上一个所谓的“太阳纪”的最后一年,而2013年则是新的“太阳纪”的开始,后来这件事情被以讹传讹的方式误传为”2012年是玛雅人预言的世界末日“这种荒诞的说法,今天我们可以大胆的猜测,玛雅文明之所以发展缓慢估计也与使用了二十进制有关)。对于计算机来说,二进制在物理器件上来说是最容易实现的(高电压表示1,低电压表示0),于是在“冯·诺依曼结构”的计算机都使用了二进制。虽然我们并不需要每个程序员都能够使用二进制的思维方式来工作,但是了解二进制以及它与我们生活中的十进制之间的转换关系,以及二进制与八进制和十六进制的转换关系还是有必要的。如果你对这一点不熟悉,可以自行使用[维基百科](https://zh.wikipedia.org/wiki/%E4%BA%8C%E8%BF%9B%E5%88%B6)或者[百度百科](https://baike.baidu.com)科普一下。
> 提示:近期关于**量子计算机**的研究已经被推倒了风口浪尖,量子计算机基于量子力学进行运算,使用量子瞬移的方式来传递信息。2018年6月,Intel宣布开发出新款量子芯片并通过了在接近绝对零度环境下的测试;2019年1月,IBM向全世界发布了首款商业化量子计算机。
### 变量和类型 ### 变量和类型
...@@ -54,7 +56,7 @@ print(a ** b) ...@@ -54,7 +56,7 @@ print(a ** b)
```Python ```Python
""" """
使用input函数输入 使用input()函数获取键盘输入
使用int()进行类型转换 使用int()进行类型转换
用占位符格式化输出的字符串 用占位符格式化输出的字符串
...@@ -121,7 +123,7 @@ Python支持多种运算符,下表大致按照优先级从高到低的顺序 ...@@ -121,7 +123,7 @@ Python支持多种运算符,下表大致按照优先级从高到低的顺序
| `is` `is not` | 身份运算符 | | `is` `is not` | 身份运算符 |
| `in` `not in` | 成员运算符 | | `in` `not in` | 成员运算符 |
| `not` `or` `and` | 逻辑运算符 | | `not` `or` `and` | 逻辑运算符 |
| `=` `+=` `-=` `*=` `/=` `%=` `//=` `**=` `&=` `\|=` `^=` `>>=` `<<=` | (复合)赋值运算符 | | `=` `+=` `-=` `*=` `/=` `%=` `//=` `**=` `&=` `|=` `^=` `>>=` `<<=` | (复合)赋值运算符 |
>**说明:** 在实际开发中,如果搞不清楚运算符的优先级,可以使用括号来确保运算的执行顺序。 >**说明:** 在实际开发中,如果搞不清楚运算符的优先级,可以使用括号来确保运算的执行顺序。
......
## 分支结构 ## 分支结构
### 分支结构的应用场景 ### 应用场景
迄今为止,我们写的Python代码都是一条一条语句顺序执行,这种结构的代码我们称之为顺序结构。然而仅有顺序结构并不能解决所有的问题,比如我们设计一个游戏,游戏第一关的通关条件是玩家获得1000分,那么在完成本局游戏后我们要根据玩家得到分数来决定究竟是进入第二关还是告诉玩家“Game Over”,这里就会产生两个分支,而且这两个分支只有一个会被执行,这就是程序中分支结构。类似的场景还有很多,给大家一分钟的时间,你应该可以想到至少5个以上这样的例子,赶紧试一试。 迄今为止,我们写的Python代码都是一条一条语句顺序执行,这种代码结构通常称之为顺序结构。然而仅有顺序结构并不能解决所有的问题,比如我们设计一个游戏,游戏第一关的通关条件是玩家获得1000分,那么在完成本局游戏后,我们要根据玩家得到分数来决定究竟是进入第二关,还是告诉玩家“Game Over”,这里就会产生两个分支,而且这两个分支只有一个会被执行。类似的场景还有很多,我们将这种结构称之为“分支结构”或“选择结构”。给大家一分钟的时间,你应该可以想到至少5个以上这样的例子,赶紧试一试。
### if语句的使用 ### if语句的使用
在Python中,要构造分支结构可以使用`if``elif``else`关键字。所谓关键字就是有特殊含义的单词,像`if``else`就是专门用于构造分支结构的关键字,很显然你不能够使用它作为变量名(事实上,用作其他的标识符也是不可以)。下面的例子中演示了如何构造一个分支结构。 在Python中,要构造分支结构可以使用`if``elif``else`关键字。所谓**关键字**就是有特殊含义的单词,像`if``else`就是专门用于构造分支结构的关键字,很显然你不能够使用它作为变量名(事实上,用作其他的标识符也是不可以)。下面的例子中演示了如何构造一个分支结构。
```Python ```Python
""" """
...@@ -79,7 +79,7 @@ else: ...@@ -79,7 +79,7 @@ else:
print('f(%.2f) = %.2f' % (x, y)) print('f(%.2f) = %.2f' % (x, y))
``` ```
> **说明:** 大家可以自己感受一下这两种写法到底是哪一种更好。在之前我们提到的Python之禅中有这么一句话“Flat is better than nested.”,之所以提出这个观点是因为嵌套结构的嵌套层次多了之后会严重的影响代码的可读性,如果可以使用扁平化的结构就不要去用嵌套,因此之前的写法是更好的做法 > **说明:** 大家可以自己感受一下这两种写法到底是哪一种更好。在之前我们提到的Python之禅中有这么一句话“Flat is better than nested.”,之所以提倡代码“扁平化”是因为嵌套结构的嵌套层次多了之后会严重的影响代码的可读性,所以能使用扁平化的结构时就不要使用嵌套
### 练习 ### 练习
......
## 循环结构 ## 循环结构
### 循环结构的应用场景 ### 应用场景
如果在程序中我们需要重复的执行某条或某些指令,例如用程序控制机器人踢足球,如果机器人持球而且还没有进入射门范围,那么我们就要一直发出让机器人向球门方向奔跑的指令。当然你可能已经注意到了,刚才的描述中其实不仅仅有需要重复的动作,还有我们上一个章节讲到的分支结构。再举一个简单的例子,比如在我们的程序中要实现每隔1秒中在屏幕上打印一个&quot;hello, world&quot;这样的字符串并持续一个小时,我们肯定不能够将`print('hello, world')`这句代码写上3600遍,如果真的需要这样做那么编程的工作就太无聊了。因此,我们需要了解一下循环结构,有了循环结构我们就可以轻松的控制某件事或者某些事重复、重复、再重复的发生。在Python中构造循环结构有两种做法,一种是`for-in`循环,一种是`while`循环。 如果在程序中我们需要重复的执行某条或某些指令,例如用程序控制机器人踢足球,如果机器人持球而且还没有进入射门范围,那么我们就要一直发出让机器人向球门方向奔跑的指令。当然你可能已经注意到了,刚才的描述中其实不仅仅有需要重复的动作,还有我们上一个章节讲到的分支结构。再举一个简单的例子,比如在我们的程序中要实现每隔1秒中在屏幕上打印一个&quot;hello, world&quot;这样的字符串并持续一个小时,我们肯定不能够将`print('hello, world')`这句代码写上3600遍,如果真的需要这样做,那么编程的工作就太无聊了。因此,我们还需要了解一下循环结构,有了循环结构我们就可以轻松的控制某件事或者某些事重复、重复、再重复的去执行。
在Python中构造循环结构有两种做法,一种是`for-in`循环,一种是`while`循环。
### for-in循环 ### for-in循环
如果明确的知道循环执行的次数或者是要对一个容器进行迭代(后面会讲到),那么我们推荐使用`for-in`循环,例如下面代码中计算![$\sum_{n=1}^{100}n$](./res/formula_2.png) 如果明确的知道循环执行的次数或者要对一个容器进行迭代(后面会讲到),那么我们推荐使用`for-in`循环,例如下面代码中计算1~100求和的结果($\displaystyle \sum \limits_{n=1}^{100}n$)。
```Python ```Python
""" """
...@@ -63,7 +65,7 @@ print(sum) ...@@ -63,7 +65,7 @@ print(sum)
### while循环 ### while循环
如果要构造不知道具体循环次数的循环结构,我们推荐使用`while`循环`while`循环通过一个能够产生或转换出`bool`值的表达式来控制循环,表达式的值为`True`循环继续,表达式的值为`False`循环结束。下面我们通过一个“猜数字”的小游戏(计算机出一个1~100之间的随机数,人输入自己猜的数字,计算机给出对应的提示信息,直到人猜出计算机出的数字)来看看如何使用`while`循环。 如果要构造不知道具体循环次数的循环结构,我们推荐使用`while`循环`while`循环通过一个能够产生或转换出`bool`值的表达式来控制循环,表达式的值为`True`循环继续,表达式的值为`False`循环结束。下面我们通过一个“猜数字”的小游戏(计算机出一个1~100之间的随机数,人输入自己猜的数字,计算机给出对应的提示信息,直到人猜出计算机出的数字)来看看如何使用`while`循环。
```Python ```Python
""" """
......
## 构造程序逻辑 ## 构造程序逻辑
> 说明:第05天内容请参考code目录下Day05中的代码。
### 练习清单 ### 练习清单
1. 寻找[“水仙花数”](https://baike.baidu.com/item/%E6%B0%B4%E4%BB%99%E8%8A%B1%E6%95%B0) 1. 寻找[“水仙花数”](https://baike.baidu.com/item/%E6%B0%B4%E4%BB%99%E8%8A%B1%E6%95%B0)
......
## 前后端分离开发 ## 前后端分离开发入门
在传统的Web应用开发中,大多数的程序员会将浏览器作为前后端的分界线。将浏览器中为用户进行页面展示的部分称之为前端,而将运行在服务器,为前端提供业务逻辑和数据准备的所有代码统称为后端。所谓前后端分离的开发,就是前后端工程师约定好数据交互接口,并行的进行开发和测试,后端只提供数据,不负责将数据渲染到页面上,前端通过HTTP请求获取数据并负责将数据渲染到页面上,这个工作是交给浏览器中的JavaScript代码来完成。 在传统的Web应用开发中,大多数的程序员会将浏览器作为前后端的分界线。将浏览器中为用户进行页面展示的部分称之为前端,而将运行在服务器,为前端提供业务逻辑和数据准备的所有代码统称为后端。所谓前后端分离的开发,就是前后端工程师约定好数据交互接口,并行的进行开发和测试,后端只提供数据,不负责将数据渲染到页面上,前端通过HTTP请求获取数据并负责将数据渲染到页面上,这个工作是交给浏览器中的JavaScript代码来完成。
......
...@@ -22,8 +22,6 @@ ...@@ -22,8 +22,6 @@
![](./res/tesseract.gif) ![](./res/tesseract.gif)
#### 改善OCR
#### 处理更复杂的验证码 #### 处理更复杂的验证码
......
...@@ -32,5 +32,5 @@ PEP 8倡导用不同的命名风格来命名Python中不同的标识符,以便 ...@@ -32,5 +32,5 @@ PEP 8倡导用不同的命名风格来命名Python中不同的标识符,以便
3. <u>就算`if`分支、`for`循环、`except`异常捕获等中只有一行代码,也不要将代码和`if``for``except`等写在一起,分开写才会让代码更清晰。</u> 3. <u>就算`if`分支、`for`循环、`except`异常捕获等中只有一行代码,也不要将代码和`if``for``except`等写在一起,分开写才会让代码更清晰。</u>
4. <u>`import`语句总是放在文件开头的地方。</u> 4. <u>`import`语句总是放在文件开头的地方。</u>
5. <u>引入模块的时候,`from math import sqrt``import math`更好。</u> 5. <u>引入模块的时候,`from math import sqrt``import math`更好。</u>
6. <u>如果有多个`import`语句,应该将其分为三部分,从上到下分别是Python标准模块、第三方模块和自定义模块,每个部分内部应该按照模块名称的字母表顺序来排列。</u> 6. <u>如果有多个`import`语句,应该将其分为三部分,从上到下分别是Python**标准模块****第三方模块****自定义模块**,每个部分内部应该按照模块名称的**字母表顺序**来排列。</u>
## Zen of Python(Python之禅)
Beautiful is better than ugly. (优美比丑陋好)
Explicit is better than implicit.(清晰比晦涩好)
Simple is better than complex.(简单比复杂好)
Complex is better than complicated.(复杂比错综复杂好)
Flat is better than nested.(扁平比嵌套好)
Sparse is better than dense.(稀疏比密集好)
Readability counts.(可读性很重要)
Special cases aren't special enough to break the rules.(特殊情况也不应该违反这些规则)
Although practicality beats purity.(但现实往往并不那么完美)
Errors should never pass silently.(异常不应该被静默处理)
Unless explicitly silenced.(除非你希望如此)
In the face of ambiguity, refuse the temptation to guess.(遇到模棱两可的地方,不要胡乱猜测)
There should be one-- and preferably only one --obvious way to do it.(肯定有一种通常也是唯一一种最佳的解决方案)
Although that way may not be obvious at first unless you're Dutch.(虽然这种方案并不是显而易见的,因为你不是那个荷兰人^这里指的是Python之父Guido^)
Now is better than never.(现在开始做比不做好)
Although never is often better than \*right\* now.(不做比盲目去做好^极限编程中的YAGNI原则^)
If the implementation is hard to explain, it's a bad idea.(如果一个实现方案难于理解,它就不是一个好的方案)
If the implementation is easy to explain, it may be a good idea.(如果一个实现方案易于理解,它很有可能是一个好的方案)
Namespaces are one honking great idea -- let's do more of those!(命名空间非常有用,我们应当多加利用)
\ No newline at end of file
...@@ -268,7 +268,7 @@ ...@@ -268,7 +268,7 @@
- Django框架内置的中间件 - Django框架内置的中间件
- 自定义中间件及其应用场景 - 自定义中间件及其应用场景
#### Day48 - [前后端分离开发](./Day41-55/48.前后端分离开发.md) #### Day48 - [前后端分离开发入门](./Day41-55/48.前后端分离开发入门.md)
- 返回JSON格式的数据 - 返回JSON格式的数据
- 用Vue.js渲染页面 - 用Vue.js渲染页面
......
from PIL import Image, ImageFilter
chiling = Image.open('resources/chiling.jpg')
width, height = chiling.size
chiling.show()
chiling.transpose(Image.FLIP_LEFT_RIGHT).show()
chiling.filter(ImageFilter.GaussianBlur(4)).show()
chiling.filter(ImageFilter.EMBOSS).show()
chiling.thumbnail((width // 4, height // 4))
chiling.show()
## 更新日志 ## 更新日志
### 2019年7月9日
1. 最近出差,项目一直处于停更状态。交流群的很多初学者反馈从第8天开始内容就有一定难度,最近本来也打算把语言基础部分和爬虫的部门重新整理一次,这次争取将文字和案例做得更加通俗易懂,而且更具实用性,这个事情从今天已然开始了,最终的目标是要将这部分的内容整理成一本书,希望大家到时候能够一如既往的支持。
2. 最近1周多的时间一共收到60笔以上的打赏,最多的一天收到了14笔打赏,还是要再次谢谢大家为知识付费的行为,当然加交流群是不用付费的,这些打赏费用在年底会捐赠出去,到时候会公开捐赠情况。
3. 今天重新翻译了*Zen of Python*,这次的版本我自己都比较喜欢,所以也分享给大家。
### 2019年6月30日 ### 2019年6月30日
1. 最近2天一共收到11笔打赏。 1. 最近2天一共收到11笔打赏。
...@@ -18,6 +24,6 @@ ...@@ -18,6 +24,6 @@
### 2019年6月18日 ### 2019年6月18日
1. 在朋友的建议下,给首页加了一个打赏的二维码,看看有多少愿意为知识付费。今天收到了7位小伙伴的打赏,在此表示感谢。打赏功能获得的收入在年底将全部捐赠给**绿之叶公益**[点击了解](<https://baike.baidu.com/item/%E7%BB%BF%E4%B9%8B%E5%8F%B6%E5%85%AC%E7%9B%8A>))。之前每年都会试着为这个公益组织做一些自己能做的事情,这次当然也不能例外。 1. 在朋友的建议下,给首页加了一个打赏的二维码,看看有多少愿意为知识付费。今天一共收到了7位小伙伴的打赏,在此表示感谢。打赏获得的收入在年底将全部捐赠给**绿之叶公益**[点击了解](<https://baike.baidu.com/item/%E7%BB%BF%E4%B9%8B%E5%8F%B6%E5%85%AC%E7%9B%8A>))。之前每年都会试着为这个公益组织做一些自己能做的事情,这次当然也不能例外。
2. Django部分(第41天到第55天)更新到第47天,最新上线的部分包括报表、日志、ORM查询优化以及中间件相关的内容,并将投票应用的完成代码同步到github。 2. Django部分(第41天到第55天)更新到第47天,最新上线的部分包括报表、日志、ORM查询优化以及中间件相关的内容,并将投票应用的完成代码同步到github。
...@@ -66,7 +66,7 @@ PyCharm社区版只能创建Python项目,如果项目中需要Django的支持 ...@@ -66,7 +66,7 @@ PyCharm社区版只能创建Python项目,如果项目中需要Django的支持
![](./res/pycharm-comm-django-1.png) ![](./res/pycharm-comm-django-1.png)
创建好Python项目之后,可以打开屏幕下方的终端(Terminal),并通过`pip install`安装Django项目的依赖项。 创建好Python项目之后,可以打开屏幕下方的终端(Terminal),并通过`pip install`安装Django项目的依赖项,可以通过`-i https://pypi.doubanio.com/simple`来指定下载依赖库的镜像仓库
![](./res/pycharm-comm-django-2.png) ![](./res/pycharm-comm-django-2.png)
...@@ -74,6 +74,8 @@ PyCharm社区版只能创建Python项目,如果项目中需要Django的支持 ...@@ -74,6 +74,8 @@ PyCharm社区版只能创建Python项目,如果项目中需要Django的支持
![](./res/pycharm-comm-django-7.png) ![](./res/pycharm-comm-django-7.png)
下面是搜索依赖项的界面,可以通过点击“Install Package”按钮来安装指定的依赖项;也可以通过点击“Manage Repositories”按钮来指定下载依赖项的仓库,国内用户推荐使用豆瓣镜像<http://pypi.doubanio.com/simple>
![](./res/pycharm-comm-django-8.png) ![](./res/pycharm-comm-django-8.png)
接下来可以在终端中输入`django-amdin startproject`指令来创建项目。 接下来可以在终端中输入`django-amdin startproject`指令来创建项目。
...@@ -84,7 +86,7 @@ PyCharm社区版只能创建Python项目,如果项目中需要Django的支持 ...@@ -84,7 +86,7 @@ PyCharm社区版只能创建Python项目,如果项目中需要Django的支持
![](./res/pycharm-comm-django-4.png) ![](./res/pycharm-comm-django-4.png)
在配置窗口的右侧,指定要执行的脚本路径(Django项目的manage.py文件的位置)和运行参数(runserver)。 在配置窗口的右侧,指定要执行的脚本路径(Django项目的manage.py文件的位置)和运行参数(runserver),运行参数的后面还可以跟IP地址和端口
![](./res/pycharm-comm-django-5.png) ![](./res/pycharm-comm-django-5.png)
......
## 要不要使用复杂表达式 ## 要不要使用复杂表达式
Perl语言的原作者Larry Wall曾经说过,伟大的程序员都有三个优点:懒惰、暴躁和自负。乍一看这三个词语没有一个是褒义词,但在程序员的世界里,这三个词有不同的意义。首先,懒惰会促使程序员去写一些省事儿的程序来辅助自己或别人更好的完成工作,这样我们就无需做那些重复和繁琐的劳动;同理能够用3行代码解决的事情,我们也绝不会写出10行代码来。其次,暴躁会让程序员主动的去完成一些你还没有提出的工作,去优化自己的代码让它更有效率,能够3秒钟完成的任务,我们绝不能容忍1分钟的等待。最后,自负会促使程序员写出可靠无误的代码,我们写代码不是为了接受批评和指责,而是为了让其他人来膜拜。 Perl语言的原作者*Larry Wall*曾经说过,伟大的程序员都有三个优点:懒惰、暴躁和自负。乍一看这三个词语没有一个是褒义词,但在程序员的世界里,这三个词有不同的意义。首先,懒惰会促使程序员去写一些省事儿的程序来辅助自己或别人更好的完成工作,这样我们就无需做那些重复和繁琐的劳动;同理能够用3行代码解决的事情,我们也绝不会写出10行代码来。其次,暴躁会让程序员主动的去完成一些你还没有提出的工作,去优化自己的代码让它更有效率,能够3秒钟完成的任务,我们绝不能容忍1分钟的等待。最后,自负会促使程序员写出可靠无误的代码,我们写代码不是为了接受批评和指责,而是为了让其他人来膜拜。
那么接下来就有一个很有意思的问题值得探讨一下,我们需要一个程序从输入的三个数中找出最大的那个数。这个程序对任何会编程的人来说都是小菜一碟,甚至不会编程的人经过10分钟的学习也能搞定。下面是用来解决这个问题的Python代码。 那么接下来就有一个很有意思的问题值得探讨一下,我们需要一个程序从输入的三个数中找出最大的那个数。这个程序对任何会编程的人来说都是小菜一碟,甚至不会编程的人经过10分钟的学习也能搞定。下面是用来解决这个问题的Python代码。
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment