Merge pull request #30 from Relph1119/master

修改全部的格式
This commit is contained in:
Datairon 2023-06-28 23:18:11 +08:00 committed by GitHub
commit d509b16237
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
9 changed files with 262 additions and 311 deletions

View File

@ -1,4 +1,4 @@
## 零基础学python编程思维课程简介
# 零基础学python编程思维课程简介
- 课程是由MIT6.00计算机科学和编程导论和笨方法学python结合编写的为的是帮助零基础的同学更好和更容易学习因为我是在学习不同课程时碰到很多问题原因是基础没打好通过学习这个课程可以清楚了解编程思维、代码规范、防御性编程等为以后的学习打好基础。
- 作为基础的一个课程不涉及算法只是基础的python语法和编程思维
@ -8,9 +8,10 @@
## 开源贡献
邓林权、沈一、覃嘉俊、马子阳、左凯文、肖桐、张国亮
邓林权、沈一、覃嘉俊、马子阳、左凯文、肖桐、张国亮、胡锐锋
## 课程内容
- 学习周期19天
- 任务安排:

View File

@ -1,4 +1,4 @@
## 零基础学python编程思维课程简介
# 零基础学python编程思维课程简介
- 课程是由MIT6.00计算机科学和编程导论和笨方法学python结合编写的为的是帮助零基础的同学更好和更容易学习因为我是在学习不同课程时碰到很多问题原因是基础没打好通过学习这个课程可以清楚了解编程思维、代码规范、防御性编程等为以后的学习打好基础。
- 作为基础的一个课程不涉及算法只是基础的python语法和编程思维
@ -8,7 +8,7 @@
## 开源贡献
邓林权、沈一、覃嘉俊、马子阳、左凯文、肖桐、张国亮
邓林权、沈一、覃嘉俊、马子阳、左凯文、肖桐、张国亮、胡锐锋
## 课程内容
- 学习周期19天

View File

@ -1,10 +1,8 @@
目录
- [task1-环境搭建与认识学习方法](/PythonThinking/task1-%E7%8E%AF%E5%A2%83%E6%90%AD%E5%BB%BA%E4%B8%8E%E8%AE%A4%E8%AF%86%E5%AD%A6%E4%B9%A0%E6%96%B9%E6%B3%95.md)
- [task2-数学运算、字符串和文本、列表](/PythonThinking/task2-%E6%95%B0%E5%AD%A6%E8%BF%90%E7%AE%97%E3%80%81%E5%AD%97%E7%AC%A6%E4%B8%B2%E5%92%8C%E6%96%87%E6%9C%AC%E3%80%81%E5%88%97%E8%A1%A8.md)
- [task3-字典、元组、布尔类型、读写文件](/PythonThinking/task3-%E5%AD%97%E5%85%B8%E3%80%81%E5%85%83%E7%BB%84%E3%80%81%E5%B8%83%E5%B0%94%E7%B1%BB%E5%9E%8B%E3%80%81%E8%AF%BB%E5%86%99%E6%96%87%E4%BB%B6.md)
- [task4-函数](/PythonThinking/task4-%E5%87%BD%E6%95%B0.md)
- [task5-编程习惯养成与思维](/PythonThinking/task5-%E7%BC%96%E7%A8%8B%E4%B9%A0%E6%83%AF%E5%85%BB%E6%88%90%E4%B8%8E%E6%80%9D%E7%BB%B4.md)
- [task6-FOR、IF以及while](/PythonThinking/task6-FOR%E3%80%81IF%E4%BB%A5%E5%8F%8Awhile.md)
- [task7-面向对象的编程](/PythonThinking/task7-%E9%9D%A2%E5%90%91%E5%AF%B9%E8%B1%A1%E7%9A%84%E7%BC%96%E7%A8%8B.md)
- [task2&3 课后练习及补充](/PythonThinking/task2%263%20%E8%AF%BE%E5%90%8E%E7%BB%83%E4%B9%A0%E5%8F%8A%E8%A1%A5%E5%85%85.ipynb)
- [task7-面向对象的编程](/PythonThinking/task7-%E9%9D%A2%E5%90%91%E5%AF%B9%E8%B1%A1%E7%9A%84%E7%BC%96%E7%A8%8B.md)

View File

@ -1,4 +1,5 @@
# 前言
  课程设计是由笨方法学python和MIT 6.00课程结合改编而成作为基础的一个课程不涉及算法只是基础的python语法和编程思维。
  课程的目标是让0基础的同学学习后可以掌握python的基础使用以及看懂别人写的代码并运用以便学习更多的课程。
@ -7,7 +8,8 @@
  基础知识是采用笨方法学习法,其实是指令式学习,不采用复制粘贴的方式,针对每个代码进行复现,进步会很快,我个人觉得是很有效的学习方法,所以在这里是建议大家使用这个方法进行学习!!一起加油!!
## 笨方法学习法介绍(书中原文):
## 笨方法学习法介绍(书中原文)
  你将会做所有程序员学习一门编程语言都会做的非常简单的事情:
1. 做好每一个练习;
@ -64,7 +66,6 @@
  如果你学习了本课程,却还是不知道怎么编程,那也没关系,至少你试过了。你可以说你已经尽过力但成效不佳,但至少你试过了。这也是一件值得你骄傲的事情。
# 1 Python3的使用
  初学者建议先使用阿里云天池的DSWData Science Workshop进行学习可以直接在线上进行学习在学习一段时间后在本地电脑上安装Python3建议使用anaconda已经含有很多python3的库免去许多安装的烦恼。

View File

@ -1,4 +1,5 @@
# 2 基础
  关于基础部分我会选择Python的主要部分进行讲解以及提供深入的练习以及还有很多指令大家可以自己选择感兴趣或者要用到的进行补充这部分学习的思想主要是让大家学会自学编程语言。
## 2.1 实现第一行代码和认识注释
@ -85,17 +86,13 @@ Is it less or equal? False
  接下来挑战一下自己吧,来几个自我练习:
### 练习1
```{admonition} 附加练习
:class: tip
  在每一行上面,用 `#` 写一句注释,向自己解释这行代码的作用。
### 练习2
  找一些你需要计算的东西,然后写一个新的 `.py` 文件。
### 练习3
  用浮点数重新写一下`.py`文件的程序,让它更精确一些,比如 20.0 就是一个浮点数。
