修正了文档中数学公式无法显示的问题

This commit is contained in:
jackfrued 2025-02-13 22:45:22 +08:00
parent ca8f2fcbf4
commit 3f9c9e4cfa
16 changed files with 98 additions and 86 deletions

View File

@ -6,7 +6,7 @@
在 Python 中,要构造分支结构可以使用`if`、`elif`和`else`三个关键字。所谓**关键字**就是编程语言中有特殊含义的单词,像`if`和`else`就是专门用于构造分支结构的关键字,很显然你不能够使用它作为变量名。当然,我们并不是每次构造分支结构都会把三个关键字全部用上,下面我们通过例子加以说明。
我们来写一个身体质量指数BMI的计算器。身体质量质数也叫体质指数是国际上常用的衡量人体胖瘦程度以及是否健康的一个标准计算公式如下所示。通常认为$\small{18.5 \le BMI < 24}$是正常范围$\small{BMI < 18.5}$说明体重过轻$\small{BMI \ge 24}$说明体重过重$\small{BMI \ge 27}$就属于肥胖的范畴了
我们来写一个身体质量指数BMI的计算器。身体质量质数也叫体质指数是国际上常用的衡量人体胖瘦程度以及是否健康的一个标准计算公式如下所示。通常认为 $\small{18.5 \le BMI < 24}$ 是正常范围 $\small{BMI < 18.5}$ 说明体重过轻 $\small{BMI \ge 24}$ 说明体重过重 $\small{BMI \ge 27}$ 就属于肥胖的范畴了
$$
BMI = \frac{体重}{身高^{2}}
@ -31,7 +31,7 @@ if 18.5 <= bmi < 24:
> **提示**`if`语句的最后面有一个`:`,它是用英文输入法输入的冒号;程序中输入的`'`、`"`、`=`、`(`、`)`等特殊字符,都是在英文输入法状态下输入的,这一点之前已经提醒过大家了。很多初学者经常会忽略这一点,等到执行代码时,就会看到一大堆错误提示。当然,认真读一下错误提示还是很容易发现哪里出了问题,但是**强烈建议**大家在写代码的时候**切换到英文输入法**,这样可以避免很多不必要的麻烦。
上面的代码中,我们在计算和输出 BMI 之后,加上了一段分支结构,如果满足$\small{18.5 \le BMI < 24}$程序会输出你的身材很棒!”,但是如果不满足条件这段输出就没有了这就是我们上面说的代码有不同的执行路径有些代码不一定会执行到我们在`if`关键字的后面给出了一个表达式`18.5 <= bmi < 24`之前我们说过关系运算会产生布尔值如果`if`后面的布尔值为`True`那么`if`语句下方有四个空格缩进的`print('你的身材很棒')`就会被执行我们先输入几组数据运行上面的代码如下所示
上面的代码中,我们在计算和输出 BMI 之后,加上了一段分支结构,如果满足 $\small{18.5 \le BMI < 24}$ 程序会输出你的身材很棒!”,但是如果不满足条件这段输出就没有了这就是我们上面说的代码有不同的执行路径有些代码不一定会执行到我们在`if`关键字的后面给出了一个表达式`18.5 <= bmi < 24`之前我们说过关系运算会产生布尔值如果`if`后面的布尔值为`True`那么`if`语句下方有四个空格缩进的`print('你的身材很棒')`就会被执行我们先输入几组数据运行上面的代码如下所示
第一组输入:
@ -83,7 +83,7 @@ class Test {
> **说明**:上面就是 BMI 计算器1.0版本对应的Java代码欢迎在评论区吐槽它。
接下来,我们对上面的代码稍作修改,在 BMI 不满足$\small{18.5 \le BMI < 24}$的情况下也给出相信的提示信息我们可以在`if`代码块的后面增加一个`else`代码块它会在`if`语句给出的条件没有达成时执行如下所示很显然`if`下面的`print('你的身材很棒')``else`下面的`print('你的身材不够标准哟')`只有一个会被执行到
接下来,我们对上面的代码稍作修改,在 BMI 不满足 $\small{18.5 \le BMI < 24}$ 的情况下也给出相信的提示信息我们可以在`if`代码块的后面增加一个`else`代码块它会在`if`语句给出的条件没有达成时执行如下所示很显然`if`下面的`print('你的身材很棒')``else`下面的`print('你的身材不够标准哟')`只有一个会被执行到
```python
"""
@ -229,6 +229,7 @@ print('状态码描述:', description)
#### 例子1分段函数求值
有如下所示的分段函数,要求输入`x`,计算出`y`。
$$
y = \begin{cases} 3x - 5, & (x \gt 1) \\ x + 2, & (-1 \le x \le 1) \\ 5x + 3, & (x \lt -1) \end{cases}
$$
@ -319,8 +320,9 @@ if a + b > c and a + c > b and b + c > a:
else:
print('不能构成三角形')
```
> **说明:** 上面的`if` 条件表示任意两边之和大于第三边,这是构成三角形的必要条件。当这个条件成立时,我们要计算并输出周长和面积,所以`if`下方有五条语句都保持了相同的缩进,它们是一个整体,只要`if`条件成立,它们都会被执行,这就是我们之前提到的代码块的概念。另外,上面计算三角形面积的公式叫做海伦公式,假设有一个三角形,边长分别为$\small{a}$、$\small{b}$、$\small{c}$,那么三角的面积$\small{A}$可以由下面的公式得到,其中,$\small{s=\frac{a+b+c}{2}}$。
>$$
> **说明:** 上面的`if` 条件表示任意两边之和大于第三边,这是构成三角形的必要条件。当这个条件成立时,我们要计算并输出周长和面积,所以`if`下方有五条语句都保持了相同的缩进,它们是一个整体,只要`if`条件成立,它们都会被执行,这就是我们之前提到的代码块的概念。另外,上面计算三角形面积的公式叫做海伦公式,假设有一个三角形,边长分别为 $\small{a}$ 、 $\small{b}$ 、 $\small{c}$ ,那么三角的面积 $\small{A}$ 可以由下面的公式得到,其中, $\small{s=\frac{a+b+c}{2}}$ 。
>
> $$
> A = \sqrt{s(s-a)(s-b)(s-c)}
> $$
>

View File

@ -58,7 +58,7 @@ for _ in range(3600):
<img src="res/day06/terminate_program.png" style="zoom:40%;">
下面,我们用`for-in`循环实现从1到100的整数求和即$\small{\sum_{n=1}^{100}n}$。
下面,我们用`for-in`循环实现从1到100的整数求和 $\small{\sum_{n=1}^{100}{n}}$
```python
"""
@ -237,7 +237,7 @@ for i in range(1, 10):
要求输入一个大于1的正整数判断它是不是素数。
> **提示**素数指的是只能被1和自身整除的大于1的整数。例如对于正整数`n`,我们可以通过在`2`到`n-1`之间寻找有没有`n`的因子,来判断它到底是不是一个素数。当然,循环不用从`2`开始到`n-1`结束因为对于大于1的正整数因子应该都是成对出现的所以循环到$\small{\sqrt{n}}$就可以结束了。
> **提示**素数指的是只能被1和自身整除的大于1的整数。例如对于正整数`n`,我们可以通过在`2`到`n-1`之间寻找有没有`n`的因子,来判断它到底是不是一个素数。当然,循环不用从`2`开始到`n-1`结束因为对于大于1的正整数因子应该都是成对出现的所以循环到 $\small{\sqrt{n}}$ 就可以结束了。
```python
"""

View File

@ -49,7 +49,7 @@ for _ in range(20):
要求:找出`100`到`999`范围内的所有水仙花数。
> **提示**在数论中水仙花数narcissistic number也被称为超完全数字不变数、自恋数、自幂数、阿姆斯特朗数它是一个$\small{N}$位非负整数,其各位数字的$\small{N}$次方和刚好等于该数本身,例如:$\small{153=1^3+5^3+3^3}$,所以`153` 是一个水仙花数;$\small{1634=1^4+6^4+3^4+4^4}$,所以`1634`也是一个水仙花数。对于三位数解题的关键是将它拆分为个位、十位、百位再判断是否满足水仙花数的要求这一点利用Python中的`//`和`%`运算符其实很容易做到。
> **提示**在数论中水仙花数narcissistic number也被称为超完全数字不变数、自恋数、自幂数、阿姆斯特朗数它是一个 $\small{N}$ 位非负整数,其各位数字的 $\small{N}$ 次方和刚好等于该数本身,例如: $\small{153=1^3+5^3+3^3}$ ,所以`153` 是一个水仙花数; $\small{1634=1^4+6^4+3^4+4^4}$ ,所以`1634`也是一个水仙花数。对于三位数解题的关键是将它拆分为个位、十位、百位再判断是否满足水仙花数的要求这一点利用Python中的`//`和`%`运算符其实很容易做到。
```python
"""

View File

@ -9,9 +9,11 @@
### 字符串的定义
所谓**字符串**,就是**由零个或多个字符组成的有限序列**,一般记为:
$$
s = a_1a_2 \cdots a_n \,\,\,\,\, (0 \le n \le \infty)
$$
在 Python 程序中我们把单个或多个字符用单引号或者双引号包围起来就可以表示一个字符串。字符串中的字符可以是特殊符号、英文字母、中文字符、日文的平假名或片假名、希腊字母、Emoji 字符(如:💩、🐷、🀄️)等。
```python

View File

@ -108,7 +108,7 @@ print(set2) # {2, 4}
#### 比较运算
两个集合可以用`==`和`!=`进行相等性判断,如果两个集合中的元素完全相同,那么`==`比较的结果就是`True`,否则就是`False`。如果集合`A`的任意一个元素都是集合`B`的元素,那么集合`A`称为集合`B`的子集,即对于$\small{\forall{a} \in {A}}$,均有$\small{{a} \in {B}}$,则$\small{{A} \subseteq {B}}$`A`是`B`的子集,反过来也可以称`B`是`A`的超集。如果`A`是`B`的子集且`A`不等于`B`,那么`A`就是`B`的真子集。Python 为集合类型提供了判断子集和超集的运算符,其实就是我们非常熟悉的`<`、`<=`、`>`、`>=`这些运算符。当然,我们也可以通过集合类型的方法`issubset`和`issuperset`来判断集合之间的关系,代码如下所示。
两个集合可以用`==`和`!=`进行相等性判断,如果两个集合中的元素完全相同,那么`==`比较的结果就是`True`,否则就是`False`。如果集合`A`的任意一个元素都是集合`B`的元素,那么集合`A`称为集合`B`的子集,即对于 $\small{\forall{a} \in {A}}$ ,均有 $\small{{a} \in {B}}$ ,则 $\small{{A} \subseteq {B}}$ `A`是`B`的子集,反过来也可以称`B`是`A`的超集。如果`A`是`B`的子集且`A`不等于`B`,那么`A`就是`B`的真子集。Python 为集合类型提供了判断子集和超集的运算符,其实就是我们非常熟悉的`<`、`<=`、`>`、`>=`这些运算符。当然,我们也可以通过集合类型的方法`issubset`和`issuperset`来判断集合之间的关系,代码如下所示。
```python
set1 = {1, 3, 5}

View File

@ -1,17 +1,18 @@
## 函数和模块
在讲解本节课的内容之前,我们先来研究一道数学题,请说出下面的方程有多少组正整数解。
$$
x_1 + x_2 + x_3 + x_4 = 8
x_{1} + x_{2} + x_{3} + x_{4} = 8
$$
你可能已经想到了这个问题其实等同于将8个苹果分成四组且每组至少一个苹果有多少种方案也等价于在分隔8个苹果的7个间隙之间放入三个隔断将苹果分成四组有多少种方案所以答案是$ C_7^3=35 $,其中,$C_{7}^{3}$代表7选3的组合数其计算公式如下所示。
你可能已经想到了这个问题其实等同于将8个苹果分成四组且每组至少一个苹果有多少种方案也等价于在分隔8个苹果的7个间隙之间放入三个隔断将苹果分成四组有多少种方案所以答案是 $ C_{7}^{3}=35$ ,其中, $C_{7}^{3}$ 代表7选3的组合数其计算公式如下所示。
$$
C_m^n = \frac {m!} {n!(m-n)!}
$$
根据之前学习的知识,我们可以用循环做累乘的方式分别计算出$m!$、$n!$和$(m-n)!$,然后再通过除法运算得到组合数$C_m^n$,代码如下所示。
根据之前学习的知识,我们可以用循环做累乘的方式分别计算出 $\small{m!}$ 、 $\small{n!}$ 和 $\small{(m-n)!}$ ,然后再通过除法运算得到组合数 $C_{m}^{n}$ ,代码如下所示。
```python
"""
@ -52,11 +53,11 @@ n = 3
35
```
不知大家是否注意到,上面的代码中我们做了三次求阶乘的操作,虽然$m$、$n$、$m - n$的值各不相同,但是三段代码并没有实质性的区别,属于重复代码。世界级的编程大师*Martin Fowler*曾经说过:“**代码有很多种坏味道,重复是最坏的一种!**”。要写出高质量的代码,首先就要解决重复代码的问题。对于上面的代码来说,我们可以将求阶乘的功能封装到一个称为“函数”的代码块中,在需要计算阶乘的地方,我们只需“调用函数”即可实现对求阶乘功能的复用。
不知大家是否注意到,上面的代码中我们做了三次求阶乘的操作,虽然 $\small{m}$ $\small{n}$ $\small{m - n}$ 的值各不相同,但是三段代码并没有实质性的区别,属于重复代码。世界级的编程大师*Martin Fowler*曾经说过:“**代码有很多种坏味道,重复是最坏的一种!**”。要写出高质量的代码,首先就要解决重复代码的问题。对于上面的代码来说,我们可以将求阶乘的功能封装到一个称为“函数”的代码块中,在需要计算阶乘的地方,我们只需“调用函数”即可实现对求阶乘功能的复用。
### 定义函数
数学上的函数通常形如$y = f(x)$或者$z = g(x, y)$这样的形式,在$y = f(x)$中,$f$是函数的名字,$x$是函数的自变量,$y$是函数的因变量;而在$z = g(x, y)$中,$g$是函数名,$x$和$y$是函数的自变量,$z$是函数的因变量。Python 中的函数跟这个结构是一致的,每个函数都有自己的名字、自变量和因变量。我们通常把 Python 函数的自变量称为函数的参数,而因变量称为函数的返回值。
数学上的函数通常形如 $\small{y = f(x)}$ 或者 $\small{z = g(x, y)}$ 这样的形式,在 $\small{y = f(x)}$ 中, $\small{f}$ 是函数的名字, $\small{x}$ 是函数的自变量, $\small{y}$ 是函数的因变量;而在 $\small{z = g(x, y)}$ 中, $\small{g}$ 是函数名, $\small{x}$ $\small{y}$ 是函数的自变量, $\small{z}$ 是函数的因变量。Python 中的函数跟这个结构是一致的,每个函数都有自己的名字、自变量和因变量。我们通常把 Python 函数的自变量称为函数的参数,而因变量称为函数的返回值。
Python 中可以使用`def`关键字来定义函数,和变量一样每个函数也应该有一个漂亮的名字,命名规则跟变量的命名规则是一样的(大家赶紧想想我们之前讲过的变量的命名规则)。在函数名后面的圆括号中可以设置函数的参数,也就是我们刚才说的函数的自变量,而函数执行完成后,我们会通过`return`关键字来返回函数的执行结果,这就是我们刚才说的函数的因变量。如果函数中没有`return`语句,那么函数会返回代表空值的`None`。另外,函数也可以没有自变量(参数),但是函数名后面的圆括号是必须有的。一个函数要做的事情(要执行的代码),是通过代码缩进的方式放到函数定义行之后,跟之前分支和循环结构的代码块类似,如下图所示。

View File

@ -62,7 +62,7 @@ ReO22w
### 例子2判断素数
设计一个判断给定的大于1的正整数是不是质数的函数。质数是只能被1和自身整除的正整数大于1如果一个大于1的正整数$N$是质数那就意味着在2到$N-1$之间都没有它的因子。
设计一个判断给定的大于1的正整数是不是质数的函数。质数是只能被1和自身整除的正整数大于1如果一个大于 1 的正整数 $\small{N}$ 是质数,那就意味着在 2 $\small{N-1}$ 之间都没有它的因子。
```python
def is_prime(num: int) -> bool:
@ -79,11 +79,11 @@ def is_prime(num: int) -> bool:
> **说明1**:上面`is_prime`函数的参数`num`后面的`: int`用来标注参数的类型,虽然它对代码的执行结果不产生任何影响,但是很好的增强了代码的可读性。同理,参数列表后面的`-> bool`用来标注函数返回值的类型,它也不会对代码的执行结果产生影响,但是却让我们清楚的知道,调用函数会得到一个布尔值,要么是`True`,要么是`False`。
>
> **说明2**上面的循环并不需要从2循环到$\small{N-1}$,因为如果循环进行到$\small{\sqrt{N}}$时,还没有找到$\small{N}$的因子,那么$\small{\sqrt{N}}$之后也不会出现$\small{N}$的因子,大家可以自己想一想这是为什么。
> **说明2**:上面的循环并不需要从 2 循环到 $\small{N-1}$ ,因为如果循环进行到 $\small{\sqrt{N}}$ 时,还没有找到$\small{N}$的因子,那么 $\small{\sqrt{N}}$ 之后也不会出现 $\small{N}$ 的因子,大家可以自己想一想这是为什么。
### 例子3最大公约数和最小公倍数
设计计算两个正整数最大公约数和最小公倍数的函数。$x$和$y$的最大公约数是能够同时整除$x$和$y$的最大整数,如果$x$和$y$互质那么它们的最大公约数为1$x$和$y$的最小公倍数是能够同时被$x$和$y$整除的最小正整数,如果$x$和$y$互质,那么它们的最小公倍数为$x \times y$。需要提醒大家注意的是,计算最大公约数和最小公倍数是两个不同的功能,应该设计成两个函数,而不是把两个功能放到同一个函数中。
设计计算两个正整数最大公约数和最小公倍数的函数。 $\small{x}$ $\small{y}$ 的最大公约数是能够同时整除 $\small{x}$ $\small{y}$ 的最大整数,如果 $\small{x}$ $\small{y}$ 互质,那么它们的最大公约数为 1 $\small{x}$ $\small{y}$ 的最小公倍数是能够同时被 $\small{x}$ $\small{y}$ 整除的最小正整数,如果 $\small{x}$ $\small{y}$ 互质,那么它们的最小公倍数为 $\small{x \times y}$ 。需要提醒大家注意的是,计算最大公约数和最小公倍数是两个不同的功能,应该设计成两个函数,而不是把两个功能放到同一个函数中。
```python
def lcm(x: int, y: int) -> int:
@ -98,27 +98,34 @@ def gcd(x: int, y: int) -> int:
return x
```
> **说明1**:函数之间可以相互调用,上面求最小公倍数的`lcm`函数就调用了求最大公约数的`gcd`函数,通过$\frac{x \times y}{ gcd(x, y)}$来计算最小公倍数。
> **说明1**:函数之间可以相互调用,上面求最小公倍数的`lcm`函数就调用了求最大公约数的`gcd`函数,通过 $\frac{x \times y}{ gcd(x, y)}$ 来计算最小公倍数。
>
> **说明2**:上面的`gcd`函数使用了欧几里得算法计算最大公约数,欧几里得算法也称为辗转相除法,这个算法通常有更好的执行效率,不了解的小伙伴可以自行科普
> **说明2**:上面的`gcd`函数使用了欧几里得算法计算最大公约数,这个算法的效率非常棒
### 例子4数据统计
假设样本数据保存一个列表中,设计计算样本数据描述性统计信息的函数。描述性统计信息通常包括:算术平均值、中位数、极差(最大值和最小值的差)、方差、标准差、变异系数等,计算公式如下所示
假设样本数据保存一个列表中,设计计算样本数据描述性统计信息的函数。描述性统计信息通常包括:算术平均值、中位数、极差(最大值和最小值的差)、方差、标准差、变异系数等,计算公式如下所示
样本均值sample mean
$$
\bar{x} = \frac{\sum_{i=1}^{n}x_{i}}{n} = \frac{x_{1}+x_{2}+\cdots +x_{n}}{n}
$$
样本方差sample variance
$$
s^2 = \frac {\sum_{i=1}^{n}(x_i - \bar{x})^2} {n-1}
$$
样本标准差sample standard deviation
$$
s = \sqrt{\frac{\sum_{i=1}^{n}(x_i - \bar{x})^2}{n-1}}
$$
变异系数coefficient of sample variation
$$
CV = \frac{s}{\bar{x}}
$$
@ -170,9 +177,9 @@ def describe(data):
print(f'变异系数: {cv(data)}')
```
> **说明1**:中位数是将数据按照升序或降序排列后位于中间的数,它描述了数据的中等水平。中位数的计算分两种情况:当数据体量$n$为奇数时,中位数是位于$\frac{n + 1}{2}$位置的元素;当数据体量$n$为偶数时,中位数是位于$\frac{n}{2}$和$\frac{n}{2} + 1$两个位置元素的均值。
> **说明1**:中位数是将数据按照升序或降序排列后位于中间的数,它描述了数据的中等水平。中位数的计算分两种情况:当数据体量$n$为奇数时,中位数是位于 $\frac{n + 1}{2}$ 位置的元素;当数据体量 $\small{n}$ 为偶数时,中位数是位于 $\frac{n}{2}$ $\frac{n}{2} + 1$ 两个位置元素的均值。
>
> **说明2**:计算方差和标准差的函数中有一个名为`ddof`的参数它代表了可以调整的自由度默认值为1。在计算样本方差和样本标准差时需要进行自由度校正如果要计算总体方差和总体标准差可以将`ddof`参数赋值为0即不需要进行自由度校正。
> **说明2**:计算方差和标准差的函数中有一个名为`ddof`的参数,它代表了可以调整的自由度,默认值为 1。在计算样本方差和样本标准差时需要进行自由度校正如果要计算总体方差和总体标准差可以将`ddof`参数赋值为 0即不需要进行自由度校正。
>
> **说明3**`describe`函数将上面封装好的统计函数组装到一起用于输出数据的描述性统计信息。事实上Python 标准库中有一个名为`statistics`的模块,它已经把获取描述性统计信息的函数封装好了,有兴趣的读者可以自行了解。
@ -223,4 +230,4 @@ for _ in range(n):
### 总结
在写代码尤其是开发商业项目的时候,一定要有意识的**将相对独立且重复使用的功能封装成函数**,这样不管是自己还是团队的其他成员都可以通过调用函数的方式来使用这些功能,减少工作中那些重复且乏味的劳动。
在写代码尤其是开发商业项目的时候,一定要有意识的**将相对独立且重复使用的功能封装成函数**,这样不管是自己还是团队的其他成员都可以通过调用函数的方式来使用这些功能,减少工作中那些重复且乏味的劳动。

View File

@ -137,7 +137,7 @@ print(is_prime(37)) # True
> **提示1**:上面使用的`reduce`函数是 Python 标准库`functools`模块中的函数,它可以实现对一组数据的归约操作,类似于我们之前定义的`calc`函数,第一个参数是代表运算的函数,第二个参数是运算的数据,第三个参数是运算的初始值。很显然,`reduce`函数也是高阶函数,它和`filter`函数、`map`函数一起构成了处理数据中非常关键的三个动作:**过滤**、**映射**和**归约**。
>
> **提示2**:上面判断素数的 lambda 函数通过`range`函数构造了从$\small{2}$到$\small{\sqrt{x}}$的范围,检查这个范围有没有`x`的因子。`all`函数也是 Python 内置函数,如果传入的序列中所有的布尔值都是`True``all`函数返回`True`,否则`all`函数返回`False`。
> **提示2**:上面判断素数的 lambda 函数通过`range`函数构造了从 2 到 $\small{\sqrt{x}}$ 的范围,检查这个范围有没有`x`的因子。`all`函数也是 Python 内置函数,如果传入的序列中所有的布尔值都是`True``all`函数返回`True`,否则`all`函数返回`False`。
### 偏函数

View File

@ -179,7 +179,7 @@ upload.__wrapped__('Python从新手到大师.pdf')
### 递归调用
Python 中允许函数嵌套定义,也允许函数之间相互调用,而且一个函数还可以直接或间接的调用自身。函数自己调用自己称为递归调用,那么递归调用有什么用处呢?现实中,有很多问题的定义本身就是一个递归定义,例如我们之前讲到的阶乘,非负整数`N`的阶乘是`N`乘以`N-1`的阶乘,即$\small{N! = N \times (N-1)!}$,定义的左边和右边都出现了阶乘的概念,所以这是一个递归定义。既然如此,我们可以使用递归调用的方式来写一个求阶乘的函数,代码如下所示。
Python 中允许函数嵌套定义,也允许函数之间相互调用,而且一个函数还可以直接或间接的调用自身。函数自己调用自己称为递归调用,那么递归调用有什么用处呢?现实中,有很多问题的定义本身就是一个递归定义,例如我们之前讲到的阶乘,非负整数`N`的阶乘是`N`乘以`N-1`的阶乘,即 $\small{N! = N \times (N-1)!}$ ,定义的左边和右边都出现了阶乘的概念,所以这是一个递归定义。既然如此,我们可以使用递归调用的方式来写一个求阶乘的函数,代码如下所示。
```Python
def fac(num):

View File

@ -2,11 +2,11 @@
### Excel简介
Excel是Microsoft微软为使用Windows和macOS操作系统开发的一款电子表格软件。Excel凭借其直观的界面、出色的计算功能和图表工具再加上成功的市场营销一直以来都是最为流行的个人计算机数据处理软件。当然Excel也有很多竞品例如Google Sheets、LibreOffice Calc、Numbers等这些竞品基本上也能够兼容Excel至少能够读写较新版本的Excel文件当然这些不是我们讨论的重点。掌握用Python程序操作Excel文件可以让日常办公自动化的工作更加轻松愉快而且在很多商业项目中导入导出Excel文件都是特别常见的功能。
Excel Microsoft微软为使用 Windows macOS 操作系统开发的一款电子表格软件。Excel 凭借其直观的界面、出色的计算功能和图表工具再加上成功的市场营销一直以来都是最为流行的个人计算机数据处理软件。当然Excel 也有很多竞品,例如 Google Sheets、LibreOffice Calc、Numbers 等,这些竞品基本上也能够兼容 Excel至少能够读写较新版本的 Excel 文件,当然这些不是我们讨论的重点。掌握用 Python 程序操作 Excel 文件,可以让日常办公自动化的工作更加轻松愉快,而且在很多商业项目中,导入导出 Excel 文件都是特别常见的功能。
Python操作Excel需要三方库的支持如果要兼容Excel 2007以前的版本也就是`xls`格式的Excel文件可以使用三方库`xlrd`和`xlwt`前者用于读Excel文件后者用于写Excel文件。如果使用较新版本的Excel操作`xlsx`格式的Excel文件可以使用`openpyxl`库当然这个库不仅仅可以操作Excel还可以操作其他基于Office Open XML的电子表格文件。
Python 操作 Excel 需要三方库的支持,如果要兼容 Excel 2007 以前的版本,也就是`xls`格式的 Excel 文件,可以使用三方库`xlrd`和`xlwt`,前者用于读 Excel 文件,后者用于写 Excel 文件。如果使用较新版本的 Excel即`xlsx`格式的 Excel 文件,可以使用`openpyxl`库当然这个库不仅仅可以操作Excel还可以操作其他基于 Office Open XML 的电子表格文件。
本章我们先讲解基于`xlwt`和`xlrd`操作Excel文件大家可以先使用下面的命令安装这两个三方库以及配合使用的工具模块`xlutils`。
本章我们先讲解基于`xlwt`和`xlrd`操作 Excel 文件,大家可以先使用下面的命令安装这两个三方库以及配合使用的工具模块`xlutils`。
```Bash
pip install xlwt xlrd xlutils
@ -14,7 +14,7 @@ pip install xlwt xlrd xlutils
### 读Excel文件
例如在当前文件夹下有一个名为“阿里巴巴2020年股票数据.xls”的Excel文件如果想读取并显示该文件的内容可以通过如下所示的代码来完成。
例如在当前文件夹下有一个名为“阿里巴巴2020年股票数据.xls”的 Excel 文件,如果想读取并显示该文件的内容,可以通过如下所示的代码来完成。
```Python
import xlrd
@ -59,11 +59,11 @@ print(sheet.row_slice(3, 0, 5))
> **提示**上面代码中使用的Excel文件“阿里巴巴2020年股票数据.xls”可以通过后面的百度云盘地址进行获取。链接:https://pan.baidu.com/s/1rQujl5RQn9R7PadB2Z5g_g 提取码:e7b4。
相信通过上面的代码大家已经了解到了如何读取一个Excel文件如果想知道更多关于`xlrd`模块的知识,可以阅读它的[官方文档](https://xlrd.readthedocs.io/en/latest/)。
相信通过上面的代码,大家已经了解到了如何读取一个 Excel 文件,如果想知道更多关于`xlrd`模块的知识,可以阅读它的[官方文档](https://xlrd.readthedocs.io/en/latest/)。
### 写Excel文件
写入Excel文件可以通过`xlwt` 模块的`Workbook`类创建工作簿对象,通过工作簿对象的`add_sheet`方法可以添加工作表,通过工作表对象的`write`方法可以向指定单元格中写入数据,最后通过工作簿对象的`save`方法将工作簿写入到指定的文件或内存中。下面的代码实现了将`5`个学生`3`门课程的考试成绩写入Excel文件的操作。
写入 Excel 文件可以通过`xlwt` 模块的`Workbook`类创建工作簿对象,通过工作簿对象的`add_sheet`方法可以添加工作表,通过工作表对象的`write`方法可以向指定单元格中写入数据,最后通过工作簿对象的`save`方法将工作簿写入到指定的文件或内存中。下面的代码实现了将5 个学生 3 门课程的考试成绩写入 Excel 文件的操作。
```Python
import random
@ -189,4 +189,4 @@ wb_for_write.save('阿里巴巴2020年股票数据汇总.xls')
### 总结
掌握了Python程序操作Excel的方法可以解决日常办公中很多繁琐的处理Excel电子表格工作最常见就是将多个数据格式相同的Excel文件合并到一个文件以及从多个Excel文件或表单中提取指定的数据。当然如果要对表格数据进行处理使用Python数据分析神器之一的`pandas`库可能更为方便。
掌握了 Python 程序操作 Excel 的方法,可以解决日常办公中很多繁琐的处理 Excel 电子表格工作,最常见就是将多个数据格式相同的 Excel 文件合并到一个文件以及从多个 Excel 文件或表单中提取指定的数据。当然,如果要对表格数据进行处理,使用 Python 数据分析神器之一的 pandas 库可能更为方便。

View File

@ -2,19 +2,19 @@
### Excel简介
Excel是Microsoft微软为使用Windows和macOS操作系统开发的一款电子表格软件。Excel凭借其直观的界面、出色的计算功能和图表工具再加上成功的市场营销一直以来都是最为流行的个人计算机数据处理软件。当然Excel也有很多竞品例如Google Sheets、LibreOffice Calc、Numbers等这些竞品基本上也能够兼容Excel至少能够读写较新版本的Excel文件当然这些不是我们讨论的重点。掌握用Python程序操作Excel文件可以让日常办公自动化的工作更加轻松愉快而且在很多商业项目中导入导出Excel文件都是特别常见的功能。
Excel Microsoft微软为使用 Windows macOS 操作系统开发的一款电子表格软件。Excel 凭借其直观的界面、出色的计算功能和图表工具再加上成功的市场营销一直以来都是最为流行的个人计算机数据处理软件。当然Excel 也有很多竞品,例如 Google Sheets、LibreOffice Calc、Numbers 等,这些竞品基本上也能够兼容 Excel至少能够读写较新版本的 Excel 文件,当然这些不是我们讨论的重点。掌握用 Python 程序操作 Excel 文件,可以让日常办公自动化的工作更加轻松愉快,而且在很多商业项目中,导入导出 Excel 文件都是特别常见的功能。
本章我们继续讲解基于另一个三方库`openpyxl`如何进行Excel文件操作首先需要先安装它。
本章我们继续讲解基于另一个三方库`openpyxl`如何进行 Excel 文件操作,首先需要先安装它。
```Bash
pip install openpyxl
```
`openpyxl`的优点在于当我们打开一个Excel文件后既可以对它进行读操作又可以对它进行写操作而且在操作的便捷性上是优于`xlwt`和`xlrd`的。此外,如果要进行样式编辑和公式计算,使用`openpyxl`也远比上一个章节我们讲解的方式更为简单,而且`openpyxl`还支持数据透视和插入图表等操作,功能非常强大。有一点需要再次强调,`openpyxl`并不支持操作Office 2007以前版本的Excel文件。
`openpyxl`的优点在于,当我们打开一个 Excel 文件后,既可以对它进行读操作,又可以对它进行写操作,而且在操作的便捷性上是优于`xlwt`和`xlrd`的。此外,如果要进行样式编辑和公式计算,使用`openpyxl`也远比上一个章节我们讲解的方式更为简单,而且`openpyxl`还支持数据透视和插入图表等操作,功能非常强大。有一点需要再次强调,`openpyxl`并不支持操作 Office 2007 以前版本的 Excel 文件。
### 读取Excel文件
例如在当前文件夹下有一个名为“阿里巴巴2020年股票数据.xlsx”的Excel文件如果想读取并显示该文件的内容可以通过如下所示的代码来完成。
例如在当前文件夹下有一个名为“阿里巴巴2020年股票数据.xlsx”的 Excel 文件,如果想读取并显示该文件的内容,可以通过如下所示的代码来完成。
```Python
import datetime
@ -57,11 +57,11 @@ for row_ch in range(2, sheet.max_row + 1):
> **提示**上面代码中使用的Excel文件“阿里巴巴2020年股票数据.xlsx”可以通过后面的百度云盘地址进行获取。链接:https://pan.baidu.com/s/1rQujl5RQn9R7PadB2Z5g_g 提取码:e7b4。
需要提醒大家一点,`openpyxl`获取指定的单元格有两种方式,一种是通过`cell`方法,需要注意,该方法的行索引和列索引都是从`1`开始的这是为了照顾用惯了Excel的人的习惯另一种是通过索引运算通过指定单元格的坐标例如`C3`、`G255`,也可以取得对应的单元格,再通过单元格对象的`value`属性,就可以获取到单元格的值。通过上面的代码,相信大家还注意到了,可以通过类似`sheet['A2:C5']`或`sheet['A2':'C5']`这样的切片操作获取多个单元格,该操作将返回嵌套的元组,相当于获取到了多行多列。
需要提醒大家一点,`openpyxl`获取指定的单元格有两种方式,一种是通过`cell`方法,需要注意,该方法的行索引和列索引都是从`1`开始的,这是为了照顾用惯了 Excel 的人的习惯;另一种是通过索引运算,通过指定单元格的坐标,例如`C3`、`G255`,也可以取得对应的单元格,再通过单元格对象的`value`属性,就可以获取到单元格的值。通过上面的代码,相信大家还注意到了,可以通过类似`sheet['A2:C5']`或`sheet['A2':'C5']`这样的切片操作获取多个单元格,该操作将返回嵌套的元组,相当于获取到了多行多列。
### 写Excel文件
下面我们使用`openpyxl`来进行写Excel操作。
下面我们使用`openpyxl`来进行写 Excel 操作。
```Python
import random
@ -91,7 +91,7 @@ wb.save('考试成绩表.xlsx')
### 调整样式和公式计算
在使用`openpyxl`操作Excel时如果要调整单元格的样式可以直接通过单元格对象`Cell`对象)的属性进行操作。单元格对象的属性包括字体(`font`)、对齐(`alignment`)、边框(`border`)等,具体的可以参考`openpyxl`的[官方文档](https://openpyxl.readthedocs.io/en/stable/index.html)。在使用`openpyxl`时如果需要做公式计算可以完全按照Excel中的操作方式来进行具体的代码如下所示。
在使用`openpyxl`操作 Excel 时,如果要调整单元格的样式,可以直接通过单元格对象(`Cell`对象)的属性进行操作。单元格对象的属性包括字体(`font`)、对齐(`alignment`)、边框(`border`)等,具体的可以参考`openpyxl`的[官方文档](https://openpyxl.readthedocs.io/en/stable/index.html)。在使用`openpyxl`时,如果需要做公式计算,可以完全按照 Excel 中的操作方式来进行,具体的代码如下所示。
```Python
import openpyxl
@ -127,7 +127,7 @@ wb.save('考试成绩表.xlsx')
### 生成统计图表
通过`openpyxl`库可以直接向Excel中插入统计图表具体的做法跟在Excel中插入图表大体一致。我们可以创建指定类型的图表对象然后通过该对象的属性对图表进行设置。当然最为重要的是为图表绑定数据即横轴代表什么纵轴代表什么具体的数值是多少。最后可以将图表对象添加到表单中具体的代码如下所示。
通过`openpyxl`库,可以直接向 Excel 中插入统计图表,具体的做法跟在 Excel 中插入图表大体一致。我们可以创建指定类型的图表对象,然后通过该对象的属性对图表进行设置。当然,最为重要的是为图表绑定数据,即横轴代表什么,纵轴代表什么,具体的数值是多少。最后,可以将图表对象添加到表单中,具体的代码如下所示。
```Python
from openpyxl import Workbook
@ -173,10 +173,10 @@ sheet.add_chart(chart, 'A10')
wb.save('demo.xlsx')
```
运行上面的代码打开生成的Excel文件效果如下图所示。
运行上面的代码,打开生成的 Excel 文件,效果如下图所示。
<img src="res/20210819235009.png" alt="image-20210819235009026" width="75%">
### 总结
掌握了Python程序操作Excel的方法可以解决日常办公中很多繁琐的处理Excel电子表格工作最常见就是将多个数据格式相同的Excel文件合并到一个文件以及从多个Excel文件或表单中提取指定的数据。如果数据体量较大或者处理数据的方式比较复杂我们还是推荐大家使用Python数据分析神器之一的`pandas`库。
掌握了 Python 程序操作 Excel 的方法,可以解决日常办公中很多繁琐的处理 Excel 电子表格工作最常见就是将多个数据格式相同的Excel 文件合并到一个文件以及从多个 Excel 文件或表单中提取指定的数据。如果数据体量较大或者处理数据的方式比较复杂,我们还是推荐大家使用 Python 数据分析神器之一的 pandas 库。

View File

@ -1,6 +1,6 @@
## Python操作Word和PowerPoint文件
在日常工作中有很多简单重复的劳动其实完全可以交给Python程序比如根据样板文件模板文件批量的生成很多个Word文件或PowerPoint文件。Word是微软公司开发的文字处理程序相信大家都不陌生日常办公中很多正式的文档都是用Word进行撰写和编辑的目前使用的Word文件后缀名一般为`.docx`。PowerPoint是微软公司开发的演示文稿程序是微软的Office系列软件中的一员被商业人士、教师、学生等群体广泛使用通常也将其称之为“幻灯片”。在Python中可以使用名为`python-docx` 的三方库来操作Word可以使用名为`python-pptx`的三方库来生成PowerPoint。
在日常工作中,有很多简单重复的劳动其实完全可以交给 Python 程序,比如根据样板文件(模板文件)批量的生成很多个 Word 文件或 PowerPoint 文件。Word 是微软公司开发的文字处理程序,相信大家都不陌生,日常办公中很多正式的文档都是用 Word 进行撰写和编辑的,目前使用的 Word 文件后缀名一般为`.docx`。PowerPoint 是微软公司开发的演示文稿程序,是微软的 Office 系列软件中的一员,被商业人士、教师、学生等群体广泛使用,通常也将其称之为“幻灯片”。在 Python 中,可以使用名为`python-docx` 的三方库来操作 Word可以使用名为`python-pptx`的三方库来生成 PowerPoint。
### 操作Word文档
@ -10,7 +10,7 @@
pip install python-docx
```
按照[官方文档](https://python-docx.readthedocs.io/en/latest/)的介绍我们可以使用如下所示的代码来生成一个简单的Word文档。
按照[官方文档](https://python-docx.readthedocs.io/en/latest/)的介绍,我们可以使用如下所示的代码来生成一个简单的 Word 文档。
```Python
from docx import Document
@ -83,13 +83,13 @@ document.add_page_break()
document.save('demo.docx')
```
> **提示**上面代码第7行中的注释`# type: Doc`是为了在PyCharm中获得代码补全提示因为如果不清楚对象具体的数据类型PyCharm无法在后续代码中给出`Doc`对象的代码补全提示。
> **提示**上面代码第7行中的注释`# type: Doc`是为了在PyCharm中获得代码补全提示因为如果不清楚对象具体的数据类型PyCharm 无法在后续代码中给出`Doc`对象的代码补全提示。
执行上面的代码打开生成的Word文档效果如下图所示。
执行上面的代码,打开生成的 Word 文档,效果如下图所示。
<img src="res/20210820002742.png" width="40%">&nbsp;&nbsp;<img src="res/20210820002843.png" width="40%">
对于一个已经存在的Word文件我们可以通过下面的代码去遍历它所有的段落并获取对应的内容。
对于一个已经存在的 Word 文件,我们可以通过下面的代码去遍历它所有的段落并获取对应的内容。
```Python
from docx import Document
@ -100,7 +100,7 @@ for no, p in enumerate(doc.paragraphs):
print(no, p.text)
```
> **提示**如果需要上面代码中的Word文件可以通过下面的百度云盘地址进行获取。链接:https://pan.baidu.com/s/1rQujl5RQn9R7PadB2Z5g_g 提取码:e7b4。
> **提示**:如果需要上面代码中的 Word 文件,可以通过下面的百度云盘地址进行获取。链接:https://pan.baidu.com/s/1rQujl5RQn9R7PadB2Z5g_g 提取码:e7b4。
读取到的内容如下所示。
@ -117,13 +117,13 @@ for no, p in enumerate(doc.paragraphs):
9 2020 年 6 月 28 日
```
讲到这里相信很多读者已经想到了我们可以把上面的离职证明制作成一个模板文件把姓名、身份证号、入职和离职日期等信息用占位符代替这样通过对占位符的替换就可以根据实际需要写入对应的信息这样就可以批量的生成Word文档。
讲到这里,相信很多读者已经想到了,我们可以把上面的离职证明制作成一个模板文件,把姓名、身份证号、入职和离职日期等信息用占位符代替,这样通过对占位符的替换,就可以根据实际需要写入对应的信息,这样就可以批量的生成 Word 文档。
按照上面的思路,我们首先编辑一个离职证明的模板文件,如下图所示。
<img src="res/20210820004223.png" width="75%" style="border:1px solid black"/>
接下来我们读取该文件将占位符替换为真实信息就可以生成一个新的Word文档如下所示。
接下来我们读取该文件,将占位符替换为真实信息,就可以生成一个新的 Word 文档,如下所示。
```Python
from docx import Document
@ -180,7 +180,7 @@ for emp_dict in employees:
doc.save(f'{emp_dict["name"]}离职证明.docx')
```
执行上面的代码会在当前路径下生成三个Word文档如下图所示。
执行上面的代码,会在当前路径下生成三个 Word 文档,如下图所示。
<img src="res/20210820004825.png" width="50%">
@ -192,7 +192,7 @@ for emp_dict in employees:
pip install python-pptx
```
用Python操作PowerPoint的内容因为实际应用场景不算很多我不打算在这里进行赘述有兴趣的读者可以自行阅读`python-pptx`的[官方文档](https://python-pptx.readthedocs.io/en/latest/),下面仅展示一段来自于官方文档的代码。
Python 操作 PowerPoint 的内容,因为实际应用场景不算很多,我不打算在这里进行赘述,有兴趣的读者可以自行阅读`python-pptx`的[官方文档](https://python-pptx.readthedocs.io/en/latest/),下面仅展示一段来自于官方文档的代码。
```Python
from pptx import Presentation
@ -236,10 +236,10 @@ p.level = 2
pres.save('test.pptx')
```
运行上面的代码生成的PowerPoint文件如下图所示。
运行上面的代码,生成的 PowerPoint 文件如下图所示。
<img src="res/20210820010306.png" width="75%" />
### 总结
用Python程序解决办公自动化的问题真的非常酷它可以将我们从繁琐乏味的劳动中解放出来。写这类代码就是去做一件一劳永逸的事情写代码的过程即便不怎么愉快使用这些代码的时候应该是非常开心的。
Python 程序解决办公自动化的问题真的非常酷,它可以将我们从繁琐乏味的劳动中解放出来。写这类代码就是去做一件一劳永逸的事情,写代码的过程即便不怎么愉快,使用这些代码的时候应该是非常开心的。

View File

@ -1,16 +1,16 @@
## Python操作PDF文件
PDF是Portable Document Format的缩写这类文件通常使用`.pdf`作为其扩展名。在日常开发工作中最容易遇到的就是从PDF中读取文本内容以及用已有的内容生成PDF文档这两个任务。
PDF Portable Document Format 的缩写,这类文件通常使用`.pdf`作为其扩展名。在日常开发工作中,最容易遇到的就是从 PDF 中读取文本内容以及用已有的内容生成PDF文档这两个任务。
### 从PDF中提取文本
在Python中可以使用名为`PyPDF2`的三方库来读取PDF文件可以使用下面的命令来安装它。
Python 中,可以使用名为`PyPDF2`的三方库来读取 PDF 文件,可以使用下面的命令来安装它。
```Bash
pip install PyPDF2
```
`PyPDF2`没有办法从PDF文档中提取图像、图表或其他媒体但它可以提取文本并将其返回为Python字符串。
`PyPDF2`没有办法从 PDF 文档中提取图像、图表或其他媒体,但它可以提取文本,并将其返回为 Python 字符串。
```Python
import PyPDF2
@ -20,11 +20,11 @@ for page in reader.pages:
print(page.extract_text())
```
> **提示**上面代码中使用的PDF文件“test.pdf”以及下面的代码中需要用到的PDF文件也可以通过下面的百度云盘地址进行获取。链接:https://pan.baidu.com/s/1rQujl5RQn9R7PadB2Z5g_g 提取码:e7b4。
> **提示**本章代码使用到的 PDF 文件都可以通过下面的百度云盘地址进行获取链接https://pan.baidu.com/s/1rQujl5RQn9R7PadB2Z5g_g提取码e7b4。
当然,`PyPDF2`并不是什么样的PDF文档都能提取出文字来这个问题就我所知并没有什么特别好的解决方法尤其是在提取中文的时候。网上也有很多讲解从PDF中提取文字的文章推荐大家自行阅读[《三大神器助力Python提取pdf文档信息》](https://cloud.tencent.com/developer/article/1395339)一文进行了解。
当然,`PyPDF2`并不是什么样的 PDF 文档都能提取出文字来,这个问题就我所知并没有什么特别好的解决方法,尤其是在提取中文的时候。网上也有很多讲解从 PDF 中提取文字的文章,推荐大家自行阅读[《三大神器助力Python提取pdf文档信息》](https://cloud.tencent.com/developer/article/1395339)一文进行了解。
要从PDF文件中提取文本也可以直接使用三方的命令行工具具体的做法如下所示。
要从 PDF 文件中提取文本也可以直接使用三方的命令行工具,具体的做法如下所示。
```Bash
pip install pdfminer.six
@ -33,7 +33,7 @@ pdf2text.py test.pdf
### 旋转和叠加页面
上面的代码中通过创建`PdfFileReader`对象的方式来读取PDF文档该对象的`getPage`方法可以获得PDF文档的指定页并得到一个`PageObject`对象,通过`PageObject`对象的`rotateClockwise`和`rotateCounterClockwise`方法可以实现页面的顺时针和逆时针方向旋转,通过`PageObject`对象的`addBlankPage`方法可以添加一个新的空白页,代码如下所示。
上面的代码中通过创建`PdfFileReader`对象的方式来读取 PDF 文档,该对象的`getPage`方法可以获得PDF文档的指定页并得到一个`PageObject`对象,通过`PageObject`对象的`rotateClockwise`和`rotateCounterClockwise`方法可以实现页面的顺时针和逆时针方向旋转,通过`PageObject`对象的`addBlankPage`方法可以添加一个新的空白页,代码如下所示。
```Python
reader = PyPDF2.PdfReader('XGBoost.pdf')
@ -71,7 +71,7 @@ with open('temp.pdf', 'wb') as file_obj:
### 批量添加水印
上面提到的`PageObject`对象还有一个名为`mergePage`的方法可以两个PDF页面进行叠加通过这个操作我们很容易实现给PDF文件添加水印的功能。例如要给上面的“XGBoost.pdf”文件添加一个水印我们可以先准备好一个提供水印页面的PDF文件然后将包含水印的`PageObject`读取出来然后再循环遍历“XGBoost.pdf”文件的每个页获取到`PageObject`对象,然后通过`mergePage`方法实现水印页和原始页的合并,代码如下所示。
上面提到的`PageObject`对象还有一个名为`mergePage`的方法,可以两个 PDF 页面进行叠加通过这个操作我们很容易实现给PDF文件添加水印的功能。例如要给上面的“XGBoost.pdf”文件添加一个水印我们可以先准备好一个提供水印页面的 PDF 文件,然后将包含水印的`PageObject`读取出来然后再循环遍历“XGBoost.pdf”文件的每个页获取到`PageObject`对象,然后通过`mergePage`方法实现水印页和原始页的合并,代码如下所示。
```Python
reader1 = PyPDF2.PdfReader('XGBoost.pdf')
@ -91,7 +91,7 @@ with open('temp.pdf', 'wb') as file_obj:
### 创建PDF文件
创建PDF文档需要三方库`reportlab`的支持,安装的方法如下所示。
创建 PDF 文档需要三方库`reportlab`的支持,安装的方法如下所示。
```Bash
pip install reportlab
@ -132,10 +132,10 @@ pdf_canvas.drawString(250, 250, 'hello, world!')
pdf_canvas.save()
```
上面的代码如果不太理解也没有关系等真正需要用Python创建PDF文档的时候再好好研读一下`reportlab`的[官方文档](https://www.reportlab.com/docs/reportlab-userguide.pdf)就可以了。
上面的代码如果不太理解也没有关系,等真正需要用 Python 创建 PDF 文档的时候,再好好研读一下`reportlab`的[官方文档](https://www.reportlab.com/docs/reportlab-userguide.pdf)就可以了。
> **提示**:上面代码中用到的图片和字体,也可以通过下面的百度云盘链接获取。链接:https://pan.baidu.com/s/1rQujl5RQn9R7PadB2Z5g_g 提取码:e7b4。
> **提示**:上面代码中用到的图片和字体可以通过下面的百度云盘链接获取链接https://pan.baidu.com/s/1rQujl5RQn9R7PadB2Z5g_g提取码e7b4。
### 总结
在学习完上面的内容之后相信大家已经知道像合并多个PDF文件这样的工作应该如何用Python代码来处理了赶紧自己动手试一试吧。
在学习完上面的内容之后,相信大家已经知道像合并多个 PDF 文件这样的工作应该如何用 Python 代码来处理了,赶紧自己动手试一试吧。

View File

@ -2,7 +2,7 @@
### 入门知识
1. 颜色。如果你有使用颜料画画的经历那么一定知道混合红、黄、蓝三种颜料可以得到其他的颜色事实上这三种颜色就是美术中的三原色它们是不能再分解的基本颜色。在计算机中我们可以将红、绿、蓝三种色光以不同的比例叠加来组合成其他的颜色因此这三种颜色就是色光三原色。在计算机系统中我们通常会将一个颜色表示为一个RGB值或RGBA值其中的A表示Alpha通道它决定了透过这个图像的像素也就是透明度
1. 颜色。如果你有使用颜料画画的经历,那么一定知道混合红、黄、蓝三种颜料可以得到其他的颜色,事实上这三种颜色就是美术中的三原色,它们是不能再分解的基本颜色。在计算机中,我们可以将红、绿、蓝三种色光以不同的比例叠加来组合成其他的颜色,因此这三种颜色就是色光三原色。在计算机系统中,我们通常会将一个颜色表示为一个 RGB 值或 RGBA 值(其中的 A 表示 Alpha 通道,它决定了透过这个图像的像素,也就是透明度)。
| 名称 | RGB值 | 名称 | RGB值 |
| :---------: | :-------------: | :----------: | :-----------: |
@ -15,13 +15,13 @@
### 用Pillow处理图像
Pillow是由从著名的Python图像处理库PIL发展出来的一个分支通过Pillow可以实现图像压缩和图像处理等各种操作。可以使用下面的命令来安装Pillow。
Pillow 是由从著名的 Python 图像处理库 PIL 发展出来的一个分支,通过 Pillow 可以实现图像压缩和图像处理等各种操作。可以使用下面的命令来安装 Pillow。
```Shell
pip install pillow
```
Pillow中最为重要的是`Image`类,可以通过`Image`模块的`open`函数来读取图像并获得`Image`类型的对象。
Pillow 中最为重要的是`Image`类,可以通过`Image`模块的`open`函数来读取图像并获得`Image`类型的对象。
1. 读取和显示图像
@ -119,7 +119,7 @@ Pillow中最为重要的是`Image`类,可以通过`Image`模块的`open`函数
### 使用Pillow绘图
Pillow中有一个名为`ImageDraw`的模块,该模块的`Draw`函数会返回一个`ImageDraw`对象,通过`ImageDraw`对象的`arc`、`line`、`rectangle`、`ellipse`、`polygon`等方法,可以在图像上绘制出圆弧、线条、矩形、椭圆、多边形等形状,也可以通过该对象的`text`方法在图像上添加文字。
Pillow 中有一个名为`ImageDraw`的模块,该模块的`Draw`函数会返回一个`ImageDraw`对象,通过`ImageDraw`对象的`arc`、`line`、`rectangle`、`ellipse`、`polygon`等方法,可以在图像上绘制出圆弧、线条、矩形、椭圆、多边形等形状,也可以通过该对象的`text`方法在图像上添加文字。
<img src="res/20210803203016.png" width="80%">
@ -168,4 +168,4 @@ image.save('result.png')
### 总结
使用Python语言做开发除了可以用Pillow来处理图像外还可以使用更为强大的OpenCV库来完成图形图像的处理OpenCV**Open** Source **C**omputer **V**ision Library是一个跨平台的计算机视觉库可以用来开发实时图像处理、计算机视觉和模式识别程序。在我们的日常工作中有很多繁琐乏味的任务其实都可以通过Python程序来处理编程的目的就是让计算机帮助我们解决问题减少重复乏味的劳动。通过本章节的学习相信大家已经感受到了使用Python程序绘图P图的乐趣其实Python能做的事情还远不止这些,继续你的学习吧。
使用 Python 语言做开发,除了可以用 Pillow 来处理图像外,还可以使用更为强大的 OpenCV 库来完成图形图像的处理OpenCV**Open** Source **C**omputer **V**ision Library是一个跨平台的计算机视觉库可以用来开发实时图像处理、计算机视觉和模式识别程序。在我们的日常工作中有很多繁琐乏味的任务其实都可以通过 Python 程序来处理,编程的目的就是让计算机帮助我们解决问题,减少重复乏味的劳动。通过本章节的学习,相信大家已经感受到了使用 Python 程序绘图改图的乐趣,其实 Python 能做的事情还远不止这些,继续你的学习吧。

View File

@ -1,14 +1,14 @@
## Python发送邮件和短信
在前面的课程中我们已经教会大家如何用Python程序自动的生成Excel、Word、PDF文档接下来我们还可以更进一步就是通过邮件将生成好的文档发送给指定的收件人然后用短信告知对方我们发出了邮件。这些事情利用Python程序也可以轻松愉快的解决。
在前面的课程中,我们已经教会大家如何用 Python 程序自动的生成 Excel、Word、PDF 文档,接下来我们还可以更进一步,就是通过邮件将生成好的文档发送给指定的收件人,然后用短信告知对方我们发出了邮件。这些事情利用 Python 程序也可以轻松愉快的解决。
### 发送电子邮件
在即时通信软件如此发达的今天,电子邮件仍然是互联网上使用最为广泛的应用之一,公司向应聘者发出录用通知、网站向用户发送一个激活账号的链接、银行向客户推广它们的理财产品等几乎都是通过电子邮件来完成的,而这些任务应该都是由程序自动完成的。
我们可以用HTTP超文本传输协议来访问网站资源HTTP是一个应用级协议它建立在TCP传输控制协议之上TCP为很多应用级协议提供了可靠的数据传输服务。如果要发送电子邮件需要使用SMTP简单邮件传输协议它也是建立在TCP之上的应用级协议规定了邮件的发送者如何跟邮件服务器进行通信的细节。Python通过名为`smtplib`的模块将这些操作简化成了`SMTP_SSL`对象,通过该对象的`login`和`send_mail`方法,就能够完成发送邮件的操作。
我们可以用HTTP超文本传输协议来访问网站资源HTTP 是一个应用级协议,它建立在 TCP传输控制协议之上TCP 为很多应用级协议提供了可靠的数据传输服务。如果要发送电子邮件,需要使用 SMTP简单邮件传输协议它也是建立在 TCP 之上的应用级协议规定了邮件的发送者如何跟邮件服务器进行通信的细节。Python 通过名为`smtplib`的模块将这些操作简化成了`SMTP_SSL`对象,通过该对象的`login`和`send_mail`方法,就能够完成发送邮件的操作。
我们先尝试一下发送一封极为简单的邮件,该邮件不包含附件、图片以及其他超文本内容。发送邮件首先需要接入邮件服务器,我们可以自己架设邮件服务器,这件事情对新手并不友好,但是我们可以选择使用第三方提供的邮件服务。例如,我在<www.126.com>已经注册了账号登录成功之后就可以在设置中开启SMTP服务这样就相当于获得了邮件服务器具体的操作如下所示。
我们先尝试一下发送一封极为简单的邮件,该邮件不包含附件、图片以及其他超文本内容。发送邮件首先需要接入邮件服务器,我们可以自己架设邮件服务器,这件事情对新手并不友好,但是我们可以选择使用第三方提供的邮件服务。例如,我在<www.126.com>已经注册了账号,登录成功之后,就可以在设置中开启 SMTP 服务,这样就相当于获得了邮件服务器,具体的操作如下所示。
<img src="res/20210820190307.png" alt="image-20210820190306861" width="85%">
@ -46,7 +46,7 @@ smtp_obj.sendmail(
)
```
如果要发送带有附件的邮件只需要将附件的内容处理成BASE64编码那么它就和普通的文本内容几乎没有什么区别。BASE64是一种基于64个可打印字符来表示二进制数据的表示方法常用于某些需要表示、传输、存储二进制数据的场合电子邮件就是其中之一。对这种编码方式不理解的同学推荐阅读[《Base64笔记》](http://www.ruanyifeng.com/blog/2008/06/base64.html)一文。在之前的内容中我们也提到过Python标准库的`base64`模块提供了对BASE64编解码的支持。
如果要发送带有附件的邮件,只需要将附件的内容处理成 BASE64 编码那么它就和普通的文本内容几乎没有什么区别。BASE64 是一种基于 64 个可打印字符来表示二进制数据的表示方法,常用于某些需要表示、传输、存储二进制数据的场合,电子邮件就是其中之一。对这种编码方式不理解的同学,推荐阅读[《Base64笔记》](http://www.ruanyifeng.com/blog/2008/06/base64.html)一文。在之前的内容中我们也提到过Python 标准库的`base64`模块提供了对 BASE64 编解码的支持。
下面的代码演示了如何发送带附件的邮件。
@ -93,7 +93,7 @@ smtp_obj.sendmail(
)
```
为了方便大家用Python实现邮件发送我将上面的代码封装成了函数使用的时候大家只需要调整邮件服务器域名、端口、用户名和授权码就可以了。
为了方便大家用 Python 实现邮件发送,我将上面的代码封装成了函数,使用的时候大家只需要调整邮件服务器域名、端口、用户名和授权码就可以了。
```Python
import smtplib
@ -145,11 +145,11 @@ def send_email(*, from_user, to_users, subject='', content='', filenames=[]):
### 发送短信
发送短信也是项目中常见的功能,网站的注册码、验证码、营销信息基本上都是通过短信来发送给用户的。发送短信需要三方平台的支持,下面我们以[螺丝帽平台](https://luosimao.com/)为例为大家介绍如何用Python程序发送短信。注册账号和购买短信服务的细节我们不在这里进行赘述大家可以咨询平台的客服。
发送短信也是项目中常见的功能,网站的注册码、验证码、营销信息基本上都是通过短信来发送给用户的。发送短信需要三方平台的支持,下面我们以[螺丝帽平台](https://luosimao.com/)为例,为大家介绍如何用 Python 程序发送短信。注册账号和购买短信服务的细节我们不在这里进行赘述,大家可以咨询平台的客服。
<img src="res/20210820194421.png" style="zoom:35%;">
接下来,我们可以通过`requests`库向平台提供的短信网关发起一个HTTP请求通过将接收短信的手机号和短信内容作为参数就可以发送短信代码如下所示。
接下来,我们可以通过`requests`库向平台提供的短信网关发起一个 HTTP 请求,通过将接收短信的手机号和短信内容作为参数,就可以发送短信,代码如下所示。
```Python
import random
@ -191,7 +191,7 @@ if __name__ == '__main__':
<img src="res/20210820195505.png" style="zoom:50%;">
目前大多数短信平台都会要求短信内容必须附上签名下图是我在螺丝帽平台配置的短信签名“【Python小课】”。有些涉及到敏感内容的短信还需要提前配置短信模板有兴趣的读者可以自行研究。一般情况下平台为了防范短信被盗用还会要求设置“IP白名单”不清楚如何配置的可以咨询平台客服。
目前大多数短信平台都会要求短信内容必须附上签名下图是我在螺丝帽平台配置的短信签名“【Python小课】”。有些涉及到敏感内容的短信还需要提前配置短信模板有兴趣的读者可以自行研究。一般情况下平台为了防范短信被盗用还会要求设置“IP 白名单”,不清楚如何配置的可以咨询平台客服。
<img src="res/20210820194653.png" style="zoom:35%;">

View File

@ -4,9 +4,9 @@
在编写处理字符串的程时,经常会遇到在一段文本中查找符合某些规则的字符串的需求,正则表达式就是用于描述这些规则的工具,换句话说,我们可以使用正则表达式来定义字符串的匹配模式,即如何检查一个字符串是否有跟某种模式匹配的部分或者从一个字符串中将与模式匹配的部分提取出来或者替换掉。
举一个简单的例子如果你在Windows操作系统中使用过文件查找并且在指定文件名时使用过通配符`*`和`?`),那么正则表达式也是与之类似的用 来进行文本匹配的工具,只不过比起通配符正则表达式更强大,它能更精确地描述你的需求,当然你付出的代价是书写一个正则表达式比使用通配符要复杂得多,因为任何给你带来好处的东西都需要你付出对应的代价。
举一个简单的例子,如果你在 Windows 操作系统中使用过文件查找并且在指定文件名时使用过通配符(`*`和`?`),那么正则表达式也是与之类似的用 来进行文本匹配的工具,只不过比起通配符正则表达式更强大,它能更精确地描述你的需求,当然你付出的代价是书写一个正则表达式比使用通配符要复杂得多,因为任何给你带来好处的东西都需要你付出对应的代价。
再举一个例子我们从某个地方可能是一个文本文件也可能是网络上的一则新闻获得了一个字符串希望在字符串中找出手机号和座机号。当然我们可以设定手机号是11位的数字注意并不是随机的11位数字因为你没有见过“25012345678”这样的手机号而座机号则是类似于“区号-号码”这样的模式如果不使用正则表达式要完成这个任务就会比较麻烦。最初计算机是为了做数学运算而诞生的处理的信息基本上都是数值而今天我们在日常工作中处理的信息很多都是文本数据我们希望计算机能够识别和处理符合某些模式的文本正则表达式就显得非常重要了。今天几乎所有的编程语言都提供了对正则表达式操作的支持Python通过标准库中的`re`模块来支持正则表达式操作。
再举一个例子,我们从某个地方(可能是一个文本文件,也可能是网络上的一则新闻)获得了一个字符串,希望在字符串中找出手机号和座机号。当然我们可以设定手机号是 11 位的数字(注意并不是随机的 11 位数字因为你没有见过“25012345678”这样的手机号而座机号则是类似于“区号-号码”这样的模式如果不使用正则表达式要完成这个任务就会比较麻烦。最初计算机是为了做数学运算而诞生的处理的信息基本上都是数值而今天我们在日常工作中处理的信息很多都是文本数据我们希望计算机能够识别和处理符合某些模式的文本正则表达式就显得非常重要了。今天几乎所有的编程语言都提供了对正则表达式操作的支持Python 通过标准库中的`re`模块来支持正则表达式操作。
关于正则表达式的相关知识,大家可以阅读一篇非常有名的博文叫[《正则表达式30分钟入门教程》](https://deerchao.net/tutorials/regex/regex.htm),读完这篇文章后你就可以看懂下面的表格,这是我们对正则表达式中的一些基本符号进行的扼要总结。
@ -50,7 +50,7 @@
### Python对正则表达式的支持
Python提供了`re`模块来支持正则表达式相关操作,下面是`re`模块中的核心函数。
Python 提供了`re`模块来支持正则表达式相关操作,下面是`re`模块中的核心函数。
| 函数 | 说明 |
| ---------------------------------------------- | ------------------------------------------------------------ |
@ -98,7 +98,7 @@ if m1 and m2:
#### 例子2从一段文字中提取出国内手机号码。
下面这张图是截止到2017年底国内三家运营商推出的手机号段。
下面这张图是截止到 2017 年底,国内三家运营商推出的手机号段。
<img src="res/20210803203134.png" style="zoom:100%;">
@ -127,7 +127,7 @@ while m:
m = pattern.search(sentence, m.end())
```
> **说明:** 上面匹配国内手机号的正则表达式并不够好因为像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替换字符串中的不良内容
@ -140,7 +140,7 @@ purified = re.sub('fuck|shit|[傻煞沙][比笔逼叉缺吊碉雕]',
print(purified) # Oh, *! 你是*吗? * you.
```
> **说明:**` 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拆分长字符串