Merge pull request #4 from jackfrued/master

20190614从原作者处更新
pull/197/head
switchchow 2019-06-14 15:12:02 +08:00 committed by GitHub
commit df7c31c2e1
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
303 changed files with 1394 additions and 5925 deletions

11
.gitignore vendored
View File

@ -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

View File

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

View File

@ -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 ShellIPython提供了更为强大的编辑和交互功能。可以通过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

View File

@ -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输入年份判断是不是闰年。

View File

@ -1,4 +1,4 @@
## Day03 - 分支结构
## 分支结构
### 分支结构的应用场景

View File

@ -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
"""

View File

@ -1,4 +1,4 @@
## 练习
## 构造程序逻辑
### 练习清单

View File

@ -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的程序来计算出这个值代码如下所示。

View File

@ -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)

View File

@ -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__':

View File

@ -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

View File

@ -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()
```

View File

@ -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!')

View File

@ -5,7 +5,6 @@ Version: 0.1
Author: 骆昊
Date: 2018-02-27
"""
import math
radius = float(input('请输入圆的半径: '))

View File

@ -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: 骆昊

View File

@ -5,7 +5,6 @@ Version: 0.1
Author: 骆昊
Date: 2018-02-28
"""
from random import randint
face = randint(1, 6)

View File

@ -6,7 +6,6 @@ Version: 0.1
Author: 骆昊
Date: 2018-02-28
"""
import math
a = float(input('a = '))

View File

@ -5,7 +5,6 @@ Version: 0.1
Author: 骆昊
Date: 2018-02-28
"""
# import getpass
# from getpass import getpass
# from getpass import *

View File

@ -5,7 +5,6 @@ Version: 0.1
Author: 骆昊
Date: 2018-03-01
"""
from math import sqrt
num = int(input('请输入一个正整数: '))

View File

@ -6,8 +6,7 @@ Author: 骆昊
Date: 2018-03-01
"""
sum = 0
num = 2
sum, num = 0, 2
while num <= 100:
sum += num
num += 2

View File

@ -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))
# 要理解程序背后的算法 - 穷举法

View File

@ -11,7 +11,6 @@ Version: 0.1
Author: 骆昊
Date: 2018-03-02
"""
from random import randint
money = 1000

View File

@ -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=' ')

View File

@ -7,7 +7,6 @@ Version: 0.1
Author: 骆昊
Date: 2018-03-02
"""
import random
answer = random.randint(1, 100)

View File

@ -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), "")
# 通过比较上面两种不同的解决方案的执行时间 意识到优化程序的重要性

View File

@ -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