1. 在每一行上面,用 `#` 写一句注释,向自己解释这行代码的作用。
2. 找一些你需要计算的东西,然后写一个新的 `.py` 文件。
3. 用浮点数重新写一下`.py`文件的程序,让它更精确一些,比如 20.0 就是一个浮点数。
```
## 2.3 字符串和文本
@ -147,9 +144,11 @@ total = my_age + my_height + my_weight
print(f"If I add {my_age}, {my_height}, and {my_weight} I get {total}.")
```
#### 练习1
```{admonition} 附加练习
:class: tip
  将上述代码尝试改成自己的信息。
1. 将上述代码尝试改成自己的信息。
```
### 2.3.2 输入一整段字符串、变量和格式
@ -192,21 +191,14 @@ Isn't that joke so funny?! False
This is the left side of...a string with a right side.
```
#### 练习1
```{admonition} 附加练习
:class: tip
  复习一遍这个程序,并在每一行上面写上注释来解释它。
#### 练习2
  找到所有把字符串放在字符串里面的地方,一共有 4 处。
#### 练习3
  你确定有 4 处吗?你怎么知道?也许我爱撒谎呢。
#### 练习4
  解释一下为什么把 w 和 e 两个字符串用 + 连起来能够弄成一个更长的字符串。
1. 复习一遍这个程序,并在每一行上面写上注释来解释它。
2. 找到所有把字符串放在字符串里面的地方,一共有 4 处。
3. 你确定有 4 处吗?你怎么知道?也许我爱撒谎呢。
4. 解释一下为什么把 w 和 e 两个字符串用 + 连起来能够弄成一个更长的字符串。
```
### 2.3.3 把代码打乱
@ -214,7 +206,9 @@ This is the left side of...a string with a right side.
### 2.3.4 常见问题
  为什么你在一些字符串外面放的是单引号,而其他的不是?大多数是因为格式。但是如果一个字符串已经用了双引号,我就会在这个字符串里面用单引号,看看第 6 行和第 15 行你就知道了。
  为什么你在一些字符串外面放的是单引号,而其他的不是?
  **答:** 大多数是因为格式。但是如果一个字符串已经用了双引号,我就会在这个字符串里面用单引号,看看第 6 行和第 15 行你就知道了。
  如果你觉得一个笑话很好笑,可以写 hilarious = True 吗? 可以的,你会在后面学习到这些布尔值。
@ -248,12 +242,8 @@ runoob
['runoob', 786, 2.23, 'john', 70.2, 123, 'john']
```
### 练习1
  搜索列表的相关知识,看看还有什么操作?
```{admonition} 附加练习
:class: tip
1. 搜索列表的相关知识,看看还有什么操作?
```

View File

@ -1,5 +1,7 @@

# 2 基础(续)
## 2.5 字典
  现在你要学习 Python 中的另一种数据结构——字典Dictionary。字典也叫 dict是一种和列表类似的数据存储方式。但是不同于列表只能用数字获取数据字典可以用任何东西来获取。你可以把字典当成是一个存储和组织数据的数据库。
  让我们比较一下列表和字典的作用。你看,列表可以让你做这些事情:
@ -126,9 +128,11 @@ city = cities.get('TX', 'Does Not Exist')
print(f"The city for the state 'TX' is: {city}")
```
### 练习1
```{admonition} 附加练习
:class: tip
  完成一个小练习,尝试自己写一个中国省份与省份缩写对应的字典代码
1. 完成一个小练习,尝试自己写一个中国省份与省份缩写对应的字典代码
```
## 2.6 元组
@ -270,34 +274,33 @@ And finally, we close it.
  现在,用编辑器打开你创建的文件(比如我的是 test.txt检查一下是不是对的。
### 附加练习
```{admonition} 附加练习
:class: tip
#### 练习1
  如果你理解不了这个练习,回过头去按照给每行加注释的方法再过一遍,注释能帮助你理解每一行的意思,至少让你知道你不理解的地方在哪里,然后动手去查找答案。
#### 练习2
  写一个类似于上述读取文件的练习代码,使用`read`和`argv`来读取你刚刚创建的文件。
#### 练习3
  这个练习中有太多的重复,试着用一个`target.write()`命令来打印 line1、line2、line3你可以使用字符串、格式字符串和转义字符。
#### 练习4
  弄明白为什么我们要用一个`w`作为一个额外的参数来打开。提示:通过明确说明你想要写入一个文件,来安全地打开它。
#### 练习5
  如果你用`w`模式打开文件,那你还需要`target.truncate()`吗?读一读 Python 的 open 函数文件,来搞明白这个问题。
