diff --git a/PythonThinking/task1-环境搭建与认识学习方法.md b/PythonThinking/task1-环境搭建与认识学习方法.md index 03a5139..c44a760 100644 --- a/PythonThinking/task1-环境搭建与认识学习方法.md +++ b/PythonThinking/task1-环境搭建与认识学习方法.md @@ -8,7 +8,8 @@   基础知识是采用笨方法学习法,其实是指令式学习,不采用复制粘贴的方式,针对每个代码进行复现,进步会很快,我个人觉得是很有效的学习方法,所以在这里是建议大家使用这个方法进行学习!!一起加油!! -## 笨方法学习法介绍(书中原文): +## 笨方法学习法介绍(书中原文) +   你将会做所有程序员学习一门编程语言都会做的非常简单的事情: 1. 做好每一个练习; diff --git a/PythonThinking/task2-数学运算、字符串和文本、列表.md b/PythonThinking/task2-数学运算、字符串和文本、列表.md index a99c88f..8c43837 100644 --- a/PythonThinking/task2-数学运算、字符串和文本、列表.md +++ b/PythonThinking/task2-数学运算、字符串和文本、列表.md @@ -86,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 字符串和文本 @@ -148,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 输入一整段字符串、变量和格式 @@ -193,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 把代码打乱 @@ -215,7 +206,9 @@ This is the left side of...a string with a right side. ### 2.3.4 常见问题 -  为什么你在一些字符串外面放的是单引号,而其他的不是?大多数是因为格式。但是如果一个字符串已经用了双引号,我就会在这个字符串里面用单引号,看看第 6 行和第 15 行你就知道了。 +  为什么你在一些字符串外面放的是单引号,而其他的不是? + +  **答:** 大多数是因为格式。但是如果一个字符串已经用了双引号,我就会在这个字符串里面用单引号,看看第 6 行和第 15 行你就知道了。   如果你觉得一个笑话很好笑,可以写 hilarious = True 吗? 可以的,你会在后面学习到这些布尔值。 @@ -249,6 +242,8 @@ runoob ['runoob', 786, 2.23, 'john', 70.2, 123, 'john'] ``` -### 练习1 +```{admonition} 附加练习 +:class: tip -  搜索列表的相关知识,看看还有什么操作? +1. 搜索列表的相关知识,看看还有什么操作? +``` diff --git a/PythonThinking/task3-字典、元组、布尔类型、读写文件.md b/PythonThinking/task3-字典、元组、布尔类型、读写文件.md index cb1dc92..095a26c 100644 --- a/PythonThinking/task3-字典、元组、布尔类型、读写文件.md +++ b/PythonThinking/task3-字典、元组、布尔类型、读写文件.md @@ -128,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 元组 @@ -272,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 读写文件方法与经验总结 diff --git a/PythonThinking/task4-函数.md b/PythonThinking/task4-函数.md index ddd8129..1caa8f4 100644 --- a/PythonThinking/task4-函数.md +++ b/PythonThinking/task4-函数.md @@ -68,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: @@ -119,9 +98,13 @@ Tips: #### 常见问题 -1. **函数名称有哪些要求?** 跟变量名一样,任何不以数字开头的字母、数字、下划线组合都可以。 +1. 函数名称有哪些要求? -2. **`\*args` 中的 `\*` 是什么作用?** 这是告诉 Python 取所有的参数给函数,然后把它们放在`args`里放成一列,很像你之前学的`argv`,只不过这个是为函数设置的。这种不常用,除非有特殊需要。 +  **答:** 跟变量名一样,任何不以数字开头的字母、数字、下划线组合都可以。 + +2. `\*args` 中的 `\*` 是什么作用? + +  **答:** 这是告诉 Python 取所有的参数给函数,然后把它们放在`args`里放成一列,很像你之前学的`argv`,只不过这个是为函数设置的。这种不常用,除非有特殊需要。   **这部分好无聊好烦人啊。** 这就对了,这说明你已经开始一边输入代码一边思考它的作用了。如果想让它不这么无聊,按照我的要求一字不差地输入进去,然后再故意打乱它们,看看你能不能修复好。 @@ -195,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 函数和文件 @@ -287,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 函数可以返回一些东西 @@ -390,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`吧,变成使用函数来计算。然后自己想出一个类似的数学公式,要用变量让它看起来更像一个公式。 diff --git a/PythonThinking/task6-FOR、IF以及while.md b/PythonThinking/task6-FOR、IF以及while.md index 177f3ed..a77c0e2 100644 --- a/PythonThinking/task6-FOR、IF以及while.md +++ b/PythonThinking/task6-FOR、IF以及while.md @@ -48,33 +48,23 @@ People are less than or equal to dogs. People are dogs. ``` -#### 附加练习 +```{admonition} 附加练习 +:class: tip -在附加练习中,试着猜猜`if`语句是什么以及它是干什么的。在继续进行下个练习之前,试着用自己的话回答以下这些问题: +在练习中,试着猜猜`if`语句是什么以及它是干什么的。在继续进行下个练习之前,试着用自己的话回答以下这些问题: -##### 练习1 - -  你认为`if`对它下面的代码起什么作用? - -##### 练习2 - -  为什么`if`下面的代码要缩进 4 个空格? - -##### 练习3 - -  如果没有缩进会发生什么? - -##### 练习4 - -  你能把一些布尔表达式放进`if`语句吗?试试看。 - -##### 练习5 - -  如果你改变`people`、`cats`和`dogs`的初始值会发生什么? +1. 你认为`if`对它下面的代码起什么作用? +2. 为什么`if`下面的代码要缩进 4 个空格? +3. 如果没有缩进会发生什么? +4. 你能把一些布尔表达式放进`if`语句吗?试试看。 +5. 如果你改变`people`、`cats`和`dogs`的初始值会发生什么? +``` #### 常见问题 -  `+=`是什么意思? `x += 1`就相当于`x = x + 1`,但是输入的内容更少。你可以把它叫做“累加”(increment by)运算符。之后你还会学到`-=`这样类似的表达。 +`+=`是什么意思? + +**答:** `x += 1`就相当于`x = x + 1`,但是输入的内容更少。你可以把它叫做“累加”(increment by)运算符。之后你还会学到`-=`这样类似的表达。 ### 4.1.2. Else 和 IF 使用 @@ -138,27 +128,20 @@ Maybe we could take the trucks. Alright, let's just take the trucks. ``` -#### 附加练习 +```{admonition} 附加练习 +:class: tip -##### 练习1 - -  试着猜猜`elif`和`else`的作用是什么。 - -##### 练习2 - -  改变`cars`、`people`和`trucks`的数值,然后追溯每一个`if`语句,看看什么会被打印出来。 - -##### 练习3 - -  试试一些更复杂的布尔表达式,比如`cars > people`或者`trucks < cars`。 - -##### 练习4 - -  在每一行上面加上注释。 +1. 试着猜猜`elif`和`else`的作用是什么。 +2. 改变`cars`、`people`和`trucks`的数值,然后追溯每一个`if`语句,看看什么会被打印出来。 +3. 试试一些更复杂的布尔表达式,比如`cars > people`或者`trucks < cars`。 +4. 在每一行上面加上注释。 +``` #### 常见问题 -  如果多个`elif`块都是`True`会发生什么? Python 从顶部开始,然后运行第一个是`True`的代码块,也就是说,它只会运行第一个。 +如果多个`elif`块都是`True`会发生什么? + +**答:** Python 从顶部开始,然后运行第一个是`True`的代码块,也就是说,它只会运行第一个。 ### 4.1.3 IF嵌套使用 @@ -229,17 +212,25 @@ What do you do? The bear eats your legs off. Good job! ``` -#### 附加练习 +```{admonition} 附加练习 +:class: tip -  给这个游戏加一些新内容,同时改变用户可以做的决定。尽可能地扩展这个游戏,直到它变得很搞笑。写一个完全不同的新游戏。可能你不喜欢我的这个,你可以做一个你自己的。 +给这个游戏加一些新内容,同时改变用户可以做的决定。尽可能地扩展这个游戏,直到它变得很搞笑。写一个完全不同的新游戏。可能你不喜欢我的这个,你可以做一个你自己的。 +``` #### 常见问题 -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)`。 +  **答:** 在某些情况下可以,但是取决于每个`if/else`是怎么写的。如果这样的话还意味着 Python 将会检查每一个`if-else`组合,而不是像`if-elif-else`组合那样只会检查第一个是`false`的。你可以多试几次,感受一下区别。 -3. **如果我想在`if-elif-else`代码块中放更多的选择怎么办?** 为每种可能的选择增加更多的`elif`块。 +2. 我如何表示一个数字的区间? + +  **答:** 有两种方式:一种是`0 < x < 10`或者`1 <= x < 10`这种传统表示方法,另一种是`x`的区间是`(1, 10)`。 + +3. 如果我想在`if-elif-else`代码块中放更多的选择怎么办? + +  **答:** 为每种可能的选择增加更多的`elif`块。 ## 4.2 FOR语句 @@ -308,32 +299,36 @@ Element was: 3 Element was: 4 Element was: 5 ``` -#### 附加练习 -##### 练习1 +```{admonition} 附加练习 +:class: tip -  看看你是如何使用`range`的。查阅上面的`range`函数并理解掌握。 - -##### 练习2 - -  你能在第 22 行不使用`for-loop`,而是直接把`range(0, 6)`赋给`elements`吗? - -##### 练习3 - -  找到 Python 文档关于列表的部分,然后读一读。看看除了`append`,你还能对列表做哪些操作? +1. 看看你是如何使用`range`的。查阅上面的`range`函数并理解掌握。 +2. 你能在第 22 行不使用`for-loop`,而是直接把`range(0, 6)`赋给`elements`吗? +3. 找到 Python 文档关于列表的部分,然后读一读。看看除了`append`,你还能对列表做哪些操作? +``` #### 常见问题 -1. **如何创建一个二维列表?** 可以用这种列表中的列表:`[[1,2,3],[4,5,6]]` +1. 如何创建一个二维列表? -2. **列表(lists)和数组(arrays)难道不是一个东西吗?** 这取决于语言以及实现方法。在传统术语中,列表和数组的实现方式不同。在 Ruby 中都叫做`arrays`,在 python 中都叫做`lists`。所以我们就把这些叫做列表吧。 +  **答:** 可以用这种列表中的列表:`[[1,2,3],[4,5,6]]` -3. **为什么`for-loop`可以用一个没有被定义的变量?** 变量在`for-loop`开始的时候就被定义了,它被初始化到了每一次`loop`迭代时的当前元素中。 +2. 列表(lists)和数组(arrays)难道不是一个东西吗? -4. **为什么`range(1, 3)`中的`i`只循环了两次而不是三次?** `range()`函数只处理从第一个到最后一个数,但不包括最后一个数,所以它在 2 就结束了。这是这类循环的通用做法。 +  **答:** 这取决于语言以及实现方法。在传统术语中,列表和数组的实现方式不同。在 Ruby 中都叫做`arrays`,在 python 中都叫做`lists`。所以我们就把这些叫做列表吧。 -5. **`element.append()`的作用是什么?** 它只是把东西追加到列表的末尾。打开 Python shell 然后创建一个新列表。任何时候当你遇到类似的用法,试着多玩几次,去体会它们的作用。 +3. 为什么`for-loop`可以用一个没有被定义的变量? +  **答:** 变量在`for-loop`开始的时候就被定义了,它被初始化到了每一次`loop`迭代时的当前元素中。 + +4. 为什么`range(1, 3)`中的`i`只循环了两次而不是三次? + +  **答:** `range()`函数只处理从第一个到最后一个数,但不包括最后一个数,所以它在 2 就结束了。这是这类循环的通用做法。 + +5. `element.append()`的作用是什么? + +  **答:** 它只是把东西追加到列表的末尾。打开 Python shell 然后创建一个新列表。任何时候当你遇到类似的用法,试着多玩几次,去体会它们的作用。 ## 4.3 while语句 @@ -405,35 +400,27 @@ The numbers: 5 ``` -#### 附加练习 +```{admonition} 附加练习 +:class: tip -##### 练习1 +1. 把这个`while-loop`转换成一个你可以调用的函数,然后用一个变量替代`i < 6`里面的`6`。 +2. 用这个函数重新写一下这个脚本,试试不同的数值。 +3. 再增加一个变量给这个函数的参数,然后改变第 8 行的`+1`,让它增加的值与之前不同。 +4. 用这个函数重新写这个脚本,看看会产生什么样的效果。 +5. 用`for-loop`和`range`写这个脚本。你还需要中间的增加值吗?如果不去掉这个增加值会发生什么? -  把这个`while-loop`转换成一个你可以调用的函数,然后用一个变量替代`i < 6`里面的`6`。 - -##### 练习2 - -  用这个函数重新写一下这个脚本,试试不同的数值。 - -##### 练习3 - -  再增加一个变量给这个函数的参数,然后改变第 8 行的`+1`,让它增加的值与之前不同。 - -##### 练习4 - -  用这个函数重新写这个脚本,看看会产生什么样的效果。 - -##### 练习5 - -  用`for-loop`和`range`写这个脚本。你还需要中间的增加值吗?如果不去掉这个增加值会发生什么? - -  任何时候你在运行程序的时候它失控了,只用按下 CTRL-C ,程序就会终止。 +注:任何时候你在运行程序的时候它失控了,只用按下 CTRL-C ,程序就会终止。 +``` #### 常见问题 -1. **`for-loop`和`while-loop`的区别是什么?** `for-loop`只能迭代(循环)一些东西的集合,而`while-loop`能够迭代(循环)任何类型的东西。不过,`while-loop`很难用对,而你通常能够用`for-loop`完成很多事情。 +1. `for-loop`和`while-loop`的区别是什么? -2. **循环好难,我应该如何理解它们?** 人们不理解循环的主要原因是他们跟不上代码的运行。当一个循环运行的时候,它会过一遍代码块,到结尾之后再跳到顶部。为了直观表现这个过程,你可以用`print`打印出循环的整个过程,把`print`行写在循环的前面、顶部、中间、结尾。研究一下输出的内容,试着理解它是如何运行的。 +  **答:** `for-loop`只能迭代(循环)一些东西的集合,而`while-loop`能够迭代(循环)任何类型的东西。不过,`while-loop`很难用对,而你通常能够用`for-loop`完成很多事情。 + +2. 循环好难,我应该如何理解它们? + +  **答:** 人们不理解循环的主要原因是他们跟不上代码的运行。当一个循环运行的时候,它会过一遍代码块,到结尾之后再跳到顶部。为了直观表现这个过程,你可以用`print`打印出循环的整个过程,把`print`行写在循环的前面、顶部、中间、结尾。研究一下输出的内容,试着理解它是如何运行的。 ## 4.4 分支和函数 @@ -538,34 +525,30 @@ This room is full of gold. How much do you take? You greedy bastard! Good job! ``` -##### 附加练习 +```{admonition} 附加练习 +:class: tip -##### 练习1 - -  画一个这个游戏的流程图,并指出它是如何运转的。 - -##### 练习2 - -  修正你的错误,包括拼写和语法错误。 - -##### 练习3 - -  为你不理解的函数写上注释。 - -##### 练习4 - -  为游戏增加一些功能,同时使代码更加简化。 - -##### 练习5 - -  这个`gold_room`让你输入数字的方式有点奇怪。这样做有哪些`bug`?你能改善我的代码吗?可以查查看`int()`的相关知识。 +1. 画一个这个游戏的流程图,并指出它是如何运转的。 +2. 修正你的错误,包括拼写和语法错误。 +3. 为你不理解的函数写上注释。 +4. 为游戏增加一些功能,同时使代码更加简化。 +5. 这个`gold_room`让你输入数字的方式有点奇怪。这样做有哪些`bug`?你能改善我的代码吗?可以查查看`int()`的相关知识。 +``` #### 常见问题 -1. **救命! 这个程序是怎么工作的!?** 当你遇到不理解的代码时,不要着急,只要在每行代码下面写下注释,弄清楚这一行是做什么的,就很容易明白。确保你的注释和代码一样简洁。 然后要么画图,要么写一段话来描述代码是如何运行的。这样你就会理解其背后的原理。 +1. 救命! 这个程序是怎么工作的!? -2. **为什么你要用`while True`?** 这样可以构建一个无限循环。 +  **答:** 当你遇到不理解的代码时,不要着急,只要在每行代码下面写下注释,弄清楚这一行是做什么的,就很容易明白。确保你的注释和代码一样简洁。 然后要么画图,要么写一段话来描述代码是如何运行的。这样你就会理解其背后的原理。 -3. **`exit(0)`是干什么用的?** 在很多操作系统中,一个程序可以用`exit(0)`来结束,其中传入的数字代表是否有错误。如果你用`exit(1)`代表有1个错误,`exit(0)`则代表程序正常退出。它不同于通常的布尔逻辑(`0==False`),因为你可以用不同的数字来表示不同的错误结果。你可以用`exit(100)`来表示与`exit(2)`或者`exit(1)`不同的错误结果。 +2. 为什么你要用`while True`? -4. **为什么`input()`有时会被写成`input('> ')`?** `input`的参数是一个字符串,所以要在获取用户输入的内容前面加一个提示符。这里`>`也可以换成想要提示用户的文字。 +  **答:** 这样可以构建一个无限循环。 + +3. `exit(0)`是干什么用的? + +  **答:** 在很多操作系统中,一个程序可以用`exit(0)`来结束,其中传入的数字代表是否有错误。如果你用`exit(1)`代表有1个错误,`exit(0)`则代表程序正常退出。它不同于通常的布尔逻辑(`0==False`),因为你可以用不同的数字来表示不同的错误结果。你可以用`exit(100)`来表示与`exit(2)`或者`exit(1)`不同的错误结果。 + +4. 为什么`input()`有时会被写成`input('> ')`? + +  **答:** `input`的参数是一个字符串,所以要在获取用户输入的内容前面加一个提示符。这里`>`也可以换成想要提示用户的文字。 \ No newline at end of file diff --git a/PythonThinking/task7-面向对象的编程.md b/PythonThinking/task7-面向对象的编程.md index ade34d2..b038663 100644 --- a/PythonThinking/task7-面向对象的编程.md +++ b/PythonThinking/task7-面向对象的编程.md @@ -39,27 +39,20 @@ They rally around tha family With pockets full of shells ``` -### 附加练习 +```{admonition} 附加练习 +:class: tip -#### 练习1 - -  用这个方法再写一些歌,确保你明白你正在用字符列表来传歌词。 - -#### 练习2 - -  把歌词放在一个单独的变量里,然后把这个变量放在类里面来使用。 - -#### 练习3 - -  如果你能搞定这些,可以用它来做更多的事情。要是你现在没什么想法也别担心,就试试看会发生什么。然后把它们掰开、揉碎、反复研究。 - -#### 练习4 - -  在网上搜搜“面向对象的编程”,然后填满你的大脑。别担心你看不懂,因为几乎一半的东西我也看不懂。 +1. 用这个方法再写一些歌,确保你明白你正在用字符列表来传歌词。 +2. 把歌词放在一个单独的变量里,然后把这个变量放在类里面来使用。 +3. 如果你能搞定这些,可以用它来做更多的事情。要是你现在没什么想法也别担心,就试试看会发生什么。然后把它们掰开、揉碎、反复研究。 +4. 在网上搜搜“面向对象的编程”,然后填满你的大脑。别担心你看不懂,因为几乎一半的东西我也看不懂。 +``` ### 常见问题 -  **为什么我在类下面用`__init__`函数或者其他函数的时候要用`self` ?** 如果你不用`self`,那么像`cheese = 'Frank'`这样的代码就会很含糊,计算机不知道你是指实例的`cheese`属性还是一个叫做`cheese`的局部变量。而用`self.cheese = 'Frank'`的话就会很清晰,你是指实例的属性`self.cheese`。 +为什么我在类下面用`__init__`函数或者其他函数的时候要用`self` ? + +**答:** 如果你不用`self`,那么像`cheese = 'Frank'`这样的代码就会很含糊,计算机不知道你是指实例的`cheese`属性还是一个叫做`cheese`的局部变量。而用`self.cheese = 'Frank'`的话就会很清晰,你是指实例的属性`self.cheese`。 ## 5.2 学着去说面向对象 @@ -116,14 +109,16 @@ With pockets full of shells   同样地,把这些短语写到一些闪词卡上,然后记一记。把 Python 代码片段放在正面,解释的句子放在背面,你必须每次都正确说出每一个短语的意思。不是说得类似就行,而是要一模一样。 -### 综合训练 -   最后一项准备工作是把词汇训练和短语训练结合在一起,以下是训练内容: +```{admonition} 综合训练 +:class: tip + 1. 做一个短语卡然后练习记忆。 2. 把它翻过来,读句子,如果在句子中看到词汇训练中的词汇,就找到相应的词汇卡片。 3. 练习记忆这些词汇卡片。 4. 坚持练习,要是你感到有些累,就休息一下再继续。 +``` ### 读更多代码