模块 1:Python 入门
练习 0:准备工作
这个练习没有代码。这只是你完成的练习,让你的计算机运行 Python。你应该尽可能准确地遵循这些说明。如果你在遵循书面说明时遇到问题,请观看包含的适用于你平台的视频。
通用说明
你的一般任务是获得一个“编程环境”,其中包含你可以用来编写代码的工具。几乎每个程序员都有自己专门的环境,但起初你会想要一些简单的东西,可以帮助你完成这门课程。课程结束后,你将了解足够的编程知识,然后可以浪费余生尝试你能想象到的每种工具。这是非常有趣的。
你需要的是以下内容:
- Jupyter,将在书的第一部分中用于轻松入门。Jupyter 是一个使用多种语言的编程和数据分析环境,但我们将使用 Python。
- Python。你安装的 Python 版本基本上不重要,只要它比版本 3.6 旧。Python(和其他软件)的版本使用数字表示它们的年龄,数字的位置决定了版本之间的变化程度。一般规则是第一个数字表示“主要变化”,第二个数字表示“次要变化”,第三个数字表示仅有错误或安全修复。这意味着如果你有版本 3.8 和版本 3.10,那么没有主要变化,但有次要变化。如果你有版本 3.10.1 和 3.10.2,那么只有错误修复。
- 一个基本的程序员编辑器。程序员使用非常复杂的文本编辑器,但你应该从一些简单但仍然作为程序员编辑器的东西开始。
- 终端模拟器。这是一个基于文本的命令界面,用于与计算机交互。如果你看过有关黑客和编程的电影,你会看到人们在黑屏上疯狂输入绿色文本,以便使用他们的“unix exe 32 pipe attack”摧毁整个外星种族。起初你不需要这个,但以后你会“毕业”使用终端,因为它非常强大且学习起来并不太难。
你的计算机上应该已经有大部分你需要的其他东西,所以让我们为你的操作系统(OS)安装这些要求中的每一项。
极简启动
本练习中的说明旨在安装你在课程中所需的大部分工具,但如果你想尽快开始并付出最少的努力,那么请安装:
a. 在 Windows 上运行 Jupyter 的最佳方法是按下 Windows 键(开始菜单)并键入 jupyter-lab
。这将以合理的方式启动它。
b. 在 Linux 上,你应该在终端中输入相同的命令。
c. 在 macOS 上,你可以在终端中输入该命令,或者像平常一样启动应用程序。
这将为您提供足够的信息来开始学习,但最终您会遇到需要使用“命令行”中的终端和 Python 的练习。当您在课程中达到这一点时,请回到这个练习。
完整说明
最终,您将需要安装更多软件来完成课程。书中的安装说明存在的问题是它们很快就会过时。为了解决这个问题,我有一个网页,您需要访问该网页,其中包含所有适用于您的操作系统的安装说明,并附有视频展示安装过程。这些说明会在事物发生变化时进行更新,并且网页包含您书中所需的任何勘误。
要查看这些说明,请访问以下链接:
如果由于某种原因无法访问此链接,则以下是您需要安装的内容:
- Anaconda 以获取您的 Python。
- Jupyter 用于编写和运行一些代码。
- Geany 用于以后编辑文本。
- 在 Windows 上使用完整安装的Cmder作为您的 shell。
- 在 macOS 上您有终端,Linux 上有您想要的任何东西。
测试您的设置
安装完所有内容后,请按照以下步骤确认一切正常:
- 启动您的终端并精确输入以下命令,包括空格:
mkdir lpthw
。 - 一旦安装成功,您将拥有一个名为
lpthw
的目录,您可以在其中放置您的工作。 - 使用命令
cd lpthw
进入该目录。此命令将您的终端“移动”到该目录,以便您的工作保存在那里。 - “目录”在 Windows 和 macOS 上也称为“文件夹”。您可以通过在 Windows 上键入
start.
或在 macOS 上键入open.
来在终端中的“目录”和您通常看到的“文件夹”之间建立联系。这将打开当前目录到您通常看到的图形文件夹窗口。如果您迷失了,请键入该命令。 start
命令(macOS 上为open
)的作用类似于用鼠标双击那个东西。如果您在终端中想要“打开”某个东西,只需使用此命令。假设有一个名为test.txt
的文本文件,您想在编辑器中打开它。在 Windows 上键入start test.txt
,在 macOS 上键入open test.txt
。- 现在您可以打开终端并在终端中打开文件,您将需要启动您的编辑器。如果您一直在按照说明操作,这个编辑器就是 Geany。启动它并创建一个名为
test.txt
的文件,然后将其保存在您创建的lpthw
目录中。如果找不到它,请记住您可以在终端中使用start
(macOS 上为open
)打开它,然后使用该文件夹窗口找到它。 - 一旦你把文件保存在
lpthw
目录中,你应该能够在终端中输入ls test.txt
来查看它是否存在。如果出现错误,那么要么你不在lpthw
目录中,需要输入cd ~/lpthw
或者 你把它保存在了错误的地方。请重试直到你能够做到这一点。 - 最后,在终端中输入
jupyter-lab
来启动 Jupyter 并确保它正常工作。它应该会打开你的网页浏览器,然后你会在浏览器中看到 Jupyter 应用程序。这有点像你个人电脑上的一个小网站。
把这些任务看作是一种需要解决的谜题。如果遇到困难,你应该观看我展示如何完成所有操作的适用于你的操作系统的视频。我认为学习这个最好的方法是首先自己尝试;然后当遇到困难时,观看视频看我是如何做的。
学习命令行
现在不需要立即做这个,但如果你在之前的任务中遇到困难,你可能需要通过命令行快速入门课程来学习终端(也称为“命令行”)的基础知识。你暂时不需要这些技能,但命令行是一个非常好的用文字控制计算机的入门,它也会帮助你以后在编程中完成许多其他任务,所以现在学习它只会有好处。
下一步
一旦你把所有东西都搞定了,你就可以继续进行课程的其余部分。如果你遇到问题,可以发邮件给我,邮箱是 help@learncodethehardway.com,我会帮助你。当你给我发邮件求助时,请花时间尽可能详细地描述你的问题,并包含截图。
练习 1:一个好的第一个程序
警告!
如果你跳过了 Exercise 0,那么你就没有正确地进行这本书的学习。你是在尝试使用 IDLE 还是 IDE 吗?我在 Exercise 0 中说不要使用其中的任何一个,所以你也不应该使用。如果你跳过了 Exercise 0,请返回并阅读它。
你应该在 Exercise 0 中花费了相当多的时间学习如何安装 Jupyter,运行 Jupyter,运行终端,并且同时使用它们。如果你还没有这样做,那么请不要继续。你将度过不愉快的时光。这是我唯一一次在开始练习时警告你不要跳过或超前的时间。
在 Jupyter 单元格中输入以下文本:
列表 1.1: ex1.py
1 print("Hello World!") 2 print("Hello Again") 3 print("I like typing this.") 4 print("This is fun.") 5 print('Yay! Printing.') 6 print("I'd much rather you 'not'.") 7 print('I "said" do not touch this.')
你的 Jupyter 单元格应该看起来像这样:
不要担心如果你的 Jupyter 窗口看起来不完全相同;它应该是接近的。你的窗口标题可能略有不同,也许颜色略有不同,而你的 Jupyter 窗口的左侧不会相同,而是会显示你用于保存文件的目录。所有这些差异都是可以接受的。
当你创建这个单元格时,请记住这些要点:
- 我没有在左侧输入行号。这些行号是在书中打印出来的,这样我就可以通过说“看第 5 行…”来谈论特定的行。你不需要在 Python 脚本中输入行号。
- 我在行首有
print
,它看起来与我在单元格中的完全相同。完全意味着完全,不是有点类似。每个字符都必须匹配才能正常工作。颜色无关紧要,只有你输入的字符。
一旦它完全相同,你可以按下SHIFT-ENTER
来运行代码。如果你做对了,那么你应该看到与我在本练习的你应该看到的内容部分相同的输出。如果没有,那么你做错了。不,计算机没有错。
你应该看到的内容
在你按住SHIFT
并按下ENTER
后,Jupyter 的输出将如下所示(我会写成SHIFT-ENTER
):
你可能会看到不同的窗口外观和布局,但重要的是你输入命令并查看输出与我的相同。
如果出现错误,它会看起来像这样:
1 Cell In[1], line 3 2 print("I like typing this. 3 ^ 4 SyntaxError: unterminated string literal (detected at line 1)
重要的是你能够阅读这些错误消息,因为你将犯许多这样的错误。即使我也会犯许多这样的错误。让我们逐行查看这个。
- 我们使用
SHIFT-ENTER
在 Jupyter 单元格中运行了我们的命令。 - Python 告诉我们该单元格在第 3 行有一个错误。
- 它为我们打印出这行代码以供查看。
- 然后它放置一个
^
(插入符)字符指向问题所在的地方。注意结尾缺少"
(双引号)字符了吗? - 最后,它会打印出一个“SyntaxError”并告诉我们可能的错误。通常这些错误非常难以理解,但如果你将该文本复制到搜索引擎中,你会找到其他遇到过这个错误的人,并且你可能会弄清楚如何修复它。
学习练习
学习练习包含你应该尝试做的事情。如果你做不到,跳过它,稍后再回来。
对于这个练习,请尝试这些事情:
- 让你的脚本打印另一行。
- 让你的脚本只打印一行。
- 在一行的开头放一个
#
(井号)字符。它有什么作用?试着找出这个字符的作用。
从现在开始,除非练习有所不同,否则我不会解释每个练习的工作原理。
信息
“井号”也被称为“磅”,“井号”,“网格”或任何一种名称。选择让你放松的那个。
常见学生问题
这些是真实学生在做这个练习时提出的实际问题:
我可以使用 IDLE 吗? 不,现在只使用 Jupyter,稍后我们将使用常规文本编辑器获得额外的超能力。
在 Jupyter 中编辑代码很烦人。我可以使用文本编辑器吗? 完全可以,你也可以在 Jupyter 中创建一个python
文件并获得一个“足够好”的编辑器。在左侧面板中看到所有文件的地方,点击左上角的+
(加号)图标。这将带你到你开始 Jupyter 时看到的第一个屏幕。在底部的$_ Other
下,你会看到一个带有 Python 标志的Python
File
按钮。点击它,你将获得一个编辑器来处理你的文件。
我的代码无法运行;我只是得到一个没有输出的提示符。你很可能字面上采用了我的单元格中的代码,并认为print("Hello World!")
意味着只在单元格中输入"Hello
World!"
,而不包括print
。你的单元格必须完全像我的一样。
练习 2:注释和井号字符
在你的程序中,注释非常重要。它们用于用英语告诉你某件事情的作用,并且用于暂时禁用程序的某些部分。以下是如何在 Python 中使用注释:
列表 2.1:ex2.py
1 # A comment, this is so you can read your program later. 2 # Anything after the # is ignored by python. 3 4 print("I could have code like this.") # and the comment after is ignored 5 6 # You can also use a comment to "disable" or comment out code: 7 # print*(*"This won't run."*)* 8 9 print("This will run.")
从现在开始,我会这样写代码。你需要明白并不是所有东西都必须字面意思。如果我的 Jupyter 看起来与你的有些不同,或者我在使用文本编辑器,结果都是一样的。更多关注文本输出,少关注视觉显示,比如字体和颜色。
你应该看到什么
1 I could have code like this. 2 This will run.
再次强调,我不会展示所有可能的终端的截图。你应该明白上述内容并不是你的输出在视觉上应该看起来的字面翻译,而是你应该关注的文本内容。
学习练习
- 查明你对
#
字符的理解是否正确,并确保你知道它的名称(井号或磅字符)。 - 拿起你的代码,倒着检查每一行。从最后一行开始,逆向检查每个单词是否与你应该输入的相符。
- 你找到更多错误了吗?修正它们。
- 大声朗读你输入的内容,包括按名称说出每个字符。你找到更多错误了吗?修正它们。
常见学生问题
你确定 #
被称为井号字符吗? 我称其为八角符号,因为这是唯一一个没有一个国家使用并且在每个国家都有效的名称。每个国家都认为对于这个字符的命名方式是最重要的,也是唯一的方式。对我来说,这只是傲慢,实际上,大家应该冷静下来,更专注于更重要的事情,比如学习编程。
为什么 print("Hi # there.")
中的 #
不会被忽略? 该代码中的#
在一个字符串内,因此它会一直被放入字符串,直到结束的"
字符出现。字符串中的井号字符只被视为字符,而不是注释。
如何注释掉多行? 在每一行前面加上#
。
我不知道如何在我国的键盘上输入 #
字符。我该怎么做? 一些国家使用 ALT 键和其他键的组合来打印与其语言不同的字符。你需要上网搜索如何输入它。
为什么我要倒着读代码? 这是一个技巧,让你的大脑不会将代码的每个部分赋予意义,这样做可以让你精确处理每个部分。这可以捕捉错误,并且是一个方便的错误检查技术。
练习 3:数字和数学
每种编程语言都有一种处理数字和数学的方式。不要担心:程序员经常谎称自己是数学天才,当他们实际上并不是。如果他们是数学天才,他们会做数学,而不是编写有 bug 的网络框架,以便他们可以开赛车。
这个练习涉及很多数学符号。让我们立即给它们命名,这样你就知道它们叫什么。当你输入时,说出名称。当说起它们感到无聊时,你可以停止说。这里是名称:
+
加号-
减号/
斜杠*
星号%
百分号<
小于>
大于<=
小于等于>=
大于等于
注意运算符缺失了吗?在输入这个练习的代码后,回头去弄清楚每个运算符的作用,并完成表格。例如,+
表示加法。
列表 3.1:ex3.py
1 print("I will now count my chickens:") 2 3 print("Hens", 25 + 30 / 6) 4 print("Roosters", 100 - 25 * 3 % 4) 5 6 print("Now I will count the eggs:") 7 8 print(3 + 2 + 1 - 5 + 4 % 2 - 1 / 4 + 6) 9 10 print("Is it true that 3 + 2 < 5 - 7?") 11 12 print(3 + 2 < 5 - 7) 13 14 print("What is 3 + 2?", 3 + 2) 15 print("What is 5 - 7?", 5 - 7) 16 17 print("Oh, that's why it's False.") 18 19 print("How about some more.") 20 21 print("Is it greater?", 5 > -2) 22 print("Is it greater or equal?", 5 >= -2) 23 print("Is it less or equal?", 5 <= -2)
在运行之前确保你准确地输入了这个。将你的文件的每一行与我的文件进行比较。
你应该看到什么
1 I will now count my chickens: 2 Hens 30.0 3 Roosters 97 4 Now I will count the eggs: 5 6.75 6 Is it true that 3 + 2 < 5 - 7? 7 False 8 What is 3 + 2? 5 9 What is 5 - 7? -2 10 Oh, that's why it's False. 11 How about some more. 12 Is it greater? True 13 Is it greater or equal? True 14 Is it less or equal? False
学习练习
- 在每一行上面,使用
#
写一个注释给自己解释这行代码的作用。 - 你可以直接在 Jupyter 单元格中输入大多数数学运算并获得结果。尝试使用它进行一些基本计算,比如
1+2
,然后按下SHIFT-ENTER
。 - 找到需要计算的内容,并编写一个新的
.py
文件来完成。 - 重写这个练习,使用浮点数使其更准确。
20.0
是浮点数。
常见学生问题
为什么 %
字符是“模数”而不是“百分比”? 主要是设计者选择使用这个符号的方式。在正常的写作中,你正确地将其读作“百分比”。在编程中,这个计算通常使用简单的除法和/
运算符来完成。%
模数是一个不同的操作,只是碰巧使用了%
符号。
%
是如何工作的? 另一种说法是,“X 除以 Y,余数为 J。” 例如,“100 除以 16,余数为 4。” %
的结果是 J 部分,或者剩余部分。
运算的顺序是什么? 在美国,我们使用一个叫做 PEMDAS 的缩写,代表括号 指数 乘法 除法 加法 减法。这也是 Python 遵循的顺序。人们在处理PEMDAS
时常犯的错误是认为这是一个严格的顺序,就像“先做 P,然后 E,然后 M,然后 D,然后 A,然后 S。” 实际的顺序是你先进行乘法 和 除法(M&D)一步完成,从左到右,然后进行加法和减法一步完成,从左到右。因此,你可以将PEMDAS
重写为PE(M&D)(A&S)
。
练习 4:变量和名称
现在你可以用print
打印东西,还可以进行数学运算。下一步是学习关于变量的知识。在编程中,变量只不过是某物的名称,类似于我的名字“Zed”是“写这本书的人类”的名称。程序员使用这些变量名称使他们的代码更像英语,并且因为他们的记忆力不好。如果他们在软件中不使用良好的名称,当他们再次阅读代码时就会迷失方向。
如果你在这个练习中遇到困难,记住你到目前为止学到的找出差异和专注细节的技巧:
- 在每一行上面写一个注释,用英语解释它的作用。
- 反向阅读你的 Python 代码。
- 大声朗读你的 Python 代码,甚至说出字符。
列表 4.1: ex4.py
1 cars = 100 2 space_in_a_car = 4.0 3 drivers = 30 4 passengers = 90 5 cars_not_driven = cars - drivers 6 cars_driven = drivers 7 carpool_capacity = cars_driven * space_in_a_car 8 average_passengers_per_car = passengers / cars_driven 9 10 11 print("There are", cars, "cars available.") 12 print("There are only", drivers, "drivers available.") 13 print("There will be", cars_not_driven, "empty cars today.") 14 print("We can transport", carpool_capacity, "people today.") 15 print("We have", passengers, "to carpool today.") 16 print("We need to put about", average_passengers_per_car, 17 "in each car.")
信息
space_in_a_car
中的_
被称为下划线字符。如果你还不知道如何输入它,请找出如何输入。我们经常使用这个字符在变量名中的单词之间放置一个虚拟空格。
你应该看到的结果
1 There are 100 cars available. 2 There are only 30 drivers available. 3 There will be 70 empty cars today. 4 We can transport 120.0 people today. 5 We have 90 to carpool today. 6 We need to put about 3.0 in each car.
练习
当我第一次编写这个程序时,我犯了一个错误,Python 像这样告诉我:
1 Traceback (most recent call last): 2 Cell In[1], line 8, in <module> 3 average_passengers_per_car = car_pool_capacity / passenger 4 NameError: name 'car_pool_capacity' is not defined
用你自己的话解释这个错误。确保使用行号并解释原因。
这里有更多练习:
- 我用 4.0 代表
space_in_a_car
,但这是必要的吗?如果只是 4 会发生什么? - 记住 4.0 是一个
浮点数
。它只是一个带有小数点的数字,你需要用 4.0 而不是只有 4,这样它就是浮点数了。 - 在每个变量赋值上面写注释。
- 确保你知道
=
被称为什么(等于号),它的目的是给数据(数字、字符串等)命名(cars_driven
、passengers
)。 - 记住
_
是一个下划线字符。 - 尝试像之前一样从终端运行
python3
作为计算器,并使用变量名进行计算。常用的变量名还有i
、x
和j
。
笨办法学 Python3 第五版(预览)(一)(2)https://developer.aliyun.com/article/1483424