1. 如果你理解不了这个练习,回过头去按照给每行加注释的方法再过一遍,注释能帮助你理解每一行的意思,至少让你知道你不理解的地方在哪里,然后动手去查找答案。
2. 写一个类似于上述读取文件的练习代码,使用`read`和`argv`来读取你刚刚创建的文件。
3. 这个练习中有太多的重复,试着用一个`target.write()`命令来打印 line1、line2、line3你可以使用字符串、格式字符串和转义字符。
4. 弄明白为什么我们要用一个`w`作为一个额外的参数来打开。提示:通过明确说明你想要写入一个文件,来安全地打开它。
5. 如果你用`w`模式打开文件,那你还需要`target.truncate()`吗?读一读 Python 的 open 函数文件,来搞明白这个问题。
```
### 2.8.2 常见问题
1. **`truncate()` 对于 `w` 参数来说是必须的吗?** 详见附加练习5。
2. **`w` 到底是什么意思?** 它真的只是一个有字符的字符串,来表示文件的一种模式。如果你用了`w` ,就代表用`write`模式打开这个文件。此外还有`r`表示 read 模式,`a`表示增补模式后面还可能加一些修饰符modifiers
3. **我能对文件使用哪些修饰符?** 目前最重要的一个就是 `+` ,你可以用`w+`、`r+`以及`a+`。这样会让文件以读和写的模式打开,取决于你用的是那个符号以及文件所在的位置等。
4. **如果只输入 `open(filename)` 是不是就用 `r` (读)模式打开?** 是的,那是`open()`函数的默认值。
1. `truncate()` 对于 `w` 参数来说是必须的吗?
  **答:** 详见附加练习5。
2. `w` 到底是什么意思?
  **答:** 它真的只是一个有字符的字符串,来表示文件的一种模式。如果你用了`w` ,就代表用`write`模式打开这个文件。此外还有`r`表示 read 模式,`a`表示增补模式后面还可能加一些修饰符modifiers
3. 我能对文件使用哪些修饰符?
  **答:** 目前最重要的一个就是 `+` ,你可以用`w+`、`r+`以及`a+`。这样会让文件以读和写的模式打开,取决于你用的是那个符号以及文件所在的位置等。
4. 如果只输入 `open(filename)` 是不是就用 `r` (读)模式打开?
  **答:** 是的,那是`open()`函数的默认值。
### 2.8.3 读写文件方法与经验总结

View File

@ -1,4 +1,6 @@
## 2.9 函数
# 2 基础(续)
## 2.9 函数
  这是一个很大的标题,接下来我要给你介绍一下函数。每一个程序员都要一遍一遍地用到函数,思考它们的作用以及如何使用它们,但是我会给你一些最简单的解释,让你能够快速上手。
@ -66,41 +68,20 @@ I got nothin'.
  现在你已经看到了函数是如何工作的。注意使用函数的方式就像你使用`exists`、`open`等其他一些“命令”一样。其实我一直在跟你卖关子,因为在 Python 里面,这些“命令”就是“函数”。这意味着你可以创建你自己的命令然后在你的脚本中使用。
#### 附加练习
```{admonition} 附加练习
:class: tip
创建一个如下的函数 checklist (核查表)用于后面的练习。把这些内容写在索引卡上,一直保留到你完成所有剩余练习的时候或者当你感觉你不再需要这些索引卡的时候
创建一个如下的函数 checklist (核查表)用于后面的练习。把这些内容写在索引卡上,一直保留到你完成所有剩余练习的时候或者当你感觉你不再需要这些索引卡的时候
##### 练习1
  你是否用 `def` 来创建函数了?
##### 练习2
  你的函数名是只包含字符和 `_` (下划线)吗?
##### 练习3
  你在函数名后面放 `(` (左圆括号)了吗?
##### 练习4
  你在左圆括号后面放参数argument了吗参数之间是以逗号隔开的吗
##### 练习5
  你的每个参数都是唯一的吗(即没有重名)?
##### 练习6
  你在参数后面放 `)` (右圆括号)和 `:` (冒号)了吗?
##### 练习7
  你在与这个函数相关的代码行前面加上四个空格的缩进了吗?(不能多,也不能少)
##### 练习8
  你是通过另起一行不缩进来结束你的函数的吗?
1. 你是否用 `def` 来创建函数了?
2. 你的函数名是只包含字符和 `_` (下划线)吗?
3. 你在函数名后面放 `(` (左圆括号)了吗?
4. 你在左圆括号后面放参数argument了吗参数之间是以逗号隔开的吗
5. 你的每个参数都是唯一的吗(即没有重名)?
6. 你在参数后面放 `)` (右圆括号)和 `:` (冒号)了吗?
7. 你在与这个函数相关的代码行前面加上四个空格的缩进了吗?(不能多,也不能少)
8. 你是通过另起一行不缩进来结束你的函数的吗?
```
---
Tips
@ -117,9 +98,13 @@ Tips
#### 常见问题
1. **函数名称有哪些要求?** 跟变量名一样,任何不以数字开头的字母、数字、下划线组合都可以。
1. 函数名称有哪些要求?
2. **`\*args` 中的 `\*` 是什么作用?** 这是告诉 Python 取所有的参数给函数,然后把它们放在`args`里放成一列,很像你之前学的`argv`,只不过这个是为函数设置的。这种不常用,除非有特殊需要。
  **答:** 跟变量名一样,任何不以数字开头的字母、数字、下划线组合都可以。
2. `\*args` 中的 `\*` 是什么作用?
  **答:** 这是告诉 Python 取所有的参数给函数,然后把它们放在`args`里放成一列,很像你之前学的`argv`,只不过这个是为函数设置的。这种不常用,除非有特殊需要。
  **这部分好无聊好烦人啊。** 这就对了,这说明你已经开始一边输入代码一边思考它的作用了。如果想让它不这么无聊,按照我的要求一字不差地输入进去,然后再故意打乱它们,看看你能不能修复好。
@ -193,35 +178,43 @@ Man that's enough for a party!
Get a blanket.
```
#### 附加练习
```{admonition} 附加练习
:class: tip
##### 练习1
  回顾一遍这个脚本,然后在每一行上方加上注释,解释它的作用。
##### 练习2
  从下到上阅读每一行,说出所有重要的字符。
##### 练习3
  写至少一个自己设计的函数,然后用 10 种不同的方式运行它。
1. 回顾一遍这个脚本,然后在每一行上方加上注释,解释它的作用。
2. 从下到上阅读每一行,说出所有重要的字符。
3. 写至少一个自己设计的函数,然后用 10 种不同的方式运行它。
```
#### 常见问题
1. **运行一个函数怎么可能有 10 种不同的方式?** 爱信不信,理论上讲,任何函数都有无数种调用方式。看看你对于函数、变量以及用户输入的创造力有多强。
1. 运行一个函数怎么可能有 10 种不同的方式?
  **答:** 爱信不信,理论上讲,任何函数都有无数种调用方式。看看你对于函数、变量以及用户输入的创造力有多强。
  **有没有什么方法能分析函数是如何运行的,以帮助我更好地理解它?** 有很多方法,但是你先试试给每行加注释这种方式。其他方法包括大声把代码读出来,或者把代码打印出来然后在上面画图,来展示它是怎么运行的。
2. 有没有什么方法能分析函数是如何运行的,以帮助我更好地理解它?
  **答:** 有很多方法,但是你先试试给每行加注释这种方式。其他方法包括大声把代码读出来,或者把代码打印出来然后在上面画图,来展示它是怎么运行的。
2. **如果我想问用户关于`cheese`和`crackers`的数字呢?** 你需要用`int()`来把通过`input()`获取的内容转化成数值。
3. 如果我想问用户关于`cheese`和`crackers`的数字呢?
3. **在函数中创建`amount_of_cheese`这个变量会改变`cheese_count`这个变量吗?** 不会的,这些变量是相互独立并存在于函数之外的。它们之后会传递给函数,而且是“暂时版”,只是为了让函数运行。当函数退出之后,这些暂时的变量就会消失,其他一切正常运行。接着往下学,你会慢慢明白的
  **答:** 你需要用`int()`来把通过`input()`获取的内容转化成数值
