commit
df7c31c2e1
|
@ -3,3 +3,14 @@ venv
|
|||
*.pyc
|
||||
__pycache__
|
||||
|
||||
### VisualStudioCode ###
|
||||
.vscode/*
|
||||
.vscode/**
|
||||
!.vscode/settings.json
|
||||
!.vscode/tasks.json
|
||||
!.vscode/launch.json
|
||||
!.vscode/extensions.json
|
||||
|
||||
### VisualStudioCode Patch ###
|
||||
# Ignore all local history of files
|
||||
.history
|
||||
|
|
|
@ -1,3 +0,0 @@
|
|||
tasks:
|
||||
- before: gp open Day01-15/Day01/code/hello.py
|
||||
command: python3 Day01-15/Day01/code/hello.py
|
|
@ -1,11 +1,11 @@
|
|||
## Day01 - 初识Python
|
||||
## 初识Python
|
||||
|
||||
### Python简介
|
||||
|
||||
#### Python的历史
|
||||
|
||||
1. 1989年圣诞节:Guido von Rossum开始写Python语言的编译器。
|
||||
2. 1991年2月:第一个Python编译器(同时也是解释器)诞生,它是用C语言实现的(后面又出现了Java和C#实现的版本Jython和IronPython,以及PyPy、Brython、Pyston等其他实现),可以调用C语言的库函数。在最早的版本中,Python已经提供了对“类”,“函数”,“异常处理”等构造块的支持,同时提供了“列表”和“字典”等核心数据类型,同时支持以模块为基础的拓展系统。
|
||||
2. 1991年2月:第一个Python编译器(同时也是解释器)诞生,它是用C语言实现的(后面又出现了Java和C#实现的版本Jython和IronPython,以及PyPy、Brython、Pyston等其他实现),可以调用C语言的库函数。在最早的版本中,Python已经提供了对“类”,“函数”,“异常处理”等构造块的支持,同时提供了“列表”和“字典”等核心数据类型,同时支持以模块为基础来构造应用程序。
|
||||
3. 1994年1月:Python 1.0正式发布。
|
||||
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版本中。
|
||||
|
@ -27,18 +27,18 @@ Python的优点很多,简单的可以总结为以下几点。
|
|||
Python的缺点主要集中在以下几点。
|
||||
|
||||
1. 执行效率稍低,因此计算密集型任务可以由C/C++编写。
|
||||
2. 代码无法加密,但是现在的公司很多都不是卖软件而是卖服务,这个问题会被淡化。
|
||||
2. 代码无法加密,但是现在很多公司都不销售卖软件而是销售服务,这个问题会被淡化。
|
||||
3. 在开发时可以选择的框架太多(如Web框架就有100多个),有选择的地方就有错误。
|
||||
|
||||
#### Python的应用领域
|
||||
|
||||
目前Python在云基础设施、DevOps、网络爬虫开发、数据分析挖掘、机器学习等领域都有着广泛的应用,因此也产生了Web后端开发、数据接口开发、自动化运维、自动化测试、科学计算和可视化、数据分析、量化交易、机器人开发、图像识别和处理等一系列的职位。
|
||||
目前Python在Web应用开发、云基础设施、DevOps、网络爬虫开发、数据分析挖掘、机器学习等领域都有着广泛的应用,因此也产生了Web后端开发、数据接口开发、自动化运维、自动化测试、科学计算和可视化、数据分析、量化交易、机器人开发、图像识别和处理等一系列的职位。
|
||||
|
||||
### 搭建编程环境
|
||||
|
||||
#### Windows环境
|
||||
|
||||
可以在[Python官方网站](https://www.python.org)下载到Python的Windows安装程序(exe文件),需要注意的是如果在Windows 7环境下安装需要先安装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缺失以及更新DirectX之后导致某些动态链接库文件缺失,前者可以参照[《api-ms-win-crt\*.dll缺失原因分析和解决方法》]()一文讲解的方法进行处理或者直接在[微软官网](https://www.microsoft.com/zh-cn/download/details.aspx?id=48145)下载Visual C++ Redistributable for Visual Studio 2015文件进行修复,后者可以下载一个DirectX修复工具进行修复。
|
||||
可以在[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修复工具进行修复。
|
||||
|
||||
#### Linux环境
|
||||
|
||||
|
@ -85,20 +85,26 @@ export PATH=$PATH:/usr/local/python37/bin
|
|||
source .bash_profile
|
||||
```
|
||||
|
||||
#### MacOS环境
|
||||
#### macOS环境
|
||||
|
||||
MacOS也是自带了Python 2.x版本的,可以通过[Python的官方网站](https://www.python.org)提供的安装文件(pkg文件)安装3.x的版本。默认安装完成后,可以通过在终端执行python命令来启动2.x版本的Python解释器,可以通过执行python3命令来启动3.x版本的Python解释器。
|
||||
macOS也自带了Python 2.x版本,可以通过[Python的官方网站](https://www.python.org)提供的安装文件(pkg文件)安装Python 3.x的版本。默认安装完成后,可以通过在终端执行python命令来启动2.x版本的Python解释器,可以通过执行python3命令来启动3.x版本的Python解释器。
|
||||
|
||||
### 从终端运行Python程序
|
||||
|
||||
#### 确认Python的版本
|
||||
|
||||
在终端或命令行提示符中键入下面的命令。
|
||||
可以Windows的命令行提示符中键入下面的命令。
|
||||
|
||||
```Shell
|
||||
python --version
|
||||
```
|
||||
当然也可以先输入python进入交互式环境,再执行以下的代码检查Python的版本。
|
||||
或者是在Linux或macOS系统的终端中键入下面的命令。
|
||||
|
||||
```Shell
|
||||
python3 --version
|
||||
```
|
||||
|
||||
当然也可以先输入python或python3进入交互式环境,再执行以下的代码检查Python的版本。
|
||||
|
||||
```Python
|
||||
import sys
|
||||
|
@ -109,7 +115,7 @@ print(sys.version)
|
|||
|
||||
#### 编写Python源代码
|
||||
|
||||
可以用文本编辑工具(推荐使用Sublime、Atom、TextMate、VSCode等高级文本编辑工具)编写Python源代码并将其命名为hello.py保存起来,代码内容如下所示。
|
||||
可以用文本编辑工具(推荐使用Sublime、TextMate、Visual Studio Code等高级文本编辑工具)编写Python源代码并用py作为后缀名保存该文件,代码内容如下所示。
|
||||
|
||||
```Python
|
||||
print('hello, world!')
|
||||
|
@ -123,6 +129,12 @@ print('hello, world!')
|
|||
python hello.py
|
||||
```
|
||||
|
||||
或
|
||||
|
||||
```Shell
|
||||
python3 hello.py
|
||||
```
|
||||
|
||||
### 代码中的注释
|
||||
|
||||
注释是编程语言的一个重要组成部分,用于在源代码中解释代码的作用从而增强程序的可读性和可维护性,当然也可以将源代码中不需要参与运行的代码段通过注释来去掉,这一点在调试程序的时候经常用到。注释在随源代码进入预处理器或编译时会被移除,不会在目标代码中保留也不会影响程序的执行结果。
|
||||
|
@ -156,32 +168,43 @@ IDLE是安装Python环境时自带的集成开发工具,如下图所示。但
|
|||
|
||||
#### IPython - 更好的交互式编程工具
|
||||
|
||||
IPython是一种基于Python的交互式解释器。相较于原生的Python Shell,IPython提供了更为强大的编辑和交互功能。可以通过Python的包管理工具pip安装IPython和Jupyter,具体的操作如下所示。
|
||||
IPython是一种基于Python的交互式解释器。相较于原生的Python交互式环境,IPython提供了更为强大的编辑和交互功能。可以通过Python的包管理工具pip安装IPython和Jupyter,具体的操作如下所示。
|
||||
|
||||
```Shell
|
||||
pip install ipython jupyter
|
||||
pip install ipython
|
||||
```
|
||||
|
||||
或者
|
||||
或
|
||||
|
||||
```Shell
|
||||
python -m pip install ipython jupyter
|
||||
pip3 install ipython
|
||||
```
|
||||
|
||||
安装成功后,可以通过下面的ipython命令启动IPython,如下图所示。
|
||||
|
||||
![](./res/python-ipython.png)
|
||||
|
||||
当然我们也可以通过Jupyter运行名为notebook的项目在浏览器窗口中进行交互式操作。
|
||||
当然,我们也可以通过安装Jupyter工具并运行名为notebook的程序在浏览器窗口中进行交互式代码编写操作。
|
||||
|
||||
```Shell
|
||||
pip install jupyter
|
||||
```
|
||||
|
||||
或
|
||||
|
||||
```Shell
|
||||
pip3 intall jupyter
|
||||
```
|
||||
|
||||
然后执行下面的命令:
|
||||
|
||||
```Shell
|
||||
jupyter notebook
|
||||
```
|
||||
|
||||
![](./res/python-jupyter-2.png)
|
||||
|
||||
#### Anaconda - 一站式的数据科学神器
|
||||
Anaconda是专注于数据科学的Python发行版本,其包含了conda、Python等190多个科学包及其依赖项。因为包含的内容较多,Anaconda的下载文件比较大,如果只需要其中一部分的包,或者需要节省带宽或存储空间,也可以使用Miniconda这个较小的发行版(仅包含conda和 Python)。对于学习数据科学的人来说,Anaconda是绝对的神器,有兴趣的读者可以阅读[《致Python初学者们 - Anaconda入门使用指南》](https://www.jianshu.com/p/169403f7e40c)一文进行了解。
|
||||
|
||||
![](./res/python-jupyter-2.png)
|
||||
|
||||
#### Sublime - 文本编辑神器
|
||||
|
||||
|
@ -215,48 +238,48 @@ Anaconda是专注于数据科学的Python发行版本,其包含了conda、Pyth
|
|||
- Python PEP8 Autoformat - PEP8规范自动格式化插件。
|
||||
- ConvertToUTF8 - 将本地编码转换为UTF-8。
|
||||
|
||||
> 说明:事实上Visual Studio Code可能是更好的选择,它不用花钱并提供了更为完整和强大的功能。
|
||||
|
||||
#### PyCharm - Python开发神器
|
||||
|
||||
PyCharm的安装、配置和使用我们在后面会进行介绍。
|
||||
PyCharm的安装、配置和使用在[《玩转PyCharm》](../玩转PyCharm.md)进行了介绍,有兴趣的读者可以选择阅读。
|
||||
|
||||
![](./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交互环境中查看下面的代码结果,并试着将这些内容翻译成中文。
|
||||
|
||||
```Python
|
||||
import this
|
||||
|
||||
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!
|
||||
```
|
||||
|
||||
> 说明:当前键入上面的命令后会在交互式环境中看到如下所示的输出,这段内容被称为“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在屏幕上绘制图形。
|
||||
|
||||
> 说明:turtle是Python内置的一个非常有趣的模块,特别适用于让小朋友体会什么是编程,它最早是Logo语言的一部分,Logo语言是Wally Feurzig和Seymour Papert在1966发明的编程语言.
|
||||
|
||||
```Python
|
||||
import turtle
|
||||
|
|
@ -1,4 +1,4 @@
|
|||
## Day02 - 语言元素
|
||||
## 语言元素
|
||||
|
||||
#### 指令和程序
|
||||
|
||||
|
@ -50,7 +50,6 @@ print(a / b)
|
|||
print(a // b)
|
||||
print(a % b)
|
||||
print(a ** b)
|
||||
|
||||
```
|
||||
|
||||
```Python
|
||||
|
@ -72,7 +71,6 @@ print('%d / %d = %f' % (a, b, a / b))
|
|||
print('%d // %d = %d' % (a, b, a // b))
|
||||
print('%d %% %d = %d' % (a, b, a % b))
|
||||
print('%d ** %d = %d' % (a, b, a ** b))
|
||||
|
||||
```
|
||||
|
||||
```Python
|
||||
|
@ -94,7 +92,6 @@ print(type(b))
|
|||
print(type(c))
|
||||
print(type(d))
|
||||
print(type(e))
|
||||
|
||||
```
|
||||
|
||||
在对变量类型进行转换时可以使用Python的内置函数(准确的说下面列出的并不是真正意义上的函数,而是后面我们要讲到的创建对象的构造方法)。
|
||||
|
@ -126,7 +123,7 @@ Python支持多种运算符,下表大致按照优先级从高到低的顺序
|
|||
| `not` `or` `and` | 逻辑运算符 |
|
||||
| `=` `+=` `-=` `*=` `/=` `%=` `//=` `**=` `&=` `\|=` `^=` `>>=` `<<=` | (复合)赋值运算符 |
|
||||
|
||||
>**说明:** 在实际开发中,如果搞不清楚优先级可以使用括号来确保运算的执行顺序。
|
||||
>**说明:** 在实际开发中,如果搞不清楚运算符的优先级,可以使用括号来确保运算的执行顺序。
|
||||
|
||||
下面的例子演示了运算符的使用。
|
||||
|
||||
|
@ -161,7 +158,6 @@ print("flag4 = ", flag4)
|
|||
print("flag5 = ", flag5)
|
||||
print(flag1 is True)
|
||||
print(flag2 is not False)
|
||||
|
||||
```
|
||||
|
||||
### 练习
|
||||
|
@ -180,7 +176,6 @@ Author: 骆昊
|
|||
f = float(input('请输入华氏温度: '))
|
||||
c = (f - 32) / 1.8
|
||||
print('%.1f华氏度 = %.1f摄氏度' % (f, c))
|
||||
|
||||
```
|
||||
|
||||
#### 练习2:输入圆的半径计算计算周长和面积。
|
||||
|
@ -200,7 +195,6 @@ perimeter = 2 * math.pi * radius
|
|||
area = math.pi * radius * radius
|
||||
print('周长: %.2f' % perimeter)
|
||||
print('面积: %.2f' % area)
|
||||
|
||||
```
|
||||
|
||||
#### 练习3:输入年份判断是不是闰年。
|
|
@ -1,4 +1,4 @@
|
|||
## Day03 - 分支结构
|
||||
## 分支结构
|
||||
|
||||
### 分支结构的应用场景
|
||||
|
|
@ -1,4 +1,4 @@
|
|||
## Day04 - 循环结构
|
||||
## 循环结构
|
||||
|
||||
### 循环结构的应用场景
|
||||
|
||||
|
@ -6,7 +6,7 @@
|
|||
|
||||
### for-in循环
|
||||
|
||||
如果明确的知道循环执行的次数或者是要对一个容器进行迭代(后面会讲到),那么我们推荐使用`for-in`循环,例如下面代码中计算![$\sum_{n=1}^{100}n$](./res/formula_1.png)。
|
||||
如果明确的知道循环执行的次数或者是要对一个容器进行迭代(后面会讲到),那么我们推荐使用`for-in`循环,例如下面代码中计算![$\sum_{n=1}^{100}n$](./res/formula_2.png)。
|
||||
|
||||
```Python
|
||||
"""
|
|
@ -1,4 +1,4 @@
|
|||
## 练习
|
||||
## 构造程序逻辑
|
||||
|
||||
### 练习清单
|
||||
|
|
@ -2,11 +2,11 @@
|
|||
|
||||
在讲解本章节的内容之前,我们先来研究一道数学题,请说出下面的方程有多少组正整数解。
|
||||
|
||||
![$$x_1 + x_2 + x_3 + x_4 = 8$$](./res/formula_1.png)
|
||||
![$$x_1 + x_2 + x_3 + x_4 = 8$$](./res/formula_3.png)
|
||||
|
||||
事实上,上面的问题等同于将8个苹果分成四组每组至少一个苹果有多少种方案。想到这一点问题的答案就呼之欲出了。
|
||||
|
||||
![$$C_M^N =\frac{M!}{N!(M-N)!}, \text{(M=7, N=3)} $$](./res/formula_2.png)
|
||||
![$$C_M^N =\frac{M!}{N!(M-N)!}, \text{(M=7, N=3)} $$](./res/formula_4.png)
|
||||
|
||||
可以用Python的程序来计算出这个值,代码如下所示。
|
||||
|
|
@ -2,7 +2,7 @@
|
|||
|
||||
### 使用字符串
|
||||
|
||||
第二次世界大战促使了现代电子计算机的诞生,当初的想法很简单,就是用计算机来计算导弹的弹道,因此在计算机刚刚诞生的那个年代,计算机处理的信息主要是数值,而世界上的第一台电子计算机ENIAC每秒钟能够完成约5000次浮点运算。随着时间的推移,虽然对数值运算仍然是计算机日常工作中最为重要的事情之一,但是今天的计算机处理得更多的数据都是以文本信息的方式存在的,而Python表示文本信息的方式我们在很早以前就说过了,那就是字符串类型。所谓**字符串**,就是由零个或多个字符组成的有限序列,一般记为![$${\displaystyle s=a_{1}a_{2}\dots a_{n}(0\leq n \leq \infty)}$$](./res/formula_1.png)。
|
||||
第二次世界大战促使了现代电子计算机的诞生,当初的想法很简单,就是用计算机来计算导弹的弹道,因此在计算机刚刚诞生的那个年代,计算机处理的信息主要是数值,而世界上的第一台电子计算机ENIAC每秒钟能够完成约5000次浮点运算。随着时间的推移,虽然对数值运算仍然是计算机日常工作中最为重要的事情之一,但是今天的计算机处理得更多的数据都是以文本信息的方式存在的,而Python表示文本信息的方式我们在很早以前就说过了,那就是字符串类型。所谓**字符串**,就是由零个或多个字符组成的有限序列,一般记为![$${\displaystyle s=a_{1}a_{2}\dots a_{n}(0\leq n \leq \infty)}$$](./res/formula_5.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)的方法来进行定义:
|
||||
|
||||
![$${\displaystyle F_{0}=0}$$](./res/formula_2.png)
|
||||
![$${\displaystyle F_{0}=0}$$](./res/formula_6.png)
|
||||
|
||||
![$${\displaystyle F_{1}=1}$$](./res/formula_3.png)
|
||||
![$${\displaystyle F_{1}=1}$$](./res/formula_7.png)
|
||||
|
||||
![$${\displaystyle F_{n}=F_{n-1}+F_{n-2}}({n}\geq{2})$$](./res/formula_4.png)
|
||||
![$${\displaystyle F_{n}=F_{n-1}+F_{n-2}}({n}\geq{2})$$](./res/formula_8.png)
|
||||
|
||||
![](./res/fibonacci-blocks.png)
|
||||
|
|
@ -39,12 +39,12 @@ class Student(object):
|
|||
print('%s正在学习%s.' % (self.name, course_name))
|
||||
|
||||
# PEP 8要求标识符的名字用全小写多个单词用下划线连接
|
||||
# 但是很多程序员和公司更倾向于使用驼峰命名法(驼峰标识)
|
||||
def watch_av(self):
|
||||
# 但是部分程序员和公司更倾向于使用驼峰命名法(驼峰标识)
|
||||
def watch_movie(self):
|
||||
if self.age < 18:
|
||||
print('%s只能观看《熊出没》.' % self.name)
|
||||
else:
|
||||
print('%s正在观看岛国爱情动作片.' % self.name)
|
||||
print('%s正在观看岛国爱情大电影.' % self.name)
|
||||
```
|
||||
|
||||
> **说明:** 写在类中的函数,我们通常称之为(对象的)方法,这些方法就是对象可以接收的消息。
|
||||
|
@ -60,10 +60,10 @@ def main():
|
|||
# 给对象发study消息
|
||||
stu1.study('Python程序设计')
|
||||
# 给对象发watch_av消息
|
||||
stu1.watch_av()
|
||||
stu1.watch_movie()
|
||||
stu2 = Student('王大锤', 15)
|
||||
stu2.study('思想品德')
|
||||
stu2.watch_av()
|
||||
stu2.watch_movie()
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
|
@ -297,3 +297,123 @@ if __name__ == '__main__':
|
|||
|
||||
传输层除了有可靠的传输协议TCP之外,还有一种非常轻便的传输协议叫做用户数据报协议,简称UDP。TCP和UDP都是提供端到端传输服务的协议,二者的差别就如同打电话和发短信的区别,后者不对传输的可靠性和可达性做出任何承诺从而避免了TCP中握手和重传的开销,所以在强调性能和而不是数据完整性的场景中(例如传输网络音视频数据),UDP可能是更好的选择。可能大家会注意到一个现象,就是在观看网络视频时,有时会出现卡顿,有时会出现花屏,这无非就是部分数据传丢或传错造成的。在Python中也可以使用UDP套接字来创建网络应用,对此我们不进行赘述,有兴趣的读者可以自行研究。
|
||||
|
||||
### 网络应用开发
|
||||
|
||||
#### 发送电子邮件
|
||||
|
||||
在即时通信软件如此发达的今天,电子邮件仍然是互联网上使用最为广泛的应用之一,公司向应聘者发出录用通知、网站向用户发送一个激活账号的链接、银行向客户推广它们的理财产品等几乎都是通过电子邮件来完成的,而这些任务应该都是由程序自动完成的。
|
||||
|
||||
就像我们可以用HTTP(超文本传输协议)来访问一个网站一样,发送邮件要使用SMTP(简单邮件传输协议),SMTP也是一个建立在TCP(传输控制协议)提供的可靠数据传输服务的基础上的应用级协议,它规定了邮件的发送者如何跟发送邮件的服务器进行通信的细节,而Python中的smtplib模块将这些操作简化成了几个简单的函数。
|
||||
|
||||
下面的代码演示了如何在Python发送邮件。
|
||||
|
||||
```Python
|
||||
from smtplib import SMTP
|
||||
from email.header import Header
|
||||
from email.mime.text import MIMEText
|
||||
|
||||
|
||||
def main():
|
||||
# 请自行修改下面的邮件发送者和接收者
|
||||
sender = 'abcdefg@126.com'
|
||||
receivers = ['uvwxyz@qq.com', 'uvwxyz@126.com']
|
||||
message = MIMEText('用Python发送邮件的示例代码.', 'plain', 'utf-8')
|
||||
message['From'] = Header('王大锤', 'utf-8')
|
||||
message['To'] = Header('骆昊', 'utf-8')
|
||||
message['Subject'] = Header('示例代码实验邮件', 'utf-8')
|
||||
smtper = SMTP('smtp.126.com')
|
||||
# 请自行修改下面的登录口令
|
||||
smtper.login(sender, 'secretpass')
|
||||
smtper.sendmail(sender, receivers, message.as_string())
|
||||
print('邮件发送完成!')
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
main()
|
||||
```
|
||||
|
||||
如果要发送带有附件的邮件,那么可以按照下面的方式进行操作。
|
||||
|
||||
```Python
|
||||
from smtplib import SMTP
|
||||
from email.header import Header
|
||||
from email.mime.text import MIMEText
|
||||
from email.mime.image import MIMEImage
|
||||
from email.mime.multipart import MIMEMultipart
|
||||
|
||||
import urllib
|
||||
|
||||
|
||||
def main():
|
||||
# 创建一个带附件的邮件消息对象
|
||||
message = MIMEMultipart()
|
||||
|
||||
# 创建文本内容
|
||||
text_content = MIMEText('附件中有本月数据请查收', 'plain', 'utf-8')
|
||||
message['Subject'] = Header('本月数据', 'utf-8')
|
||||
# 将文本内容添加到邮件消息对象中
|
||||
message.attach(text_content)
|
||||
|
||||
# 读取文件并将文件作为附件添加到邮件消息对象中
|
||||
with open('/Users/Hao/Desktop/hello.txt', 'rb') as f:
|
||||
txt = MIMEText(f.read(), 'base64', 'utf-8')
|
||||
txt['Content-Type'] = 'text/plain'
|
||||
txt['Content-Disposition'] = 'attachment; filename=hello.txt'
|
||||
message.attach(txt)
|
||||
# 读取文件并将文件作为附件添加到邮件消息对象中
|
||||
with open('/Users/Hao/Desktop/汇总数据.xlsx', 'rb') as f:
|
||||
xls = MIMEText(f.read(), 'base64', 'utf-8')
|
||||
xls['Content-Type'] = 'application/vnd.ms-excel'
|
||||
xls['Content-Disposition'] = 'attachment; filename=month-data.xlsx'
|
||||
message.attach(xls)
|
||||
|
||||
# 创建SMTP对象
|
||||
smtper = SMTP('smtp.126.com')
|
||||
# 开启安全连接
|
||||
# smtper.starttls()
|
||||
sender = 'abcdefg@126.com'
|
||||
receivers = ['uvwxyz@qq.com']
|
||||
# 登录到SMTP服务器
|
||||
# 请注意此处不是使用密码而是邮件客户端授权码进行登录
|
||||
# 对此有疑问的读者可以联系自己使用的邮件服务器客服
|
||||
smtper.login(sender, 'secretpass')
|
||||
# 发送邮件
|
||||
smtper.sendmail(sender, receivers, message.as_string())
|
||||
# 与邮件服务器断开连接
|
||||
smtper.quit()
|
||||
print('发送完成!')
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
main()
|
||||
```
|
||||
|
||||
#### 发送短信
|
||||
|
||||
发送短信也是项目中常见的功能,网站的注册码、验证码、营销信息基本上都是通过短信来发送给用户的。在下面的代码中我们使用了[互亿无线](http://www.ihuyi.com/)短信平台(该平台为注册用户提供了50条免费短信以及常用开发语言发送短信的demo,可以登录该网站并在用户自服务页面中对短信进行配置)提供的API接口实现了发送短信的服务,当然国内的短信平台很多,读者可以根据自己的需要进行选择(通常会考虑费用预算、短信达到率、使用的难易程度等指标),如果需要在商业项目中使用短信服务建议购买短信平台提供的套餐服务。
|
||||
|
||||
```Python
|
||||
import urllib.parse
|
||||
import http.client
|
||||
import json
|
||||
|
||||
|
||||
def main():
|
||||
host = "106.ihuyi.com"
|
||||
sms_send_uri = "/webservice/sms.php?method=Submit"
|
||||
# 下面的参数需要填入自己注册的账号和对应的密码
|
||||
params = urllib.parse.urlencode({'account': '你自己的账号', 'password' : '你自己的密码', 'content': '您的验证码是:147258。请不要把验证码泄露给其他人。', 'mobile': '接收者的手机号', 'format':'json' })
|
||||
print(params)
|
||||
headers = {'Content-type': 'application/x-www-form-urlencoded', 'Accept': 'text/plain'}
|
||||
conn = http.client.HTTPConnection(host, port=80, timeout=30)
|
||||
conn.request('POST', sms_send_uri, params, headers)
|
||||
response = conn.getresponse()
|
||||
response_str = response.read()
|
||||
jsonstr = response_str.decode('utf-8')
|
||||
print(json.loads(jsonstr))
|
||||
conn.close()
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
main()
|
||||
```
|
File diff suppressed because one or more lines are too long
|
@ -1,121 +0,0 @@
|
|||
## 网络应用开发
|
||||
|
||||
### 发送电子邮件
|
||||
|
||||
在即时通信软件如此发达的今天,电子邮件仍然是互联网上使用最为广泛的应用之一,公司向应聘者发出录用通知、网站向用户发送一个激活账号的链接、银行向客户推广它们的理财产品等几乎都是通过电子邮件来完成的,而这些任务应该都是由程序自动完成的。
|
||||
|
||||
就像我们可以用HTTP(超文本传输协议)来访问一个网站一样,发送邮件要使用SMTP(简单邮件传输协议),SMTP也是一个建立在TCP(传输控制协议)提供的可靠数据传输服务的基础上的应用级协议,它规定了邮件的发送者如何跟发送邮件的服务器进行通信的细节,而Python中的smtplib模块将这些操作简化成了几个简单的函数。
|
||||
|
||||
下面的代码演示了如何在Python发送邮件。
|
||||
|
||||
```Python
|
||||
from smtplib import SMTP
|
||||
from email.header import Header
|
||||
from email.mime.text import MIMEText
|
||||
|
||||
|
||||
def main():
|
||||
# 请自行修改下面的邮件发送者和接收者
|
||||
sender = 'abcdefg@126.com'
|
||||
receivers = ['uvwxyz@qq.com', 'uvwxyz@126.com']
|
||||
message = MIMEText('用Python发送邮件的示例代码.', 'plain', 'utf-8')
|
||||
message['From'] = Header('王大锤', 'utf-8')
|
||||
message['To'] = Header('骆昊', 'utf-8')
|
||||
message['Subject'] = Header('示例代码实验邮件', 'utf-8')
|
||||
smtper = SMTP('smtp.126.com')
|
||||
# 请自行修改下面的登录口令
|
||||
smtper.login(sender, 'secretpass')
|
||||
smtper.sendmail(sender, receivers, message.as_string())
|
||||
print('邮件发送完成!')
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
main()
|
||||
```
|
||||
|
||||
如果要发送带有附件的邮件,那么可以按照下面的方式进行操作。
|
||||
|
||||
```Python
|
||||
from smtplib import SMTP
|
||||
from email.header import Header
|
||||
from email.mime.text import MIMEText
|
||||
from email.mime.image import MIMEImage
|
||||
from email.mime.multipart import MIMEMultipart
|
||||
|
||||
import urllib
|
||||
|
||||
|
||||
def main():
|
||||
# 创建一个带附件的邮件消息对象
|
||||
message = MIMEMultipart()
|
||||
|
||||
# 创建文本内容
|
||||
text_content = MIMEText('附件中有本月数据请查收', 'plain', 'utf-8')
|
||||
message['Subject'] = Header('本月数据', 'utf-8')
|
||||
# 将文本内容添加到邮件消息对象中
|
||||
message.attach(text_content)
|
||||
|
||||
# 读取文件并将文件作为附件添加到邮件消息对象中
|
||||
with open('/Users/Hao/Desktop/hello.txt', 'rb') as f:
|
||||
txt = MIMEText(f.read(), 'base64', 'utf-8')
|
||||
txt['Content-Type'] = 'text/plain'
|
||||
txt['Content-Disposition'] = 'attachment; filename=hello.txt'
|
||||
message.attach(txt)
|
||||
# 读取文件并将文件作为附件添加到邮件消息对象中
|
||||
with open('/Users/Hao/Desktop/汇总数据.xlsx', 'rb') as f:
|
||||
xls = MIMEText(f.read(), 'base64', 'utf-8')
|
||||
xls['Content-Type'] = 'application/vnd.ms-excel'
|
||||
xls['Content-Disposition'] = 'attachment; filename=month-data.xlsx'
|
||||
message.attach(xls)
|
||||
|
||||
# 创建SMTP对象
|
||||
smtper = SMTP('smtp.126.com')
|
||||
# 开启安全连接
|
||||
# smtper.starttls()
|
||||
sender = 'abcdefg@126.com'
|
||||
receivers = ['uvwxyz@qq.com']
|
||||
# 登录到SMTP服务器
|
||||
# 请注意此处不是使用密码而是邮件客户端授权码进行登录
|
||||
# 对此有疑问的读者可以联系自己使用的邮件服务器客服
|
||||
smtper.login(sender, 'secretpass')
|
||||
# 发送邮件
|
||||
smtper.sendmail(sender, receivers, message.as_string())
|
||||
# 与邮件服务器断开连接
|
||||
smtper.quit()
|
||||
print('发送完成!')
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
main()
|
||||
```
|
||||
|
||||
### 发送短信
|
||||
|
||||
发送短信也是项目中常见的功能,网站的注册码、验证码、营销信息基本上都是通过短信来发送给用户的。在下面的代码中我们使用了[互亿无线](http://www.ihuyi.com/)短信平台(该平台为注册用户提供了50条免费短信以及常用开发语言发送短信的demo,可以登录该网站并在用户自服务页面中对短信进行配置)提供的API接口实现了发送短信的服务,当然国内的短信平台很多,读者可以根据自己的需要进行选择(通常会考虑费用预算、短信达到率、使用的难易程度等指标),如果需要在商业项目中使用短信服务建议购买短信平台提供的套餐服务。
|
||||
|
||||
```Python
|
||||
import urllib.parse
|
||||
import http.client
|
||||
import json
|
||||
|
||||
|
||||
def main():
|
||||
host = "106.ihuyi.com"
|
||||
sms_send_uri = "/webservice/sms.php?method=Submit"
|
||||
# 下面的参数需要填入自己注册的账号和对应的密码
|
||||
params = urllib.parse.urlencode({'account': '你自己的账号', 'password' : '你自己的密码', 'content': '您的验证码是:147258。请不要把验证码泄露给其他人。', 'mobile': '接收者的手机号', 'format':'json' })
|
||||
print(params)
|
||||
headers = {'Content-type': 'application/x-www-form-urlencoded', 'Accept': 'text/plain'}
|
||||
conn = http.client.HTTPConnection(host, port=80, timeout=30)
|
||||
conn.request('POST', sms_send_uri, params, headers)
|
||||
response = conn.getresponse()
|
||||
response_str = response.read()
|
||||
jsonstr = response_str.decode('utf-8')
|
||||
print(json.loads(jsonstr))
|
||||
conn.close()
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
main()
|
||||
```
|
||||
|
|
@ -6,8 +6,13 @@ Version: 0.1
|
|||
Author: 骆昊
|
||||
Date: 2018-02-26
|
||||
|
||||
请将该文件命名为hello.py并在终端中通过下面的命令运行它
|
||||
请将该文件命名为hello.py
|
||||
|
||||
使用Windows的小伙伴可以在命令行提示下通过下面的命令运行该程序
|
||||
python hello.py
|
||||
|
||||
对于使用Linux或macOS的小伙伴可以打开终端并键入下面的命令来运行程序
|
||||
python3 hello.py
|
||||
"""
|
||||
|
||||
print('hello, world!')
|
|
@ -5,7 +5,6 @@ Version: 0.1
|
|||
Author: 骆昊
|
||||
Date: 2018-02-27
|
||||
"""
|
||||
|
||||
import math
|
||||
|
||||
radius = float(input('请输入圆的半径: '))
|
|
@ -1,10 +1,10 @@
|
|||
"""
|
||||
百分制成绩转等级制成绩
|
||||
90分以上 --> A
|
||||
80分~89分 --> B
|
||||
70分~79分 --> C
|
||||
60分~69分 --> D
|
||||
60分以下 --> E
|
||||
90分以上,输出A
|
||||
80分~89分,输出B
|
||||
70分~79分,输出C
|
||||
60分~69分,输出D
|
||||
60分以下,输出E
|
||||
|
||||
Version: 0.1
|
||||
Author: 骆昊
|
|
@ -5,7 +5,6 @@ Version: 0.1
|
|||
Author: 骆昊
|
||||
Date: 2018-02-28
|
||||
"""
|
||||
|
||||
from random import randint
|
||||
|
||||
face = randint(1, 6)
|
|
@ -6,7 +6,6 @@ Version: 0.1
|
|||
Author: 骆昊
|
||||
Date: 2018-02-28
|
||||
"""
|
||||
|
||||
import math
|
||||
|
||||
a = float(input('a = '))
|
|
@ -5,7 +5,6 @@ Version: 0.1
|
|||
Author: 骆昊
|
||||
Date: 2018-02-28
|
||||
"""
|
||||
|
||||
# import getpass
|
||||
# from getpass import getpass
|
||||
# from getpass import *
|
|
@ -5,7 +5,6 @@ Version: 0.1
|
|||
Author: 骆昊
|
||||
Date: 2018-03-01
|
||||
"""
|
||||
|
||||
from math import sqrt
|
||||
|
||||
num = int(input('请输入一个正整数: '))
|
|
@ -6,8 +6,7 @@ Author: 骆昊
|
|||
Date: 2018-03-01
|
||||
"""
|
||||
|
||||
sum = 0
|
||||
num = 2
|
||||
sum, num = 0, 2
|
||||
while num <= 100:
|
||||
sum += num
|
||||
num += 2
|
|
@ -13,5 +13,3 @@ for x in range(0, 20):
|
|||
z = 100 - x - y
|
||||
if 5 * x + 3 * y + z / 3 == 100:
|
||||
print('公鸡: %d只, 母鸡: %d只, 小鸡: %d只' % (x, y, z))
|
||||
|
||||
# 要理解程序背后的算法 - 穷举法
|
|
@ -11,7 +11,6 @@ Version: 0.1
|
|||
Author: 骆昊
|
||||
Date: 2018-03-02
|
||||
"""
|
||||
|
||||
from random import randint
|
||||
|
||||
money = 1000
|
|
@ -10,5 +10,5 @@ Date: 2018-03-02
|
|||
a = 0
|
||||
b = 1
|
||||
for _ in range(20):
|
||||
(a, b) = (b, a + b)
|
||||
a, b = b, a + b
|
||||
print(a, end=' ')
|
|
@ -7,7 +7,6 @@ Version: 0.1
|
|||
Author: 骆昊
|
||||
Date: 2018-03-02
|
||||
"""
|
||||
|
||||
import random
|
||||
|
||||
answer = random.randint(1, 100)
|
|
@ -10,7 +10,6 @@ Date: 2018-03-02
|
|||
import time
|
||||
import math
|
||||
|
||||
start = time.clock()
|
||||
for num in range(1, 10000):
|
||||
sum = 0
|
||||
for factor in range(1, int(math.sqrt(num)) + 1):
|
||||
|
@ -20,7 +19,3 @@ for num in range(1, 10000):
|
|||
sum += num / factor
|
||||
if sum == num:
|
||||
print(num)
|
||||
end = time.clock()
|
||||
print("执行时间:", (end - start), "秒")
|
||||
|
||||
# 通过比较上面两种不同的解决方案的执行时间 意识到优化程序的重要性
|
|
@ -28,7 +28,7 @@ class Student(object):
|
|||
if self.age < 18:
|
||||
print('%s只能观看《熊出没》.' % self.name)
|
||||
else:
|
||||
print('%s正在观看岛国爱情动作片.' % self.name)
|
||||
print('%s正在观看岛国大电影.' % self.name)
|
||||
|
||||
|
||||
def main():
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue