文章目录
- Python for Everybody
- 课程简介
- 适合所有人的 Python (Why Program?)
- 为什么要学习写程序?
- 创造力和动力
- 计算机硬件架构
- 了解编程
- 单词和句子
- 与 Python 对话
- 术语:解释器和编译器
- Writing a program
- 什么是程序?
- The building blocks of programs
- 可能会出现什么问题?
- Debugging 调试
- 学习之旅
- Glossary 词汇表
- Exercises 练习
Python for Everybody
课程简介
Python for Everybody 零基础程序设计(Python 入门)
- This course aims to teach everyone the basics of programming computers using Python. 本课程旨在向所有人传授使用 Python 进行计算机编程的基础知识。
- We cover the basics of how one constructs a program from a series of simple instructions in Python. 我们介绍了如何通过 Python 中的一系列简单指令构建程序的基础知识。
- The course has no pre-requisites and avoids all but the simplest mathematics. Anyone with moderate computer experience should be able to master the materials in this course. 该课程没有任何先决条件,除了最简单的数学之外,避免了所有内容。任何具有中等计算机经验的人都应该能够掌握本课程中的材料。
- This course will cover Chapters 1-5 of the textbook “Python for Everybody”. Once a student completes this course, they will be ready to take more advanced programming courses. 本课程将涵盖《Python for Everyday》教科书的第 1-5 章。学生完成本课程后,他们将准备好学习更高级的编程课程。
- This course covers Python 3.
coursera
Python for Everybody 零基础程序设计(Python 入门)
Charles Russell Severance
Clinical Professor
个人主页
Twitter
University of Michigan
课程资源
coursera原版课程视频
coursera原版视频-中英文精校字幕-B站
Dr. Chuck官方翻录版视频-机器翻译字幕-B站
PY4E-课程配套练习
Dr. Chuck Online - 系列课程开源官网
适合所有人的 Python (Why Program?)
Exploring Data Using Python 3
Dr. Charles R. Severance
为什么要学习写程序?
编写程序(或编程)是一项非常有创意且有益的活动。您可以出于多种原因编写程序,从谋生到解决困难的数据分析问题,再到享受帮助别人解决问题的乐趣。本书假设 每个人都需要知道如何编程,一旦你知道如何编程,你就会弄清楚你想用你的新技能做什么。
我们的日常生活被从笔记本电脑到手机等各种计算机所包围。我们可以将这些计算机视为我们的“私人助理”,可以代表我们处理许多事情。我们当今计算机中的硬件本质上是为了不断地问我们这个问题:“你想让我下一步做什么?”
个人数字助理
程序员将操作系统和一组应用程序添加到硬件中,我们最终得到了一个非常有用的个人数字助理,能够帮助我们做许多不同的事情。
我们的计算机速度很快,拥有大量内存,如果我们知道用什么语言向计算机解释我们希望它“下一步做什么”,那么对我们来说就会非常有帮助。如果我们了解这种语言,我们就可以告诉计算机代表我们执行重复的任务。有趣的是,计算机最擅长做的事情往往是我们人类觉得无聊和麻木的事情。
例如,看本章的前三段,告诉我最常用的单词以及该单词使用了多少次。虽然你可以在几秒钟内阅读并理解这些单词,但计算它们几乎是痛苦的,因为这不是人类大脑旨在解决的那种问题。对于计算机来说,情况恰恰相反,从一张纸上阅读和理解文本对计算机来说很难做到,但计算单词并告诉你最常用的单词被使用了多少次对计算机来说非常容易:
python words.py
Enter file:words.txt
to 16
我们的“个人信息分析助手”很快告诉我们,在本章的前三段中,“到”一词使用了十六次。
计算机擅长人类不擅长的事情,这一事实就是为什么你需要熟练掌握“计算机语言”。一旦您学习了这种新语言,您就可以将平凡的任务委托给您的合作伙伴(计算机),从而为您留出更多时间来做您独特适合的事情。您为这种合作伙伴关系带来了创造力、直觉和创造力。
创造力和动力
虽然本书不适合专业程序员,但专业编程对于经济和个人而言都是一项非常有价值的工作。构建有用的、优雅的、聪明的程序供他人使用是一项非常有创意的活动。您的计算机或个人数字助理 (PDA) 通常包含来自许多不同程序员组的许多不同程序,每个程序都在争夺您的注意力和兴趣。他们尽力满足您的需求,并在此过程中为您提供良好的用户体验。在某些情况下,当你选择一款软件时,程序员会因为你的选择而直接获得报酬。
如果我们将程序视为程序员群体的创造性输出,也许下图是我们的 PDA 的更明智版本:
程序员与你对话
目前,我们的主要动机不是为了赚钱或取悦最终用户,而是为了提高处理生活中遇到的数据和信息的效率。当您第一次开始时,您将既是程序的程序员又是程序的最终用户。当您获得作为程序员的技能并且编程对您来说更具创造性时,您的想法可能会转向为他人开发程序。
计算机硬件架构
在我们开始学习向计算机发出指令以开发软件的语言之前,我们需要了解一些有关计算机是如何构建的知识。如果你拆开你的电脑或手机,深入观察内部,你会发现以下部件:
硬件架构
这些部分的高级定义如下:
-
中央处理单元(或 CPU)是计算机的一部分,其设计初衷是关注“接下来会发生什么?” 如果您的计算机的额定频率为 3.0 Gigahertz,则意味着 CPU 会询问“接下来做什么?” 每秒三十亿次。你必须学会如何快速说话才能跟上 CPU 的步伐。
-
主存储器用于存储CPU紧急需要的信息。主存储器的速度几乎与CPU 一样快。但是当计算机关闭时,存储在主存储器中的信息就会消失。
-
辅助存储器也用于存储信息,但它比主存储器慢得多。辅助存储器的优点是即使计算机断电时也可以存储信息。辅助存储器的示例是磁盘驱动器或闪存(通常存在于 USB 记忆棒和便携式音乐播放器中)。
-
输入和输出设备就是我们的屏幕、键盘、鼠标、麦克风、扬声器、触摸板等。它们是我们与计算机交互的所有方式。
-
如今,大多数计算机还具有网络连接来通过网络检索信息。我们可以将网络视为存储和检索可能并不总是“正常”的数据的非常慢的地方。因此,从某种意义上说,网络是一种速度较慢且有时不可靠的辅助存储器形式。
虽然这些组件如何工作的大部分细节最好留给计算机构建者,但掌握一些术语会有所帮助,以便我们在编写程序时可以讨论这些不同的部分。
作为一名程序员,您的工作是使用和编排这些资源中的每一个来解决您需要解决的问题并分析从解决方案中获得的数据。作为一名程序员,您主要会与 CPU“对话”并告诉它下一步该做什么。有时你会告诉CPU使用主存、辅助存储器、网络或输入/输出设备。
你在哪里?
您需要成为回答 CPU“接下来做什么?”的人。问题。但如果把你缩小到 5 毫米高,然后将你插入计算机,这样你就可以每秒发出 30 亿次命令,那会很不舒服。因此,您必须提前写下您的指示。我们将这些存储的指令称为 程序,并将这些指令写下来并使指令正确编程的行为。
了解编程
在本书的其余部分,我们将努力将您变成一个精通编程艺术的人。最终你将成为一名 程序员——也许不是专业程序员,但至少你将具备查看数据/信息分析问题并开发程序来解决问题的技能。
从某种意义上说,成为一名程序员需要两项技能:
-
首先,您需要了解编程语言(Python)——您需要了解词汇和语法。您需要能够正确拼写这种新语言中的单词,并知道如何用这种新语言构建结构良好的“句子”。
-
其次,你需要“讲故事”。在写故事时,您需要结合单词和句子来向读者传达一个想法。构建故事是有技巧和艺术的,而故事写作的技巧可以通过一些写作和获得一些反馈来提高。在编程中,我们的程序就是“故事”,而你要解决的问题就是“想法”。
一旦学习了一种编程语言(例如 Python),您会发现学习第二种编程语言(例如 JavaScript 或 C++)要容易得多。新的编程语言具有非常不同的词汇和语法,但所有编程语言的解决问题的技能都是相同的。
你将很快学会Python的“词汇”和“句子”。你需要更长的时间才能编写一个连贯的程序来解决一个全新的问题。我们教授编程就像教授写作一样。我们开始阅读和解释程序,然后编写简单的程序,然后随着时间的推移编写越来越复杂的程序。在某些时候,你“得到你的灵感”并自己看到模式,并且可以更自然地看到如何解决问题并编写解决该问题的程序。一旦你达到了这一点,编程就变成了一个非常愉快和富有创造性的过程。
我们从Python程序的词汇和结构开始。请耐心等待,因为这些简单的示例会提醒您第一次开始阅读时的情景。
单词和句子
与人类语言不同,Python 词汇量实际上非常小。我们称这种“词汇”为“保留词”。这些词对于 Python 来说具有非常特殊的意义。当 Python 在 Python 程序中看到这些单词时,它们对 Python 来说只有一种含义。稍后,当您编写程序时,您将自己编写对您有意义的单词,称为变量。您可以有很大的自由度来选择变量的名称,但不能使用任何 Python 的保留字作为变量的名称。
当我们训练狗时,我们会使用“坐”、“停留”和“取”等特殊词语。当你和狗说话并且不使用任何保留词时,它们只是用疑惑的表情看着你,直到你说出保留词。例如,如果你说,“我希望更多的人走路来改善他们的整体健康”,大多数狗可能听到的是,“blah blah blah walk blah blah blah blah”。这是因为“走”是狗语言中的保留词。许多人可能认为人类和猫之间的语言没有保留词1。
人类与 Python 对话的语言中的保留字包括以下内容:
and del global not with
as elif if or yield
assert else import pass
break except in raise
class finally is return
continue for lambda try
def from nonlocal while
就是这样,与狗不同,Python 已经接受过完全训练。当你说“try”时,Python 会在你每次说的时候尝试,不会失败。
我们将及时学习这些保留字以及如何使用它们,但现在我们将重点关注 Python 中相当于“speak”(人与狗的语言)的内容。让 Python 说话的好处是,我们甚至可以通过在引号中给出一条消息来告诉它要说什么:
print('Hello world!')
我们甚至写出了第一个语法正确的 Python 句子。我们的句子以函数print开头,后跟我们选择的用单引号括起来的文本字符串。打印语句中的字符串用引号引起来。单引号和双引号的作用是一样的;大多数人都使用单引号,除非在字符串中出现单引号(也是撇号)的情况。
与 Python 对话
现在我们已经知道了 Python 中的一个单词和一个简单的句子,我们需要知道如何与 Python 开始对话来测试我们的新语言技能。
在与 Python 进行交流之前,您必须首先在计算机上安装 Python 软件并了解如何在计算机上启动 Python。对于本章来说,这个细节太多了,所以我建议你查阅www.py4e.com,那里有关于在 Macintosh 和 Windows 系统上设置和启动 Python 的详细说明和截屏视频。在某些时候,您将在终端或命令窗口中输入python,Python 解释器将开始以交互模式执行,并显示如下:
Python 3.5.1 (v3.5.1:37a07cee5969, Dec 6 2015, 01:54:25)
[MSC v.1900 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more
information.
>>>
提示符>>>
是 Python 解释器询问你“你想让我下一步做什么?”的方式。Python 已准备好与您对话。您所需要知道的只是如何使用 Python 语言。
举例来说,您甚至不知道最简单的 Python 语言单词或句子。你可能想用宇航员降落在遥远的星球上时使用的标准台词,并试图与星球上的居民交谈:
>>> I come in peace, please take me to your leader
File "<stdin>", line 1I come in peace, please take me to your leader^
SyntaxError: invalid syntax
>>>
事情进展不太顺利。除非你很快想到什么,否则这个星球上的居民很可能会用长矛刺伤你,把你放在烤肉叉上,在火上烤你,然后把你当晚餐吃。
幸运的是,您在旅行时带了一本这本书,并且您翻到了这一页并重试:
>>> print('Hello world!')
Hello world!
这看起来好多了,所以你尝试更多地沟通:
>>> print('You must be the legendary god that comes from the sky')
You must be the legendary god that comes from the sky
>>> print('We have been waiting for you for a long time')
We have been waiting for you for a long time
>>> print('Our legend says you will be very tasty with mustard')
Our legend says you will be very tasty with mustard
>>> print 'We will have a feast tonight unless you say
File "<stdin>", line 1print 'We will have a feast tonight unless you say^
SyntaxError: Missing parentheses in call to 'print'
>>>
谈话进行得很顺利,然后你在使用 Python 语言时犯了一个最微小的错误,Python 就把矛带了回来。
此时,您还应该意识到,虽然 Python 非常复杂和强大,并且对与之通信的语法非常挑剔,但 Python 并不智能。你实际上只是在与自己对话,但使用正确的语法。
从某种意义上说,当你使用别人编写的程序时,对话是在你和其他程序员之间进行的,Python 充当中介。Python 是程序创建者表达对话应如何进行的一种方式。再过几章,您将成为使用 Python 与程序用户交谈的程序员之一。
在我们结束与 Python 解释器的第一次对话之前,您可能应该知道在与 Python 星球的居民互动时说“再见”的正确方式:
>>> good-bye
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
NameError: name 'good' is not defined
>>> if you don't mind, I need to leave
File "<stdin>", line 1if you don't mind, I need to leave^
SyntaxError: invalid syntax
>>> quit()
您会注意到前两次错误尝试的错误是不同的。第二个错误是不同的,因为if
是一个保留字,Python 看到了保留字并认为我们试图说些什么,但句子的语法是错误的。
向 Python 说“再见”的正确方法是 在交互式 V 形提示符>>>
下输入quit()
。您可能需要相当长的时间才能猜出这个答案,因此手边准备一本书可能会有所帮助。
术语:解释器和编译器
Python 是一种高级语言,旨在相对简单地供人类阅读和编写以及计算机阅读和处理。其他高级语言包括 Java、C++、PHP、Ruby、Basic、Perl、JavaScript 等。中央处理单元 (CPU) 内的实际硬件不理解任何这些高级语言。
CPU 理解一种我们称为机器语言的语言。机器语言非常简单,坦白说写起来非常烦人,因为它全部用零和一表示:
001010001110100100101010000001111
11100110000011101010010101101101
...
机器语言表面上看起来很简单,因为只有 0 和 1,但它的语法比 Python 还要复杂得多。因此很少有程序员编写机器语言。相反,我们构建了各种翻译器,允许程序员使用 Python 或 JavaScript 等高级语言进行编写,这些翻译器将程序转换为机器语言,以便由 CPU 实际执行。
由于机器语言与计算机硬件相关,因此机器语言不可跨不同类型的硬件移植。用高级语言编写的程序可以在不同计算机之间移动,方法是在新机器上使用不同的解释器或重新编译代码以为新机器创建程序的机器语言版本。
这些编程语言翻译器分为两大类:(1) 解释器 和 (2) 编译器。
解释器读取程序员编写的程序源代码,解析源代码,并即时解释指令。Python是一个解释器,当我们以交互方式运行Python时,我们可以输入一行Python(一个句子),Python会立即处理它并准备好让我们输入另一行Python。
Python 的某些行告诉 Python 您希望它记住一些值供以后使用。我们需要为要记住的值选择一个名称,并且稍后可以使用该符号名称来检索该值。我们使用术语变量来指代我们用来指代此存储数据的标签。
>>> x = 6
>>> print(x)
6
>>> y = x * 7
>>> print(y)
42
>>>
在此示例中,我们要求 Python 记住值 6
并使用标签x
,以便稍后检索该值。我们使用print
验证 Python 确实记住了该值。然后我们要求 Python 检索x
并将其乘以 7
,并将新计算的值放入y中。然后我们要求 Python 打印出当前y
中的值。
即使我们一次一行地在 Python 中输入这些命令,Python 也会将它们视为有序的语句序列,后面的语句能够检索在前面的语句中创建的数据。我们正在以逻辑和有意义的顺序编写第一个简单的段落,其中包含四个句子。
能够进行如上所示的交互式对话是口译员的本质。编译器需要将整个程序放在一个文件中,然后运行一个过程将高级源代码翻译成机器语言,然后编译器将生成的机器语言放入文件中以供以后执行。
如果你有Windows系统,这些可执行的机器语言程序通常带有“.exe
”或“.dll
”后缀,分别代表 “可执行文件” 和 “动态链接库” 。在 Linux 和 Macintosh 中,没有后缀可以唯一地将文件标记为可执行文件。
如果你要在文本编辑器中打开一个可执行文件,它看起来会完全疯掉并且不可读:
^?ELF^A^A^A^@^@^@^@^@^@^@^@^@^B^@^C^@^A^@^@^@\xa0\x82
^D^H4^@^@^@\x90^]^@^@^@^@^@^@4^@ ^@^G^@(^@$^@!^@^F^@
^@^@4^@^@^@4\x80^D^H4\x80^D^H\xe0^@^@^@\xe0^@^@^@^E
^@^@^@^D^@^@^@^C^@^@^@^T^A^@^@^T\x81^D^H^T\x81^D^H^S
^@^@^@^S^@^@^@^D^@^@^@^A^@^@^@^A\^D^HQVhT\x83^D^H\xe8
....
阅读或编写机器语言并不容易,所以很高兴我们有解释器和编译器允许我们用Python或C等高级语言进行编写。
现在,在我们对编译器和解释器的讨论中,您应该对 Python 解释器本身感到好奇。它是用什么语言写的?它是用编译语言编写的吗?当我们输入“python”时,到底发生了什么?
Python解释器是用一种称为“C”的高级语言编写的。您可以通过访问www.python.org并找到其源代码来查看 Python 解释器的实际源代码。所以Python本身就是一个程序,它被编译成机器代码。当您在计算机上安装 Python(或供应商安装它)时,您将已翻译的 Python 程序的机器代码副本复制到您的系统上。在 Windows 中,Python 本身的可执行机器代码可能位于名称如下的文件中:
C:\Python35\python.exe
这比作为一名 Python 程序员真正需要知道的要多,但有时在一开始就回答这些令人烦恼的小问题是值得的。
Writing a program
编写程序
在 Python 解释器中输入命令是体验 Python 功能的好方法,但不建议用于解决更复杂的问题。
当我们要编写程序时,我们使用文本编辑器将Python指令写入文件中,该文件称为脚本。按照惯例,Python 脚本的名称以 .py
.
要执行脚本,您必须告诉 Python 解释器文件的名称。在命令窗口中,您可以键入 python hello.py
以下内容:
$ cat hello.py
print('Hello world!')
$ python hello.py
Hello world!
“$
”是操作系统提示符,“cat hello.py
”告诉我们文件“hello.py
”有一个一行Python程序来打印字符串。
我们调用 Python 解释器并告诉它从文件“hello.py
”中读取源代码,而不是以交互方式提示我们输入 Python 代码行。
您会注意到,文件中的 Python 程序末尾不需要 quit ()
。当 Python 从文件中读取源代码时,它知道在到达文件末尾时停止。
什么是程序?
程序最基本的定义是一系列旨在执行某些操作的 Python 语句。即使我们简单的hello.py脚本也是一个程序。它是一个单行程序,并不是特别有用,但从最严格的定义来看,它是一个Python程序。
理解程序是什么最简单的方法可能是思考一个程序可能要解决的问题,然后查看一个可以解决该问题的程序。
假设您正在 Facebook 帖子上进行社交计算研究,并且您对一系列帖子中最常用的单词感兴趣。您可以打印出 Facebook 帖子流,然后仔细研究文本,寻找最常见的单词,但这会花费很长时间,而且很容易出错。明智的做法是编写一个 Python 程序来快速准确地处理该任务,这样您就可以在周末做一些有趣的事情。
例如,请看以下有关小丑和汽车的文本。查看文本并找出最常见的单词以及它出现的次数。
the clown ran after the car and the car ran into the tent
and the tent fell down on the clown and the car
然后想象一下您正在执行此任务并查看数百万行文本。坦率地说,你学习 Python 并编写一个 Python 程序来统计单词比手动扫描单词更快。
更好的消息是,我已经想出了一个简单的程序来查找文本文件中最常见的单词。我写了它,测试了它,现在我把它给你使用,这样你就可以节省一些时间。
name = input('Enter file:')
handle = open(name, 'r')
counts = dict()for line in handle:words = line.split()for word in words:counts[word] = counts.get(word, 0) + 1bigcount = None
bigword = None
for word, count in list(counts.items()):if bigcount is None or count > bigcount:bigword = wordbigcount = countprint(bigword, bigcount)# Code: http://www.py4e.com/code3/words.py
您甚至不需要了解 Python 即可使用该程序。您需要读完本书的第 10 章才能完全理解用于编写该程序的出色 Python 技术。您是最终用户,您只需使用该程序并惊叹于它的聪明才智以及它如何为您节省了如此多的手动工作。您只需将代码输入到名为Words.py
的文件中并运行它,或者从http://www.py4e.com/code3/下载源代码 并运行它。
这是一个很好的例子,说明了 Python 和 Python 语言如何充当你(最终用户)和我(程序员)之间的中介。Python 是我们用通用语言交换有用的指令序列(即程序)的一种方式,任何在计算机上安装 Python 的人都可以使用它。所以我们都不是在与 Python对话,而是通过Python相互通信 。
The building blocks of programs
在接下来的几章中,我们将详细了解Python的词汇、句子结构、段落结构和故事结构。我们将了解 Python 的强大功能以及如何将这些功能组合在一起以创建有用的程序。
我们使用一些低级概念模式来构建程序。这些构造不仅适用于 Python 程序,它们也是从机器语言到高级语言的每种编程语言的一部分。
输入
从“外部世界”获取数据。这可能是从文件中读取数据,甚至是从麦克风或 GPS 等某种传感器中读取数据。在我们最初的程序中,我们的输入将来自用户在键盘上键入数据。
输出
在屏幕上显示程序的结果或将它们存储在文件中,或者将它们写入扬声器等设备以播放音乐或朗读文本。
顺序执行
按照脚本中出现的顺序依次执行语句。
条件执行
检查某些条件,然后执行或跳过一系列语句。
重复执行
重复执行一组语句,通常会有一些变化。
复用
编写一次指令集并给它们命名,然后根据需要在整个程序中重复使用这些指令。
这听起来简单得令人难以置信,当然,它从来没有这么简单。这就好比说走路就是“把一只脚放在另一只脚的前面”。编写程序的“艺术”是将这些基本元素多次组合和编织在一起,以产生对用户有用的东西。
上面的字数统计程序直接使用所有这些模式,除了其中一种。
可能会出现什么问题?
正如我们在最早与 Python 的对话中看到的那样,我们在编写 Python 代码时必须非常精确地进行沟通。最小的偏差或错误都会导致Python放弃查看你的程序。
新手程序员经常将 Python 不容许错误的事实视为 Python 卑鄙、可恨和残忍的证据。虽然 Python 似乎喜欢其他人,但 Python 很了解他们并对他们怀恨在心。由于这种怨恨,Python 接受了我们编写完美的程序,并以“不适合”为由拒绝它们,只是为了折磨我们。
>>> primt 'Hello world!'
File "<stdin>", line 1primt 'Hello world!'^
SyntaxError: invalid syntax
>>> primt ('Hello world')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
NameError: name 'primt' is not defined>>> I hate you Python!
File "<stdin>", line 1I hate you Python!^
SyntaxError: invalid syntax
>>> if you come out of there, I would teach you a lesson
File "<stdin>", line 1if you come out of there, I would teach you a lesson^
SyntaxError: invalid syntax
>>>
与 Python 争论没有什么好处。它只是一个工具。它没有任何情感,很高兴并随时准备在您需要时为您服务。它的错误消息听起来很刺耳,但它们只是 Python 的求助信号。它已经查看了您输入的内容,但它根本无法理解您输入的内容。
Python更像是一只狗,无条件地爱你,有几个它能理解的关键词,一脸甜蜜地看着你(>>>
),等待你说出它能理解的话。当Python说“SyntaxError: invalid syntax
”时,它只是摇着尾巴说:“你似乎说了些什么,但我只是不明白你的意思,但请继续跟我说话(>>>
)。”
随着您的程序变得越来越复杂,您将遇到三种常见类型的错误:
Syntax errors 语法错误
这些是您最容易犯的错误,也是最容易修复的错误。语法错误意味着你违反了 Python 的“语法”规则。Python 会尽力指出它发现混淆的行和字符。语法错误中唯一棘手的一点是,有时需要修复的错误实际上出现在程序中,而不是 Python注意到它被混淆的地方。因此,Python 在语法错误中指示的行和字符可能只是您调查的起点。
Logic errors 逻辑错误
逻辑错误是指您的程序具有良好的语法,但语句的顺序存在错误,或者语句之间的相互关系可能存在错误。逻辑错误的一个很好的例子可能是,“从水瓶中喝一杯水,将其放入背包中,步行到图书馆,然后将顶部放回瓶子上。”
Semantic errors 语义错误
语义错误是指您对要采取的步骤的描述在语法上是完美的并且顺序正确,但程序中只是存在错误。该程序完全正确,但它没有达到您的预期让它去做。一个简单的例子是,如果您向某人指示去一家餐馆的方向,并说:“……当您到达加油站的十字路口时,左转并前行一英里,餐馆就在您左边的一栋红色建筑中。” 你的朋友很晚了,打电话给你,告诉你他们在农场里,在谷仓后面走来走去,没有餐馆的迹象。然后你说“你在加油站左转还是右转?” 他们说,“我完全遵循了你的指示,我把它们写下来了,上面写着在加油站左转,走一英里。” 然后你说,“我很抱歉,因为虽然我的指令在语法上是正确的,但遗憾的是它们包含一个小的但未被发现的语义错误。”。
同样,在所有三种类型的错误中,Python 只是尽最大努力准确地执行您所要求的操作。
Debugging 调试
当 Python 吐出错误或者甚至给出与预期不同的结果时,就会开始寻找错误原因。调试是查找代码中错误原因的过程。当您调试程序时,尤其是在处理硬错误时,可以尝试以下四件事:
reading
检查你的代码,自己读一遍,并检查它是否表达了你的意思。
running
通过进行更改和运行不同的版本进行试验。通常,如果您在程序中正确的位置显示正确的内容,问题就会变得明显,但有时您必须花一些时间来构建调试方法。
ruminating
花点时间思考一下!它是什么样的错误:语法错误、运行时错误、语义错误?您可以从错误消息或程序的输出中获得哪些信息?什么样的错误可能会导致您遇到的问题?在问题出现之前,您最后更改了什么?
retreating
在某些时候,最好的做法是退出,撤消最近的更改,直到您回到可以运行且您理解的程序为止。然后你就可以开始重建了。
初学者有时会陷入其中一项活动而忘记其他活动。找到一个棘手的错误需要阅读、运行、反思,有时还需要撤退。如果您在其中一项活动中遇到困难,请尝试其他活动。每个活动都有自己的失败模式。
例如,如果问题是打字错误,那么阅读代码可能会有所帮助,但如果问题是概念性误解,则没有帮助。如果你不明白你的程序在做什么,你可以读 100 遍也看不到错误,因为错误就在你的头脑中。
运行实验会有所帮助,特别是当您运行小型、简单的测试时。但是,如果您在不思考或阅读代码的情况下进行实验,您可能会陷入我称之为“随机游走编程”的模式,这是进行随机更改直到程序执行正确操作的过程。不用说,随机游走编程可能需要很长时间。
你必须花时间思考。调试就像一门实验科学。您应该至少对问题所在有一种假设。如果存在两种或多种可能性,请尝试考虑一个可以消除其中一种的测试。
休息一下有助于思考。说话也是如此。如果你向别人(甚至向自己)解释问题,有时你会在问完问题之前找到答案。
但是,如果错误太多,或者您尝试修复的代码太大且太复杂,那么即使是最好的调试技术也会失败。有时,最好的选择是撤退,简化程序,直到找到可行且您理解的东西。
初学程序员往往不愿意退却,因为他们无法忍受删除一行代码(即使是错误的)。如果这让您感觉好一点,请在开始剥离程序之前将其复制到另一个文件中。然后你可以一次一点地把这些碎片粘贴回去。
学习之旅
当您阅读本书的其余部分时,如果这些概念第一次看起来不太协调,请不要担心。当你学习说话时,最初几年,你只是发出可爱的咯咯声,这并不是问题。如果你花六个月的时间从简单的词汇转变为简单的句子,再花 5 到 6 年的时间从句子转变为段落,再花几年的时间才能写出一个有趣的完整短篇故事。自己的。
我们希望您更快地学习 Python,因此我们在接下来的几章中同时教授所有内容。但这就像学习一门新语言一样,需要时间来吸收和理解,然后才能感觉自然。当我们在定义构成大图景的微小片段时,当我们访问并重新访问主题以试图让您看到大图景时,这会导致一些混乱。虽然本书是线性编写的,并且如果您正在学习一门课程,它将以线性方式进展,但请不要犹豫,在处理材料的方式上采取非常非线性的方式。向前和向后看,轻柔地阅读。通过浏览更高级的材料而不完全理解细节,您可以更好地理解“为什么?” 编程的。通过回顾以前的材料,甚至重做以前的练习,
通常当你学习第一门编程语言时,会有一些美妙的“啊哈!” 当你用锤子和凿子敲打岩石时,抬起头,走开,发现你确实在建造一座美丽的雕塑。
如果某件事看起来特别困难,那么熬夜盯着它通常是没有价值的。休息一下,小睡一下,吃点零食,向某人(或者也许是你的狗)解释你遇到的问题,然后用新的眼光重新审视它。我向您保证,一旦您学习了本书中的编程概念,您回头看时会发现这一切都非常简单和优雅,您只需要花一些时间即可吸收它。
Glossary 词汇表
bug
漏洞
程序中出现的错误。
central processing unit
中央处理器
任何计算机的心脏。它运行我们编写的软件;也称为“CPU”或“处理器”。
compile
编译
将用高级语言编写的程序一次性翻译成低级语言,为以后的执行做准备。
high-level language
高级语言
像 Python 这样的编程语言,其设计目的是易于人类阅读和编写。
interactive mode
交互模式
一种通过在提示符下键入命令和表达式来使用 Python 解释器的方法。
interpret
解释
通过一次一行翻译来执行高级语言的程序。
low-level language
低级语言
一种旨在易于计算机执行的编程语言;也称为“机器代码”或“汇编语言”。
machine code
机器码
软件的最低级语言,是由中央处理单元(CPU)直接执行的语言。
main memory
主存储器
存储程序和数据。当电源关闭时,主存储器会丢失其信息。
parse
解析
检查程序并分析语法结构。
portability
可移植性
可以在多种计算机上运行的程序的属性。
print function
打印功能
使 Python 解释器在屏幕上显示值的指令。
problem solving
解决问题
提出问题、寻找解决方案并表达解决方案的过程。
program
程序
指定计算的一组指令。
prompt
提示语
当程序显示一条消息并暂停以供用户向程序键入一些输入时。
secondary memory
辅助存储器
即使电源关闭,也可以存储程序和数据并保留其信息。通常比主内存慢。辅助存储器的示例包括磁盘驱动器和 USB 棒中的闪存。
semantics
语义
程序表达的意思。
semantic error
语义错误
程序中的错误,导致程序执行与程序员预期不同的操作结果。
source code
源代码
高级语言的程序。
Exercises 练习
练习1:计算机中辅助存储器的作用是什么?
a) 执行程序的所有计算和逻辑
b) 通过互联网检索网页
c) 长期存储信息,甚至超出电源周期
d) 接受用户输入
练习2:什么是程序?
练习3:编译器和解释器有什么区别?
练习 4:以下哪项包含“机器代码”?
a) Python 解释器
b) 键盘
c) Python 源文件
d) 文字处理文档
练习 5:以下代码有什么问题:
>>> primt 'Hello world!'
File "<stdin>", line 1primt 'Hello world!'^
SyntaxError: invalid syntax
>>>
练习 6:以下 Python 行结束后,计算机中的什么位置存储了诸如“x”之类的变量?
x = 123
a) 中央处理单元
b) 主存储器
c) 辅助存储器
d) 输入设备
e) 输出设备
练习 7:以下程序将打印什么:
x = 43
x = x - 1
print(x)
a) 43
b) 42
c) x + 1
d) Error because x = x + 1 is not possible mathematically
练习 8:使用人类能力的示例解释以下各项:
(1) 中央处理单元,(2) 主存储器,(3) 辅助存储器,(4) 输入设备,以及 (5) 输出设备。
例如,“人体各项器官中相当于中央处理器功能的是什么?”
练习 9:如何修复“语法错误”?