4. **像`amount_of_cheese`这样的全局变量(`global variables`)跟函数变量同名的话是不是不太好?** 是的,如果这样的话,你就不知道说的到底是哪个变量了。不过有时候可能不得不用同样的名字,或者可能不小心同名了,不管怎么样,尽量避免这种情况。
4. 在函数中创建`amount_of_cheese`这个变量会改变`cheese_count`这个变量吗?
5. **一个函数里包含的参数有数量限制吗?** 这取决于 Python 的版本以及你的电脑,但是这个数量其实相当大。实践中一个函数包含 5 个参数为宜,再多就比较难用了
  **答:** 不会的,这些变量是相互独立并存在于函数之外的。它们之后会传递给函数,而且是“暂时版”,只是为了让函数运行。当函数退出之后,这些暂时的变量就会消失,其他一切正常运行。接着往下学,你会慢慢明白的
6. **你能在一个函数里面调用一个函数吗?** 可以,在之后的练习里会创建一个小游戏,到时候就会用到这个。
5. 像`amount_of_cheese`这样的全局变量(`global variables`)跟函数变量同名的话是不是不太好?
  **答:** 是的,如果这样的话,你就不知道说的到底是哪个变量了。不过有时候可能不得不用同样的名字,或者可能不小心同名了,不管怎么样,尽量避免这种情况。
6. 一个函数里包含的参数有数量限制吗?
  **答:** 这取决于 Python 的版本以及你的电脑,但是这个数量其实相当大。实践中一个函数包含 5 个参数为宜,再多就比较难用了。
7. 你能在一个函数里面调用一个函数吗?
  **答:** 可以,在之后的练习里会创建一个小游戏,到时候就会用到这个。
### 2.9.3 函数和文件
@ -285,39 +278,37 @@ Let's print three lines:
3 This is line 3
```
#### 附加练习
```{admonition} 附加练习
:class: tip
##### 练习1
  在每一行上方添加注释解释它的作用。
##### 练习2
  每次`print_a_line`运行的时候,都在传入一个`current_line`变量。写出每一次调用函数的时候`current_line`等于什么,然后找出它是如何变成`print_a_line`里面的`line_count`的。
##### 练习3
  找出每一个用到函数的地方,然后检查它的`def`确保你给出了正确的参数。
##### 练习4
  在网上搜搜`seek`这个函数的作用。试着输入`pydoc file`,看看你能否从这里看明白。然后试着输入`pydoc file.seek`,再看看`seek`是用来干嘛的。
##### 练习5
  搜一下简化符号`+=`,然后用`+=`重新写这个脚本。
1. 在每一行上方添加注释解释它的作用。
2. 每次`print_a_line`运行的时候,都在传入一个`current_line`变量。写出每一次调用函数的时候`current_line`等于什么,然后找出它是如何变成`print_a_line`里面的`line_count`的。
3. 找出每一个用到函数的地方,然后检查它的`def`确保你给出了正确的参数。
4. 在网上搜搜`seek`这个函数的作用。试着输入`pydoc file`,看看你能否从这里看明白。然后试着输入`pydoc file.seek`,再看看`seek`是用来干嘛的。
5. 搜一下简化符号`+=`,然后用`+=`重新写这个脚本。
```
#### 常见问题
1. **在`print_all`和其他函数里的`f`是什么东西?** `f`是一个变量,就像你在练习 18 中函数的变量一样,只不过这次它是一个文件。文件在 Python 里面有点类似于一个老式电脑里面的磁带驱动器,或者一个 DVD 播放机。它有一个“读取头”read head你可以在文件里`seek`(寻找)这个读取头所在的位置,然后在那里工作。每次你做`f.seek(0)`的时候,都会从移动到文件最开始,每次执行`f.readline()`的时候,都在从文件里读取一行内容,并且把读取头移动到`\n`后面,也就是每行结束的地方。我会在后面给你做更详细的解释。
1. 在`print_all`和其他函数里的`f`是什么东西?
2. **为什么`seek(0)`没有把`current_line`设置为0** 首先,`seek()`函数处理的是字节bytes不是行。`seek(0)` 这个代码把文件移动到0字节也就是第一个字节处。其次`current_line`只是一个变量并且跟这个文件没有任何实际联系。我们是在手动累加它
  **答:** `f`是一个变量,就像你在练习 18 中函数的变量一样,只不过这次它是一个文件。文件在 Python 里面有点类似于一个老式电脑里面的磁带驱动器,或者一个 DVD 播放机。它有一个“读取头”read head你可以在文件里`seek`(寻找)这个读取头所在的位置,然后在那里工作。每次你做`f.seek(0)`的时候,都会从移动到文件最开始,每次执行`f.readline()`的时候,都在从文件里读取一行内容,并且把读取头移动到`\n`后面,也就是每行结束的地方。我会在后面给你做更详细的解释。
3. **什么是`+=`** 你知道在英语里我们可以把 “it is” 写成 “it's” ,或者把 “you are” 写成“you're” 这叫缩写contraction。而`+=`就像`=`和`+`两种运算的缩写。也就是`x = x + y`就等同于`x += y`。
2. 为什么`seek(0)`没有把`current_line`设置为0
4. **`readline()`是怎么知道每一行在哪儿的?** `readline()`里面的代码能够扫描文件的每个字节,当它发现一个`\n`字符,它就会停止扫描这个文件,然后回到它发现的地方。文件`f`就负责在每次调用`readline()`之后维持文件的当前位置,以此来保证它能阅读到每一行
  **答:** 首先,`seek()`函数处理的是字节bytes不是行。`seek(0)` 这个代码把文件移动到0字节也就是第一个字节处。其次`current_line`只是一个变量并且跟这个文件没有任何实际联系。我们是在手动累加它。
5. **为什么文件中的行之间会有空行?** `readline()`函数返回文件中每行最后的`\n` 。又在`print`函数的结尾加上一个`end = " "`来避免给每行加上两个`\n`。
3. 什么是`+=`
  **答:** 你知道在英语里我们可以把 “it is” 写成 “it's” ,或者把 “you are” 写成“you're” 这叫缩写contraction。而`+=`就像`=`和`+`两种运算的缩写。也就是`x = x + y`就等同于`x += y`。
4. `readline()`是怎么知道每一行在哪儿的?
  **答:** `readline()`里面的代码能够扫描文件的每个字节,当它发现一个`\n`字符,它就会停止扫描这个文件,然后回到它发现的地方。文件`f`就负责在每次调用`readline()`之后维持文件的当前位置,以此来保证它能阅读到每一行。
5. 为什么文件中的行之间会有空行?
  **答:** `readline()`函数返回文件中每行最后的`\n` 。又在`print`函数的结尾加上一个`end = " "`来避免给每行加上两个`\n`。
### 2.9.4 函数可以返回一些东西
@ -388,38 +379,27 @@ That becomes: -4391.0
Can you do it by hand?
```
#### 附加练习
```{admonition} 附加练习
:class: tip
##### 练习1
  如果你还不能真正理解`return`是干什么的,试着写几个你自己的函数,并且让它们返回一些值。你可以让它`return`任何东西,只要你把它们放在`=`右边即可。
##### 练习2
  脚本的最后是一个难题。我在用一个函数的返回值作为另一个函数的参数这是在一个链chain里面进行的这样就用函数创建了一个公式。它看起来确实很难但是如果你运行这个脚本你就可以看到结果。你要做的就是试着弄明白创建同样操作的平常的函数是什么样的。
##### 练习3
  一旦你有了可以解出这个难题的公式,试着对函数的某些部分做做改动,看看会发生什么。有意改动一些数让它产生一些不同的值。
##### 练习4
  做相反的操作。写一个简单的公式,然后用同一种方式通过函数来计算它。
1. 如果你还不能真正理解`return`是干什么的,试着写几个你自己的函数,并且让它们返回一些值。你可以让它`return`任何东西,只要你把它们放在`=`右边即可。
2. 脚本的最后是一个难题。我在用一个函数的返回值作为另一个函数的参数这是在一个链chain里面进行的这样就用函数创建了一个公式。它看起来确实很难但是如果你运行这个脚本你就可以看到结果。你要做的就是试着弄明白创建同样操作的平常的函数是什么样的。
3. 一旦你有了可以解出这个难题的公式,试着对函数的某些部分做做改动,看看会发生什么。有意改动一些数让它产生一些不同的值。
4. 做相反的操作。写一个简单的公式,然后用同一种方式通过函数来计算它。
```
  这个练习可能真的很让你头大,但是放松,慢点学,把它当成是一个小游戏。正是解决这样的难题让编程如此有趣,所以之后我还会再给你一些小问题让你解决。
