更新了第1-20天的部分文档
This commit is contained in:
parent
f385686642
commit
b4d49f38b9
|
|
@ -1,14 +1,14 @@
|
|||
## Python语言中的变量
|
||||
|
||||
对于想学习编程的新手来说,有两个问题可能是他们很想知道的,其一是“什么是(计算机)程序”,其二是“写(计算机)程序能做什么”。先说说我对这两个问题的理解:**程序是数据和指令的有序集合**,**写程序就是用数据和指令控制计算机做我们想让它做的事情**。今时今日,为什么有那么多人选择用 Python 语言来写程序,因为 Python 语言足够简单和强大。相较于 C、C++、Java 这样的编程语言,Python 对初学者和非专业人士更加友好,我们想做的很多事情,在 Python 语言中都能找到简单优雅的解决方案。接下来,我们就从最基础的语言元素开始,带大家认识和使用 Python 语言。
|
||||
对于想学习编程的新手来说,有两个问题可能是他们很想知道的,其一是“什么是(计算机)程序”,其二是“写(计算机)程序能做什么”。先说说我对这两个问题的理解:**程序是数据和指令的有序集合**,**写程序就是用数据和指令控制计算机做我们想让它做的事情**。今时今日,为什么有那么多人选择用 Python 语言来写程序,因为 Python 语言足够简单和强大。相较于 C、C++、Java 这样的编程语言,Python 对初学者和非专业人士更加友好,很多问题在 Python 语言中都能找到简单优雅的解决方案。接下来,我们就从最基础的语言元素开始,带大家认识和使用 Python 语言。
|
||||
|
||||
### 一些常识
|
||||
|
||||
在开始系统的学习编程之前,我们先来科普一些计算机的基础知识。计算机的硬件系统通常由五大部件构成,包括:**运算器**、**控制器**、**存储器**、**输入设备**和**输出设备**。其中,运算器和控制器放在一起就是我们常说的**中央处理器**(CPU),它的功能是执行各种运算和控制指令。刚才我们提到过程序是指令的集合,写程序就是将一系列的指令按照某种方式组织到一起,然后通过这些指令去控制计算机做我们想让它做的事情。存储器可以分为**内部存储器**和**外部存储器**,前者就是我们常说的内存,它是中央处理器可以直接寻址的存储空间,程序在执行的过程中,对应的数据和指令需要加载到内存中。输入设备和输出设备经常被统称为 I/O 设备,键盘、鼠标、麦克风、摄像头是典型的输入设备,而显示器、打印机、扬声器等则是典型的输出设备。目前,我们使用的计算机基本都是遵循“冯·诺依曼体系结构”的计算机,这种计算机有两个关键点:一是**将存储器与中央处理器分开**;二是**将数据以二进制方式编码**。
|
||||
在开始系统的学习 Python 编程之前,我们先来科普一些计算机的基础知识。计算机的硬件系统通常由五大部件构成,包括:**运算器**、**控制器**、**存储器**、**输入设备**和**输出设备**。其中,运算器和控制器放在一起就是我们常说的**中央处理器**(CPU),它的功能是执行各种运算和控制指令。刚才我们提到过,程序是指令的集合,写程序就是将一系列的指令按照某种方式组织到一起,然后通过这些指令去控制计算机做我们想让它做的事情。存储器可以分为**内部存储器**和**外部存储器**,前者就是我们常说的内存,它是中央处理器可以直接寻址的存储空间,程序在执行的过程中,对应的数据和指令需要加载到内存中。输入设备和输出设备经常被统称为 I/O 设备,键盘、鼠标、麦克风、摄像头是典型的输入设备,而显示器、打印机、扬声器等则是典型的输出设备。目前,我们使用的计算机基本大多是遵循“冯·诺依曼体系结构”的计算机,这种计算机有两个关键点:一是**将存储器与中央处理器分开**;二是**将数据以二进制方式编码**。
|
||||
|
||||
二进制是一种“逢二进一”的计数法,跟人类使用的“逢十进一”的计数法本质是一样的。人类因为有十根手指,所以使用了十进制计数法,在计数时十根手指用完之后,就只能用进位的方式来表示更大的数值。当然凡事都有例外,玛雅人可能是因为长年光着脚的原因,把脚趾头也都用上了,于是他们使用了二十进制的计数法。基于这样的计数方式,玛雅人使用的历法跟我们平常使用的历法就产生了差异。按照玛雅人的历法,2012年是上一个所谓的“太阳纪”的最后一年,而2013年则是新的“太阳纪”的开始。后来这件事情还被以讹传讹的方式误传为“2012年是玛雅人预言的世界末日”的荒诞说法。今天有很多人猜测,玛雅文明之所以发展缓慢跟使用了二十进制是有关系的。对于计算机来说,二进制在物理器件上最容易实现的,因为可以用高电压表示1,用低电压表示0。不是所有写程序的人都需要熟悉二进制,熟悉十进制与二进制、八进制、十六进制的转换,大多数时候我们即便不了解这些知识也能写程序。但是,我们必须知道,计算机是使用二进制计数的,不管什么样的数据,到了计算机内存中都是以二进制形态存在的。
|
||||
二进制是一种“逢二进一”的计数法,跟人类使用的“逢十进一”的计数法本质是一样的。人类因为有十根手指,所以使用了十进制计数法,在计数时十根手指用完之后,就只能用进位的方式来表示更大的数值。当然凡事都有例外,玛雅人可能是因为长年光着脚的原因,把脚趾头也都用上了,于是他们使用了二十进制的计数法。基于这样的计数方式,玛雅人使用的历法跟我们平常使用的历法就产生了差异。按照玛雅人的历法,2012 年是上一个所谓的“太阳纪”的最后一年,而 2013 年则是新的“太阳纪”的开始。后来这件事情还被以讹传讹的方式误传为“2012 年是玛雅人预言的世界末日”的荒诞说法。今天有很多人猜测,玛雅文明之所以发展缓慢跟使用了二十进制是有关系的。对于计算机来说,二进制在物理器件上最容易实现的,因为可以用高电压表示 1,用低电压表示 0。不是所有写程序的人都需要熟悉二进制,熟悉十进制与二进制、八进制、十六进制的转换,大多数时候我们即便不了解这些知识也能写程序。但是,我们必须知道,计算机是使用二进制计数的,不管什么样的数据,到了计算机内存中都是以二进制形态存在的。
|
||||
|
||||
> **说明**:关于二进制计数法以及它与其他进制如何相互转换,随便找本名为《计算机导论》或《计算机文化》的书,都能找到相应的知识,此处就不再进行赘述了,不清楚的读者可以自行研究。
|
||||
> **说明**:关于二进制计数法以及它与其他进制如何相互转换,大家可以翻翻名为《计算机导论》或《计算机文化》的书,都能找到相应的知识,此处就不再进行赘述了,不清楚的读者可以自行研究。
|
||||
|
||||
### 变量和类型
|
||||
|
||||
|
|
@ -47,7 +47,7 @@
|
|||
- 惯例2:受保护的变量用单个下划线开头。
|
||||
- 惯例3:私有的变量用两个下划线开头。
|
||||
|
||||
惯例2和惯例3大家暂时不用理解,讲到后面自然会明白的。当然,作为一个专业的程序员,给变量命名时做到**见名知意**也是非常重要,这彰显了一个程序员的专业气质,很多开发岗位的面试也非常看重这一点。
|
||||
惯例2和惯例3大家暂时不用管,讲到后面自然会明白的。当然,作为一个专业的程序员,给变量命名时做到**见名知意**也是非常重要,这彰显了一个程序员的专业气质,很多开发岗位的面试也非常看重这一点。
|
||||
|
||||
### 变量的使用
|
||||
|
||||
|
|
|
|||
|
|
@ -1,6 +1,6 @@
|
|||
## Python语言中的运算符
|
||||
|
||||
Python 语言支持很多种运算符,下面的表格按照运算符的优先级从高到低,对 Python 中的运算符进行了罗列。有了变量和运算符,我们就可以构造各种各样的表达式来解决实际问题。在计算机科学中,**表达式是计算机程序中的句法实体,它由一个或多个常量、变量、函数和运算符组合而成,编程语言可以对其进行解释和计算以得到另一个值**。不管使用什么样的编程语言,构造表达式都是非常重要的。
|
||||
Python 语言支持很多种运算符,下面的表格按照运算符的优先级从高到低,对 Python 中的运算符进行了罗列。有了变量和运算符,我们就可以构造各种各样的表达式来解决实际问题。在计算机科学中,**表达式是计算机程序中的句法实体,它由一个或多个常量、变量、函数和运算符组合而成,编程语言可以对其进行解释和计算以得到另一个值**。不理解这句话没有关系,但是一定要知道,不管使用什么样的编程语言,构造表达式都是非常重要的。
|
||||
|
||||
| 运算符 | 描述 |
|
||||
| ------------------------------------------------------------ | ------------------------------ |
|
||||
|
|
@ -19,7 +19,7 @@ Python 语言支持很多种运算符,下面的表格按照运算符的优先
|
|||
| `not`、`or`、`and` | 逻辑运算符 |
|
||||
| `=`、`+=`、`-=`、`*=`、`/=`、`%=`、`//=`、`**=`、`&=`、`|=`、`^=`、`>>=`、`<<=` | 赋值运算符 |
|
||||
|
||||
>**说明**: 所谓优先级就是在一个运算的表达式中,如果出现了多个运算符,应该先执行什么再执行什么的顺序。编写代码的时候,如果搞不清楚一个表达式中运算符的优先级,可以使用圆括号来确保运算的执行顺序。
|
||||
>**说明**: 所谓优先级就是在一个运算的表达式中,如果出现了多个运算符,应该先执行什么再执行什么的顺序。编写代码的时候,如果搞不清楚一个表达式中运算符的优先级,可以使用圆括号(小括号)来确保运算的执行顺序。
|
||||
|
||||
### 算术运算符
|
||||
|
||||
|
|
@ -74,11 +74,27 @@ a *= a + 2 # 相当于:a = a * (a + 2)
|
|||
print(a) # 大家算一下这里会输出什么
|
||||
```
|
||||
|
||||
> **注意**:赋值运算构成的表达式本身不产生任何值,为了解决这个问题,Python 3.8中引入了一个新的赋值运算符`:=`,我们通常称之为海象运算符,大家可以猜一猜它为什么叫这个名字,我们在后面用到的时候再为大家讲解这个运算符。
|
||||
赋值运算构成的表达式本身不产生任何值,也就是说,如果你把一个赋值表达式放到`print`函数中试图输出表达式的值,将会产生语法错误。为了解决这个问题,Python 3.8 中引入了一个新的赋值运算符`:=`,我们称之为海象运算符,大家可以猜一猜它为什么叫这个名字。海象运算符也是将运算符右侧的值赋值给左边的变量,与赋值运算符不同的是,运算符右侧的值也是整个表达式的值,看看下面的代码大家就明白了。
|
||||
|
||||
```python
|
||||
"""
|
||||
海象运算符
|
||||
|
||||
Version: 1.0
|
||||
Author: 骆昊
|
||||
"""
|
||||
# SyntaxError: invalid syntax
|
||||
# print((a = 10))
|
||||
# 海象运算符
|
||||
print((a := 10)) # 10
|
||||
print(a) # 10
|
||||
```
|
||||
|
||||
> **提示**:上面第 8 行代码如果不注释掉,运行代码会看到`SyntaxError: invalid syntax`错误信息,注意,这行代码中我们给`a = 10`加上了圆括号,如果不小心写成了`print(a = 10)`,会看到`TypeError: 'a' is an invalid keyword argument for print()`错误信息,后面讲到函数的时候,大家就会明白这个错误提示是什么意思了。
|
||||
|
||||
### 比较运算符和逻辑运算符
|
||||
|
||||
比较运算符也称为关系运算符,包括`==`、`!=`、`<`、`>`、`<=`、`>=`,我相信大家一看就能懂。需要提醒的是比较相等用的是`==`,请注意这里是两个等号,因为`=`是赋值运算符,我们在上面刚刚讲到过。比较不相等用的是`!=`,跟数学课本中使用的$\small{\neq}$并不相同,Python 2中曾经使用过`<>`来表示不等于,在 Python 3中使用`<>`会引发`SyntaxError`(语法错误)。比较运算符会产生布尔值,要么是`True`,要么是`False`。
|
||||
比较运算符也称为关系运算符,包括`==`、`!=`、`<`、`>`、`<=`、`>=`,我相信大家一看就能懂。需要提醒的是比较相等用的是`==`,请注意这里是两个等号,因为`=`是赋值运算符,我们在上面刚刚讲到过。比较不相等用的是`!=`,跟数学课本中使用的$\small{\neq}$并不相同,Python 2 中曾经使用过`<>`来表示不等于,在 Python 3 中使用`<>`会引发`SyntaxError`(语法错误)。比较运算符会产生布尔值,要么是`True`,要么是`False`。
|
||||
|
||||
逻辑运算符有三个,分别是`and`、`or`和`not`。`and`字面意思是“而且”,所以`and`运算符会连接两个布尔值或者产生布尔值的表达式,如果两边的布尔值都是`True`,那么运算的结果就是`True`;左右两边的布尔值有一个是`False`,最终的运算结果就是`False`。当然,如果`and`运算符左边的布尔值是`False`,不管右边的布尔值是什么,最终的结果都是`False`,这时运算符右边的布尔值会被跳过(专业的说法叫短路处理,如果`and`右边是一个表达式,那么这个表达式不会执行)。`or`字面意思是“或者”,所以`or`运算符也会连接两个布尔值或产生布尔值的表达式,如果两边的布尔值有任意一个是`True`,那么最终的结果就是`True`。当然,`or`运算符也是有短路功能的,当它左边的布尔值为`True`的情况下,右边的布尔值会被短路(如果`or`右边是一个表达式,那么这个表达式不会执行)。`not`运算符的后面可以跟一个布尔值,如果`not`后面的布尔值或表达式是`True`,那么运算的结果就是`False`;如果`not`后面的布尔值或表达式是`False`,那么运算的结果就是`True`。
|
||||
|
||||
|
|
|
|||
|
|
@ -1,6 +1,6 @@
|
|||
## 分支结构
|
||||
|
||||
迄今为止,我们写的 Python 代码都是一条一条语句按顺序向下执行的,这种代码结构叫做顺序结构。然而仅有顺序结构并不能解决所有的问题,比如我们设计一个游戏,游戏第一关的过关条件是玩家获得1000分,那么在第一关完成后,我们要根据玩家得到分数来决定是进入第二关,还是告诉玩家“Game Over”。在这样的场景下,我们的代码就会产生两个分支,而且这两个分支只有一个会被执行。类似的场景还有很多,我们将这种结构称之为“分支结构”或“选择结构”。给大家一分钟的时间,你应该可以想到至少5个以上类似的例子,赶紧试一试吧!
|
||||
迄今为止,我们写的 Python 代码都是一条一条语句按顺序向下执行的,这种代码结构叫做顺序结构。然而仅有顺序结构并不能解决所有的问题,比如我们设计一个游戏,游戏第一关的过关条件是玩家获得1000分,那么在第一关完成后,我们要根据玩家得到的分数来决定是进入第二关,还是告诉玩家“Game Over”。在这样的场景下,我们的代码就会产生两个分支,而且这两个分支只有一个会被执行。类似的场景还有很多,我们将这种结构称之为“分支结构”或“选择结构”。给大家一分钟的时间,你应该可以想到至少5个以上类似的例子,赶紧试一试吧!
|
||||
|
||||
### 使用if和else构造分支结构
|
||||
|
||||
|
|
@ -204,7 +204,7 @@ match status_code:
|
|||
print('状态码描述:', description)
|
||||
```
|
||||
|
||||
> **说明**:带有`_`的`case`语句在代码中起到通配符的作用,如果前面的分支都没有匹配上,代码就会来到`case _`。`case _`的使用是可选的,并非每种分支结构都要给出通配符选项。如果分支中出现了`case _`,它只能放在分支结构的最后面,如果它的后面还有其他的分支,那么这些分支将是不可达的。
|
||||
> **说明**:带有`_`的`case`语句在代码中起到通配符的作用,如果前面的分支都没有匹配上,代码就会来到`case _`。`case _`的是可选的,并非每种分支结构都要给出通配符选项。如果分支中出现了`case _`,它只能放在分支结构的最后面,如果它的后面还有其他的分支,那么这些分支将是不可达的。
|
||||
|
||||
当然,`match-case`语法还有很多高级玩法,我们等用到时候再为大家讲解,有一个合并模式可以在这里分享给大家。例如,我们要将响应状态码`401`、`403`和`404`归入一个分支,`400`和`405`归入到一个分支,其他保持不变,代码还可以这么写。
|
||||
|
||||
|
|
@ -270,7 +270,7 @@ else:
|
|||
print(f'{y = }')
|
||||
```
|
||||
|
||||
> **说明**:大家可以自己感受和评判一下上面两种写法哪一种更好。在[**Python之禅**](https://zhuanlan.zhihu.com/p/111843067)中有这么一句话:“**Flat is better than nested**”。之所以认为“扁平化”的代码更好,是因为代码嵌套的层次如果很多,会严重的影响代码的可读性。所以,我认为上面的代码第一种写法是更好的选择。
|
||||
> **说明**:大家可以自己感受和评判一下上面两种写法哪一种更好。在“[**Python 之禅**](https://zhuanlan.zhihu.com/p/111843067)”中有这么一句话:“**Flat is better than nested**”。之所以认为“扁平化”的代码更好,是因为代码嵌套的层次如果很多,会严重的影响代码的可读性。所以,我认为上面的代码第一种写法是更好的选择。
|
||||
|
||||
#### 例子2:百分制成绩转换成等级
|
||||
|
||||
|
|
|
|||
|
|
@ -334,4 +334,4 @@ print(f'你一共猜了{counter}次.')
|
|||
|
||||
### 总结
|
||||
|
||||
学会了 Python 中的分支结构和循环结构,我们就可以解决很多实际的问题了。通过这节课的学习,大家应该已经知道了可以用`for`和`while`关键字来构造循环结构。**如果事先知道循环结构重复的次数,我们通常使用`for`循环**;**如果循环结构的重复次数不能确定,可以用`while`循环**。此外,我们可以在循环结构中**使用`break`终止循环**,也可以在循环结构中**使用`continue`关键字让循环结构直接进入下一轮次**。
|
||||
学会了 Python 中的分支结构和循环结构,我们就可以解决很多实际的问题了。通过这节课的学习,大家应该已经知道了可以用`for`和`while`关键字来构造循环结构。**如果事先知道循环结构重复的次数,我们通常使用**`for`**循环**;**如果循环结构的重复次数不能确定,可以用**`while`**循环**。此外,我们可以在循环结构中**使用**`break`**终止循环**,**也可以在循环结构中使用**`continue`**关键字让循环结构直接进入下一轮次**。
|
||||
|
|
|
|||
Loading…
Reference in New Issue