#### 常见问题
1. **为什么 python 是“从后往前”backward打印公式或者函数的** 它其实不是从后往前它是从里到外inside out。当你开始把代码打乱成分开的公式和函数时你会看到它是如何工作的。试着理解我说的 “inside out” 而不是 “backward” 。
2. **我如何使用`input()`来输入我自己的值?** 还记得`int(input())`吗?这样做的问题是你不能输入浮点数,所以试着用`float(input())`来代替。
3. **你说的“写一个公式”是什么意思?** 先试试`24 + 34 / 100 - 1023`吧,变成使用函数来计算。然后自己想出一个类似的数学公式,要用变量让它看起来更像一个公式。
1. 为什么 python 是“从后往前”backward打印公式或者函数的
  **答:** 它其实不是从后往前它是从里到外inside out。当你开始把代码打乱成分开的公式和函数时你会看到它是如何工作的。试着理解我说的 “inside out” 而不是 “backward” 。
2. 我如何使用`input()`来输入我自己的值?
  **答:** 还记得`int(input())`吗?这样做的问题是你不能输入浮点数,所以试着用`float(input())`来代替。
3. 你说的“写一个公式”是什么意思?
  **答:** 先试试`24 + 34 / 100 - 1023`吧,变成使用函数来计算。然后自己想出一个类似的数学公式,要用变量让它看起来更像一个公式。

View File

@ -1,8 +1,8 @@
## 4 FOR、IF以及while
# 4 FOR、IF以及while
### 4.1 IF语句
## 4.1 IF语句
#### 4.1.1 IF语句的使用
### 4.1.1 IF语句的使用
```{code-block} python
:linenos:
@ -48,35 +48,25 @@ People are less than or equal to dogs.
People are dogs.
```
##### 附加练习
```{admonition} 附加练习
:class: tip
附加练习中,试着猜猜`if`语句是什么以及它是干什么的。在继续进行下个练习之前,试着用自己的话回答以下这些问题:
在练习中,试着猜猜`if`语句是什么以及它是干什么的。在继续进行下个练习之前,试着用自己的话回答以下这些问题:
###### 练习1
1. 你认为`if`对它下面的代码起什么作用?
2. 为什么`if`下面的代码要缩进 4 个空格?
3. 如果没有缩进会发生什么?
4. 你能把一些布尔表达式放进`if`语句吗?试试看。
5. 如果你改变`people`、`cats`和`dogs`的初始值会发生什么?
```
  你认为`if`对它下面的代码起什么作用?
#### 常见问题
###### 练习2
`+=`是什么意思?
  为什么`if`下面的代码要缩进 4 个空格?
**答:** `x += 1`就相当于`x = x + 1`但是输入的内容更少。你可以把它叫做“累加”increment by运算符。之后你还会学到`-=`这样类似的表达。
###### 练习3
  如果没有缩进会发生什么?
###### 练习4
  你能把一些布尔表达式放进`if`语句吗?试试看。
###### 练习5
  如果你改变`people`、`cats`和`dogs`的初始值会发生什么?
##### 常见问题
  `+=`是什么意思? `x += 1`就相当于`x = x + 1`但是输入的内容更少。你可以把它叫做“累加”increment by运算符。之后你还会学到`-=`这样类似的表达。
#### 4.1.2. Else 和 IF 使用
### 4.1.2. Else 和 IF 使用
  在上个练习中你学到了一些`if`语句,思考了它的含义和作用。在你学习更多内容之前,我会解释一下上个附加练习中的问题。首先确定你做了那些练习。
@ -138,29 +128,22 @@ Maybe we could take the trucks.
Alright, let's just take the trucks.
```
##### 附加练习
```{admonition} 附加练习
:class: tip
###### 练习1
1. 试着猜猜`elif`和`else`的作用是什么。
2. 改变`cars`、`people`和`trucks`的数值,然后追溯每一个`if`语句,看看什么会被打印出来。
3. 试试一些更复杂的布尔表达式,比如`cars > people`或者`trucks < cars`
4. 在每一行上面加上注释。
```
&emsp;&emsp;试着猜猜`elif`和`else`的作用是什么。
#### 常见问题
###### 练习2
如果多个`elif`块都是`True`会发生什么?
&emsp;&emsp;改变`cars`、`people`和`trucks`的数值,然后追溯每一个`if`语句,看看什么会被打印出来
**答:** Python 从顶部开始,然后运行第一个是`True`的代码块,也就是说,它只会运行第一个
###### 练习3
&emsp;&emsp;试试一些更复杂的布尔表达式,比如`cars > people`或者`trucks < cars`
###### 练习4
&emsp;&emsp;在每一行上面加上注释。
##### 常见问题
&emsp;&emsp;如果多个`elif`块都是`True`会发生什么? Python 从顶部开始,然后运行第一个是`True`的代码块,也就是说,它只会运行第一个。
#### 4.1.3 IF嵌套使用
### 4.1.3 IF嵌套使用
&emsp;&emsp;前面主要学习了调用函数、打印东西,但是这些基本都是直线运行下来的。你的脚本从上面开始运行,然后到底部结束。如果你用了一个函数,你可以随后再运行它,但是仍然不会有分叉需要你做决定的情况。现在你学习了`if`、`else`以及`elif`,你就可以让脚本来做决定了。
@ -213,7 +196,7 @@ else:
&emsp;&emsp;确保你理解了在`if`语句中嵌套`if`语句的理念。可以通过做附加练习来真正掌握它。
##### 你会看到
#### 你会看到
&emsp;&emsp;这是我玩这个冒险小游戏的结果,我可能玩得没那么好。
@ -229,19 +212,27 @@ What do you do?
The bear eats your legs off. Good job!
```
##### 附加练习
```{admonition} 附加练习
:class: tip
&emsp;&emsp;给这个游戏加一些新内容,同时改变用户可以做的决定。尽可能地扩展这个游戏,直到它变得很搞笑。写一个完全不同的新游戏。可能你不喜欢我的这个,你可以做一个你自己的。
给这个游戏加一些新内容,同时改变用户可以做的决定。尽可能地扩展这个游戏,直到它变得很搞笑。写一个完全不同的新游戏。可能你不喜欢我的这个,你可以做一个你自己的。
```
##### 常见问题
#### 常见问题
1. **我能用一系列的`if`语句来代替`elif`吗?** 在某些情况下可以,但是取决于每个`if/else`是怎么写的。如果这样的话还意味着 Python 将会检查每一个`if-else`组合,而不是像`if-elif-else`组合那样只会检查第一个是`false`的。你可以多试几次,感受一下区别。
1. 我能用一系列的`if`语句来代替`elif`吗?
2. **我如何表示一个数字的区间?** 有两种方式:一种是`0 < x < 10`或者`1 <= x < 10`这种传统表示方法另一种是`x`的区间是`(1, 10)`。
&emsp;&emsp;**答:** 在某些情况下可以,但是取决于每个`if/else`是怎么写的。如果这样的话还意味着 Python 将会检查每一个`if-else`组合,而不是像`if-elif-else`组合那样只会检查第一个是`false`的。你可以多试几次,感受一下区别。
3. **如果我想在`if-elif-else`代码块中放更多的选择怎么办?** 为每种可能的选择增加更多的`elif`块。
2. 我如何表示一个数字的区间?
### 4.2 FOR语句
&emsp;&emsp;**答:** 有两种方式:一种是`0 < x < 10`或者`1 <= x < 10`这种传统表示方法另一种是`x`的区间是`(1, 10)`
3. 如果我想在`if-elif-else`代码块中放更多的选择怎么办?
&emsp;&emsp;**答:** 为每种可能的选择增加更多的`elif`块。
## 4.2 FOR语句
```{code-block} python
:linenos:
@ -308,34 +299,38 @@ Element was: 3
Element was: 4
Element was: 5
```
##### 附加练习
###### 练习1
```{admonition} 附加练习
:class: tip
&emsp;&emsp;看看你是如何使用`range`的。查阅上面的`range`函数并理解掌握。
1. 看看你是如何使用`range`的。查阅上面的`range`函数并理解掌握。
2. 你能在第 22 行不使用`for-loop`,而是直接把`range(0, 6)`赋给`elements`吗?
3. 找到 Python 文档关于列表的部分,然后读一读。看看除了`append`,你还能对列表做哪些操作?
```
###### 练习2
#### 常见问题
&emsp;&emsp;你能在第 22 行不使用`for-loop`,而是直接把`range(0, 6)`赋给`elements`吗
1. 如何创建一个二维列表
###### 练习3
&emsp;&emsp;**答:** 可以用这种列表中的列表:`[[1,2,3],[4,5,6]]`
&emsp;&emsp;找到 Python 文档关于列表的部分,然后读一读。看看除了`append`,你还能对列表做哪些操作?
2. 列表lists和数组arrays难道不是一个东西吗
##### 常见问题
&emsp;&emsp;**答:** 这取决于语言以及实现方法。在传统术语中,列表和数组的实现方式不同。在 Ruby 中都叫做`arrays`,在 python 中都叫做`lists`。所以我们就把这些叫做列表吧。
1. **如何创建一个二维列表?** 可以用这种列表中的列表:`[[1,2,3],[4,5,6]]`
3. 为什么`for-loop`可以用一个没有被定义的变量?
2. **列表lists和数组arrays难道不是一个东西吗** 这取决于语言以及实现方法。在传统术语中,列表和数组的实现方式不同。在 Ruby 中都叫做`arrays`,在 python 中都叫做`lists`。所以我们就把这些叫做列表吧
&emsp;&emsp;**答:** 变量在`for-loop`开始的时候就被定义了,它被初始化到了每一次`loop`迭代时的当前元素中
3. **为什么`for-loop`可以用一个没有被定义的变量?** 变量在`for-loop`开始的时候就被定义了,它被初始化到了每一次`loop`迭代时的当前元素中。
4. 为什么`range(1, 3)`中的`i`只循环了两次而不是三次?
4. **为什么`range(1, 3)`中的`i`只循环了两次而不是三次?** `range()`函数只处理从第一个到最后一个数,但不包括最后一个数,所以它在 2 就结束了。这是这类循环的通用做法。
&emsp;&emsp;**答:** `range()`函数只处理从第一个到最后一个数,但不包括最后一个数,所以它在 2 就结束了。这是这类循环的通用做法。
5. **`element.append()`的作用是什么?** 它只是把东西追加到列表的末尾。打开 Python shell 然后创建一个新列表。任何时候当你遇到类似的用法,试着多玩几次,去体会它们的作用。
5. `element.append()`的作用是什么?
&emsp;&emsp;**答:** 它只是把东西追加到列表的末尾。打开 Python shell 然后创建一个新列表。任何时候当你遇到类似的用法,试着多玩几次,去体会它们的作用。
### 4.3 while语句
## 4.3 while语句
&emsp;&emsp;现在我们来看一个新的循环:`while-loop`。只要一个布尔表达式是`True``while-loop`就会一直执行它下面的代码块。
@ -405,37 +400,29 @@ The numbers:
5
```
##### 附加练习
```{admonition} 附加练习
:class: tip
###### 练习1
1. 把这个`while-loop`转换成一个你可以调用的函数,然后用一个变量替代`i < 6`里面的`6`
2. 用这个函数重新写一下这个脚本,试试不同的数值。
3. 再增加一个变量给这个函数的参数,然后改变第 8 行的`+1`,让它增加的值与之前不同。
4. 用这个函数重新写这个脚本,看看会产生什么样的效果。
5. 用`for-loop`和`range`写这个脚本。你还需要中间的增加值吗?如果不去掉这个增加值会发生什么?
&emsp;&emsp;把这个`while-loop`转换成一个你可以调用的函数,然后用一个变量替代`i < 6`里面的`6`
注:任何时候你在运行程序的时候它失控了,只用按下 CTRL-C ,程序就会终止。
```
###### 练习2
#### 常见问题
&emsp;&emsp;用这个函数重新写一下这个脚本,试试不同的数值。
1. `for-loop`和`while-loop`的区别是什么?
###### 练习3
&emsp;&emsp;**答:** `for-loop`只能迭代(循环)一些东西的集合,而`while-loop`能够迭代(循环)任何类型的东西。不过,`while-loop`很难用对,而你通常能够用`for-loop`完成很多事情。
&emsp;&emsp;再增加一个变量给这个函数的参数,然后改变第 8 行的`+1`,让它增加的值与之前不同。
2. 循环好难,我应该如何理解它们?
###### 练习4
&emsp;&emsp;**答:** 人们不理解循环的主要原因是他们跟不上代码的运行。当一个循环运行的时候,它会过一遍代码块,到结尾之后再跳到顶部。为了直观表现这个过程,你可以用`print`打印出循环的整个过程,把`print`行写在循环的前面、顶部、中间、结尾。研究一下输出的内容,试着理解它是如何运行的。
&emsp;&emsp;用这个函数重新写这个脚本,看看会产生什么样的效果。
###### 练习5
&emsp;&emsp;用`for-loop`和`range`写这个脚本。你还需要中间的增加值吗?如果不去掉这个增加值会发生什么?
&emsp;&emsp;任何时候你在运行程序的时候它失控了,只用按下 CTRL-C ,程序就会终止。
##### 常见问题
1. **`for-loop`和`while-loop`的区别是什么?** `for-loop`只能迭代(循环)一些东西的集合,而`while-loop`能够迭代(循环)任何类型的东西。不过,`while-loop`很难用对,而你通常能够用`for-loop`完成很多事情。
2. **循环好难,我应该如何理解它们?** 人们不理解循环的主要原因是他们跟不上代码的运行。当一个循环运行的时候,它会过一遍代码块,到结尾之后再跳到顶部。为了直观表现这个过程,你可以用`print`打印出循环的整个过程,把`print`行写在循环的前面、顶部、中间、结尾。研究一下输出的内容,试着理解它是如何运行的。
### 4.4 分支和函数
## 4.4 分支和函数
&emsp;&emsp;目前为止你已经了解了`if`语句,函数以及列表。现在是时候深入学习一下了。照例输入如下代码,看看你能否明白程序在做什么。
@ -538,34 +525,30 @@ This room is full of gold. How much do you take?
You greedy bastard! Good job!
```
##### 附加练习
```{admonition} 附加练习
:class: tip
###### 练习1
1. 画一个这个游戏的流程图,并指出它是如何运转的。
2. 修正你的错误,包括拼写和语法错误。
3. 为你不理解的函数写上注释。
4. 为游戏增加一些功能,同时使代码更加简化。
5. 这个`gold_room`让你输入数字的方式有点奇怪。这样做有哪些`bug`?你能改善我的代码吗?可以查查看`int()`的相关知识。
```
&emsp;&emsp;画一个这个游戏的流程图,并指出它是如何运转的。
#### 常见问题
###### 练习2
1. 救命! 这个程序是怎么工作的!?
&emsp;&emsp;修正你的错误,包括拼写和语法错误
&emsp;&emsp;**答:** 当你遇到不理解的代码时,不要着急,只要在每行代码下面写下注释,弄清楚这一行是做什么的,就很容易明白。确保你的注释和代码一样简洁。 然后要么画图,要么写一段话来描述代码是如何运行的。这样你就会理解其背后的原理
###### 练习3
2. 为什么你要用`while True`
&emsp;&emsp;为你不理解的函数写上注释
&emsp;&emsp;**答:** 这样可以构建一个无限循环
###### 练习4
3. `exit(0)`是干什么用的?
&emsp;&emsp;为游戏增加一些功能,同时使代码更加简化
&emsp;&emsp;**答:** 在很多操作系统中,一个程序可以用`exit(0)`来结束,其中传入的数字代表是否有错误。如果你用`exit(1)`代表有1个错误`exit(0)`则代表程序正常退出。它不同于通常的布尔逻辑(`0==False`),因为你可以用不同的数字来表示不同的错误结果。你可以用`exit(100)`来表示与`exit(2)`或者`exit(1)`不同的错误结果
###### 练习5
4. 为什么`input()`有时会被写成`input('> ')`
&emsp;&emsp;这个`gold_room`让你输入数字的方式有点奇怪。这样做有哪些`bug`?你能改善我的代码吗?可以查查看`int()`的相关知识。
##### 常见问题
1. **救命! 这个程序是怎么工作的!?** 当你遇到不理解的代码时,不要着急,只要在每行代码下面写下注释,弄清楚这一行是做什么的,就很容易明白。确保你的注释和代码一样简洁。 然后要么画图,要么写一段话来描述代码是如何运行的。这样你就会理解其背后的原理。
2. **为什么你要用`while True`** 这样可以构建一个无限循环。
3. **`exit(0)`是干什么用的?** 在很多操作系统中,一个程序可以用`exit(0)`来结束,其中传入的数字代表是否有错误。如果你用`exit(1)`代表有1个错误`exit(0)`则代表程序正常退出。它不同于通常的布尔逻辑(`0==False`),因为你可以用不同的数字来表示不同的错误结果。你可以用`exit(100)`来表示与`exit(2)`或者`exit(1)`不同的错误结果。
4. **为什么`input()`有时会被写成`input('> ')`** `input`的参数是一个字符串,所以要在获取用户输入的内容前面加一个提示符。这里`>`也可以换成想要提示用户的文字。
&emsp;&emsp;**答:** `input`的参数是一个字符串,所以要在获取用户输入的内容前面加一个提示符。这里`>`也可以换成想要提示用户的文字。

View File

@ -1,8 +1,8 @@
## 5 面向对象的编程
# 5 面向对象的编程
&emsp;&emsp;Python 是一门“面向对象的编程语言”Object Oriented Programming。这是指 Python 中有一个叫做“类class”的结构能够让你用一种特定的方式结构化你的软件。通过使用类你可以让你的程序保持连贯性使用起来更清晰。至少理论上是这样。
### 5.1 类的例子
## 5.1 类的例子
```{code-block} python
:linenos:
@ -39,33 +39,26 @@ They rally around tha family
With pockets full of shells
```
#### 附加练习
```{admonition} 附加练习
:class: tip
##### 练习1
1. 用这个方法再写一些歌,确保你明白你正在用字符列表来传歌词。
2. 把歌词放在一个单独的变量里,然后把这个变量放在类里面来使用。
3. 如果你能搞定这些,可以用它来做更多的事情。要是你现在没什么想法也别担心,就试试看会发生什么。然后把它们掰开、揉碎、反复研究。
4. 在网上搜搜“面向对象的编程”,然后填满你的大脑。别担心你看不懂,因为几乎一半的东西我也看不懂。
```
&emsp;&emsp;用这个方法再写一些歌,确保你明白你正在用字符列表来传歌词。
### 常见问题
##### 练习2
为什么我在类下面用`__init__`函数或者其他函数的时候要用`self`
&emsp;&emsp;把歌词放在一个单独的变量里,然后把这个变量放在类里面来使用
**答:** 如果你不用`self`,那么像`cheese = 'Frank'`这样的代码就会很含糊,计算机不知道你是指实例的`cheese`属性还是一个叫做`cheese`的局部变量。而用`self.cheese = 'Frank'`的话就会很清晰,你是指实例的属性`self.cheese`
##### 练习3
&emsp;&emsp;如果你能搞定这些,可以用它来做更多的事情。要是你现在没什么想法也别担心,就试试看会发生什么。然后把它们掰开、揉碎、反复研究。
##### 练习4
&emsp;&emsp;在网上搜搜“面向对象的编程”,然后填满你的大脑。别担心你看不懂,因为几乎一半的东西我也看不懂。
#### 常见问题
&emsp;&emsp;**为什么我在类下面用`__init__`函数或者其他函数的时候要用`self` ** 如果你不用`self`,那么像`cheese = 'Frank'`这样的代码就会很含糊,计算机不知道你是指实例的`cheese`属性还是一个叫做`cheese`的局部变量。而用`self.cheese = 'Frank'`的话就会很清晰,你是指实例的属性`self.cheese`。
### 5.2 学着去说面向对象
## 5.2 学着去说面向对象
&emsp;&emsp;在这个练习中,我要教你如何去说“面向对象”。我所做的就是给你一些你需要了解的词和定义。然后我会给出一些需要填空的句子让你去理解。最后,你要完成一个大练习,从而在大脑中巩固这些句子。
#### 词汇训练
### 词汇训练
(注:为了方便理解,定义保留英文原文。)
- 类class :告诉 Python 创建一个新类型的东西Tell Python to make a new type of thing
@ -81,7 +74,7 @@ With pockets full of shells
&emsp;&emsp;花点时间为这些术语做一些闪词卡flash cards并记住它们虽然在你完成这个练习之前单纯的记忆没有任何意义但你必须要先了解这些基础的词汇。
#### 短语训练
### 短语训练
&emsp;&emsp;接下来是一些 Python 代码片段以及右边的解释。
@ -116,16 +109,18 @@ With pockets full of shells
&emsp;&emsp;同样地,把这些短语写到一些闪词卡上,然后记一记。把 Python 代码片段放在正面,解释的句子放在背面,你必须每次都正确说出每一个短语的意思。不是说得类似就行,而是要一模一样。
#### 综合训练
&emsp;&emsp;最后一项准备工作是把词汇训练和短语训练结合在一起,以下是训练内容:
```{admonition} 综合训练
:class: tip
1. 做一个短语卡然后练习记忆。
2. 把它翻过来,读句子,如果在句子中看到词汇训练中的词汇,就找到相应的词汇卡片。
3. 练习记忆这些词汇卡片。
4. 坚持练习,要是你感到有些累,就休息一下再继续。
```
#### 读更多代码
### 读更多代码
&emsp;&emsp;你现在需要继续读更多的代码,并在这些代码中复习你之前学过的短语。试着找到尽可能多的包含类的文件,然后跟着如下要求去做:
@ -136,7 +131,7 @@ With pockets full of shells
&emsp;&emsp;这些练习的目的是过一遍真实的代码并试着把你学过的短语和它们的用法匹配和关联起来。如果你做足了训练你会开始看到这些匹配模式match patterns呼之欲出而不再是一些你不明白的空格或字符。
### 5.3 编写一个属于自己的小游戏
## 5.3 编写一个属于自己的小游戏
&emsp;&emsp;以下是利用面向对象的编程方法写的宝可梦简单文字游戏,可以按照这个模板续写,或者根据自己的爱好更换角色和游戏方法。