Python游戏编程快速上手(第4版)(txt+pdf+epub+mobi电子书下载)


发布时间:2020-07-20 03:45:10

点击下载

作者:[美]Al Sweigart(斯维加特)

出版社:人民邮电出版社

格式: AZW3, DOCX, EPUB, MOBI, PDF, TXT

Python游戏编程快速上手(第4版)

Python游戏编程快速上手(第4版)试读:

前言

当我在孩童时代第一次玩视频游戏的时候,我就被深深吸引住了。但是,我并不只是想玩视频游戏,我想要开发游戏。我找到像这本书一样的一本书,它教我如何编写第一个程序和游戏。它很有趣也很容易。我所开发的第一款游戏就像是本书中的这些游戏一样。它们就像我父母给我买的任天堂游戏一样有趣,但它们是我自己所开发的游戏。

现在,作为一名成年人,我仍然能够享受到编程的乐趣,并且能从中获到回报。但是,即便当你长大成人后并没有成为一名程序员,编程也还是一种有用而且有趣的技能。它训练你的大脑去思考逻辑、做出规划,并且当你从代码中发现错误的时候,会重新考虑你的思路。

目前的编程书籍大多分为两种类型。第一种,与其说是教编程的书,倒不如说是在教“游戏制作软件”,或教授使用一种呆板的语言,使得编程“简单”到不再是编程。而第二种,它们就像是教数学课一样教编程:所有的原理和概念都以小的应用程序呈现给读者。本书采用了不同的方式,教你通过开发视频游戏来学会编程。我直接展示了游戏的源代码,并且通过实例来解释编程的原理。在我学习编程的时候,这种方法起到了关键作用。对于其他人的程序是如何工作的,我学习的越多,对自己的程序的思路也越多。你所需要的只是计算机、一种叫做Python解释器的免费软件以及这本书。一旦你学会了如何开发本书中的游戏,你就能够自己开发游戏了。

计算机是不可思议的机器,并且学习编写计算机程序并不像人们想象的那样难。计算机程序就是计算机所能够理解的一堆指令,这就像一本故事书就是读者可以读懂的一堆句子一样。

要对计算机发号施令,就使用计算机能够理解的语言来编写一个程序。本书介绍的是一种叫做Python的编程语言。有很多种不同的编程语言,如BASIC、Java、JavaScript、PHP和C++等。

当我还是一个孩子的时候,BASIC是作为第一门编程语言来学习的。然而,此后出现了像Python这样的新的编程语言。Python学起来甚至比BASIC还要简单!但是Python也是供专业程序员使用的一种正规语言。此外,安装和使用Python完全是免费的,你只需要连接到因特网并下载它就可以了。

视频游戏无外乎计算机程序,它们也是由指令构成的。在本书中,我们将要创建的游戏看上去比Xbox、PlayStation或者Nintendo的游戏简单。这些游戏没有绚丽的图案,因为我们要用它们来教授基本的编程知识。我们有意选择这些简单的游戏,以便你可以专注于学习编程。游戏并非复杂才有趣。本书的目标读者

编程并不难。但是,却很难找到教你通过编程来做有趣事情的学习材料。有些计算机书籍会介绍很多大部分新手程序员都不需要了解的话题。本书将介绍如何编写自己的计算机游戏。你将学习到有用的技巧和可以展示的有趣游戏。本书的目标读者是:● 想要自学计算机编程的完全初学者,他们甚至之前没有任何编程

经验;● 想要通过创建游戏来学习编程的青少年;● 想要教其他人编程的成年人和教师;● 任何想要通过学习专业编程语言来学习如何编程的人,无论是年

轻人还是老年人。本书主要内容

在本书的大多数章节中,我们都会介绍并讲解一个单独的新的游戏项目。有几章会介绍额外的有用的主题,例如调试。当游戏用到新的编程概念的时候,会讲解这些概念,并且这些章是有意让读者按照顺序来阅读的。以下是每章内容的一个简短说明。● 第1章介绍了如何通过每次一行代码来体验一下如何使用Python

的交互式shell。● 第2章介绍了如何在Python的文件编辑器中编写完整的程序。● 在第3章中,我们将编写本书中的第1个程序——猜数字程序,

它会要求玩家猜测一个神秘数字,然后针对玩家的猜测是太高了

还是太低了给出提示。● 在第4章中,我们将编写一个简单的程序来给用户讲几个笑话。● 在第5章中,我们将编写一个猜测游戏,其中,玩家必须从两个

山洞中做出选择,一个山洞中是友善的龙,另一个山洞中是饥饿

的龙。● 第6章介绍了如何使用调试器来修正代码中的问题。● 第7章说明了如何使用流程图来规划像Hangman游戏这样较长的

程序。● 在第8章中,我们将根据第7章的流程图,来编写Hangman游

戏。● 第9章使用了Python的字典数据类型,给Hangman游戏扩展了新

的功能。● 在第10章中,我们将学习如何使用人工智能来编写人机对抗的

Tic-Tac-Toe游戏。● 在第11章中,我们将学习如何开发一款叫做Bagels的推理游戏,

其中,玩家必须根据线索来猜测神秘数字。● 第12章介绍了笛卡尔坐标系,我们将在后面的游戏中用到它。● 在第13章中,我们将学习如何编写一款寻宝游戏,其中,玩家

要在海洋中搜索丢失的藏宝箱。● 在第14章中,我们将开发一个简单的加密程序,它允许我们加

密和解密秘密消息。● 在第15章中,我们将编写一款高级的人机对抗的Reversi类游

戏,其中有一个几乎无法战胜的人工智能对手。● 第16章基于第15章的Reversi游戏进行了扩展,编写了多个AI并

让其在人机对抗游戏中竞争。● 第17章介绍了Python的pygame模块,并且展示了如何使用它来

绘制2D图形。● 第18章介绍了如何使用pygame实现图形动画。● 第19章介绍了在2D游戏中,如何检测物体何时彼此碰撞。● 在第20章中,我们将通过添加声音和图像来改进简单的Pygame

游戏。● 第21章组合了第17章到第20章的概念,开发了一款叫做Dodger

的动画游戏。如何使用本书

本书中的大多数章,都是以该章的特色程序的一个运行示例开始的。这个运行示例,展示了当你运行程序的时候所看到的样子。用户输入的部分用粗体显示。

我建议你自行将每个程序的代码输入到IDLE的文件编辑器中,而不是下载或复制粘贴它们。如果花一些时间来录入代码的话,你将会记住更多内容。行号和缩进

当输入本书中的源代码的时候,不要输入每行开始的行号。例如,如果你看到如下的代码行,不需要输入左边的9.以及其后面的一个空格:9.number = random.randint(1, 20)

应该只是输入如下内容:number = random.randint(1, 20)

这里的行号只是为了方便在图书中引用程序中特定的行。它们并不是真正的程序源代码的一部分。除了行号,其他的地方完全按照本书代码的样子录入。注意,有些代码行有4个或8个(或者更多的)空格缩进。代码行开始处的空格是根据Python如何解释指令而变化的,因此,包含这些空格是很重要的。我们来看一个示例。这里的缩进空格用黑色的圆点(•)标记出来,以便你可以清晰地看到它们。while guesses < 10:••••if number == 42:••••••••print('Hello')

第1行代码没有缩进,第2行代码缩进了4个空格,并且第3行代码缩进了8个空格。尽管本书中的示例并没有使用黑色的圆点来标记空格,但IDLE中的每一个字符都具有相同的宽度,因此,可以通过统计每一行之上或之下的字符数,来计算出空格的数目。较长的代码行

有些代码指令太长了,在本书中无法放到一行之中,并且会换行到下一行。但是,这些代码行在你的计算机屏幕上显示是没有问题的,因此,输入完整的一行而不要按下回车键。通过查看左边的行号,你就知道什么时候一条新的指令开始了。如下的示例只有两条指令:1.print('This is the first instruction!xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx xxxxxxxxxxxx')2.print('This is the second instruction, not the third instruction.')

第1条指令换行到页面中的第2行,但是,第2行并没有一个行编号,因此,你很清楚这仍然是第1行的代码。下载和安装Python

我们需要安装一个叫做Python解释器的软件。解释器程序理解我们用Python语言编写的指令。从现在开始,我把“Python解释器软件”直接简称为“Python”。

下面,我将介绍如何针对Windows、OS X或Ubuntu下载和安装Python 3,特别是Python 3.4。还有比Python 3.4更新一些的版本,但是我们在第17章到第21章所使用的pygame模块,当前只支持Python 3.4。

Python 2和Python 3之间还有一些显著的区别。本书中的程序使用Python 3,并且,如果你试图用Python 2运行它们的话,将会得到错误。这一点很重要,实际上,我在本书中加入了一些企鹅的卡通图片来提醒你这一点。

在Windows下,从https://www.python.org/downloads/release/python-344/下载Windows x86-64 MSI安装程序,然后双击它。你必须输入计算机的管理员密码。

按照安装程序在屏幕上显示的说明来安装Python,如下所示。

1.选择Install for All Users,然后单击Next按钮。

2.单击Next按钮,将程序安装在C:\Python34文件夹下。

3.单击Next按钮,跳过Customize Python部分。

在Mac OS X操作系统中,从https://www.python.org/downloads/release/python-344/下载Mac OS X 64-bit/32-bit安装程序,并且双击它。按照安装程序在屏幕上显示的说明来安装Python,如下所示。

1.如果你得到一条“‘Python.mpkg’ can’t be opened because it is from an unidentified developer”的警告,按下Ctrl键的同时用鼠标右键点击Python.mpkg文件,然后,从所出现的菜单中选择Open。可能需要输入计算机管理员的密码。

2.在Welcome部分,单击Continue按钮,并且单击Agree按钮以接受许可协议。

3.选择Macintosh HD(或者任意硬盘驱动器名称),并且单击Install按钮。

如果你使用的是Ubuntu操作系统,可以通过Ubuntu Software Center,按照如下步骤安装Python。

1.打开Ubuntu Software Center。

2.在窗口右上角的搜索框中输入Python。

3.选择IDLE (Python 3.4 GUI 64 bit)。

4.单击Install按钮。可能需要输入计算机管理员的密码来完成安装。

如果在以上的步骤中遇到问题,可以通过https://www.nostarch.com/inventwithpython/找到替代的Python 3.4安装说明。启动IDLE

IDLE表示交互式开发环境(Interactive DeveLopment Environment)。对于编写Python程序来说,这个开发环境就像是字处理软件一样。在不同的操作系统上,启动IDLE的方式有所不同。

在Windows操作系统中,单击左下角的启动按钮,输入“IDLE”并且选择IDLE(Python GUI)。

在Mac OS X操作系统中,打开Finder窗口,点击Applications。接下来单击Python 3.x。然后单击IDLE图标。

在Ubuntu或者Linux操作系统中,打开一个终端窗口,然后输入“idle3”。也可以单击屏幕上端的Applications。然后单击Programming和IDLE 3。

当第一次运行IDLE时,出现的窗口是交互式的shell,如图1所示。你可以在交互式shell的>>>提示符后输入Python指令,Python就会执行这些指令。显示完执行指令的结果之后,会出现一个新的>>>提示符,并等待下一条指令。图1 IDLE程序的交互式shell寻求在线帮助

可以从https://www.nostarch.com/inventwithpython/找到许多与本书相关的代码文件和其他资源。如果你想要询问和本书相关的编程问题,请访问http://reddit. com/r/inventwithpython,或者,可以将你的编程问题通过E-mail发送到al@inventwithpython.com。

当询问编程问题时,注意如下几点。● 如果录入了本书中的程序,但是发现一个错误,在提问之前,请

先通过https://www.nostarch.com/inventwithpython#diff的在线diff

工具检查录入错误。复制代码并将其粘贴到diff工具中,以查看

你的程序和本书中的代码之间的任何差异。● 从网上查找是否有人也问过(或者回答)和你同样的问题。

记住,你将自己的编程问题描述的越好,其他人就越能够给予你帮助。当询问编程问题的时候,请做好以下的事情。● 当描述错误的时候,说明你想要做什么。这会让帮助你的人知道

你是否完全走错了路。● 复制并粘贴完整的错误消息和代码。● 说明你的操作系统和版本。● 说明你已经尝试了哪些方法去解决问题。这就告诉人们,你已经

做了一些工作来试图自己解决问题。● 要有礼貌。不要命令帮助你的人或者给他们以求让其快速做出回

答。

既然你已经知道了如何寻求帮助,你将立刻开始学习如何编写自己的计算机游戏。第1章交互式Shell

在开始编写游戏之前,我们需要学习一些基本的编程概念。在本章中,我们首先学习如何使用Python的交互式Shell以及进行基本的算术运算。

本章主要内容:● 操作符;● 整数和浮点数;● 值;● 表达式;● 语法错误;● 在变量中存储值。1.1 一些简单的数学知识

按照前言中介绍的步骤打开IDLE。首先,我们将使用Python来解决一些简单的数学问题。

交互式shell可以像计算器一样工作。在交互式shell的>>>提示符之后,输入2+2,然后按下回车键(有些键盘上显示为RETURN键)。图1-1展示了这个数学问题在交互式shell中的样子,注意,它给出的响应是数字4。图1-1 在交互式shell中输入2+2

这道数学题就是一个简单的编程指令。加号(+)告诉计算机把数字2和2相加。计算机这么做了,并且在下一行中用数字4作为响应。表1-1列出了Python中其他可用的数学符号。表1-1 Python中的各种数学操作符操作符运算+加法−减法*乘法/除法

减号(−)是数字相减。乘号(*)是数字相乘。除号(/)是数字相除。当以这种方式使用时,+、−、*和/叫做操作符(operator)。操作符告诉Python要对它们旁边的数字进行何种运算。1.1.1 整数和浮点数

整数(integer)就是诸如4、99或者0这样的完整的数。浮点数(简写为float)就是诸如3.5、42.1或者5.0这样的分数或小数。在Python中,数字5是整数,但是5.0是浮点数。

这些数字都称为值(value)(稍后,我们将介绍数字以外的其他的值)。在刚才我们在shell中输入的数学问题中,两个2都是整数值。1.1.2 表达式

数学题2 + 2就是表达式(expression)的一个例子。如图1-2所示,表达式是由操作符(数学符号)所连接起来的值(数字)组成的,它会产生可供代码使用的一个新的值。图1-2 表达式由值和操作符组成

计算机可以在几秒钟之内解决数百万道这样的数学题。

尝试在交互式shell中输入一些这样的数学问题,每输入完一道题后按一下回车键。>>> 2+2+2+2+210>>> 8*648>>> 10-5+611>>> 2 + 24

这些表达式看上去都像是常规的数学公式,但是注意2+2的示例中的所有的空格。在Python中,在值和操作符之间可以添加任意多个空格。然而,当把指令输入到交互式shell中时,必须总是从一行的开头开始执行(即指令之前不能有空格)。1.2 计算表达式

当计算机求解表达式10 + 5并且得到值15的时候,它就已经计算了这个表达式。计算一个表达式就是把表达式规约为一个数字,就像解答一道数学题而把问题简化成一个数字一样,这个单个的数字就是答案。表达式10 + 5和表达式10 + 3 + 2的计算结果都是15。

当Python计算一个表达式的时候,它就像你在做数学题的时候一样,按照顺序进行操作。有如下的几条规则:● 位于括号之中的表达式部分先计算;● 乘法和除法在加法和减法之前计算;● 从左向右进行计算。

表达式1 + 2 * 3 + 4的计算结果是11,而不是13,因为先计算2 * 3。如果表达式是(1 + 2)*(3 + 4),那么将会计算为21。因为(1 + 2)和(3 + 4)位于括号之中,它们会在乘法之前计算。

表达式可以是任意大小的,但它们总是会求解得到一个数字。即便单个值也可以是表达式:表达式15的计算结果就是值15。例如,表达式8 * 3 / 2 + 2 + 7−9,通过如下步骤,其计算结果是值12.0:

即便是计算机会执行所有这些步骤,我们在交互式shell中也看不到所有这些步骤。交互式shell只是把结果展示给我们。>>> 8 * 3 / 2 + 2 + 7 - 912.0

需要注意的是,除法操作符(/)的运算结果是一个浮点数,例如,24/2的结果是12.0。即便是只使用了一个浮点数的数学运算,其结果也是浮点数,所以12.0 +2的结果是14.0。1.3 语法错误

如果在交互式shell中输入5+,将会得到如下的一条错误消息。>>> 5 +SyntaxError: invalid syntax

之所以会产生这个错误,是因为5+不是一个表达式。表达式通过操作符来连接值,因此加法操作符+期待在其前面和后边都有一个值。当漏掉了期待的值的时候,就会出现一条错误消息。

SyntaxError表示Python不理解这条指令,因为你的输入不正确。计算机编程并不只是告诉计算机要做什么,还要知道如何正确地向计算机传达指令。

但是,不要担心出错。错误并不会对计算机造成危害。只要在交互式shell中的下一个>>>提示符处,重新输入正确的指令即可。1.4 在变量中存储值

当表达式计算为一个值的时候,我们可以把这个值存储到变量中,以便在后面可以使用它。我们把变量当做是一个可以保存值的盒子。

一条赋值语句(assignment statement)会把一个值保存到一个变量中。输入变量的名称,后边跟着等号(=称为赋值操作符),然后是要存储到这个变量中的值。例如,在交互式shell中输入spam = 15:>>> spam = 15>>>

这将把值15存储到spam变量的盒子中,如图1-3所示。图1-3 变量就像是可以容纳值的盒子

当按下回车键时,你不会看到任何响应。在Python中,如果没有出现错误,就表示成功地执行了指令。然后将会出现>>>提示符,你就可以输入下一条指令了。

和表达式不同,语句是不会计算为任何值的指令。正因为如此,在spam = 15之后,交互式shell的下一行中没有显示任何的值。如果你不清楚哪些指令是表达式,哪些指令是语句,那么请记住:表达式会得到一个值,而任何其他类型的指令都是一条语句。

变量保存的是值而不是表达式。例如,考虑一下语句spam = 10 + 5和spam = 10 + 7 − 2中的表达式。它们的运算结果都是15。最终结果是相同的:两条赋值语句都把值15保存到了变量spam中。

一个好的变量名能够描述它所包含的数据。想象一下,你将要搬到一个新房子中,并且将你用来搬家的所有箱子都贴上一个名为“东西(stuff)”的标签。你什么东西也找不到!在本书中,为变量而使用的变量名的例子是spam、eggs和bacon等。

第一次在赋值语句中使用一个变量的时候,Python将会创建该变量。要查看变量中的值,在交互式shell中输入该变量的名称:>>> spam = 15>>> spam15

表达式spam得到了变量spam中的值,即15。可以在表达式中使用变量。尝试在交互式shell中输入如下指令:>>> spam = 15>>> spam + 520

我们已经把变量spam的值设置为15,所以输入spam + 5就像是输入表达式15 + 5一样。下面是spam + 5的运算步骤:

在赋值语句创建变量之前,不能使用该变量。否则,Python将会给出一个NameError错误,因为尚不存在该名称的变量。输错了变量名称也会得到这样一个错误:>>> spam = 15>>> spmaTraceback (most recent call last): File "", line 1, in spmaNameError: name 'spma' is not defined

出现这个错误,是因为虽然有spam变量,但是并没有名为spma的变量。

可以通过输入另一条赋值语句来修改变量中存储的值。例如,尝试在交互式shell中输入如下语句:>>> spam = 15>>> spam + 520>>> spam = 3>>> spam + 58

当第一次输入spam + 5时,表达式的计算结果是20,因为我们把15存储在spam中。然而,当输入spam = 3时,用值3替代(或覆盖)了值15,因为变量一次只能保存一个值。现在,当我们输入spam + 5时,表达式的计算结果是8,因为现在spam的值是3。覆盖的过程如图1-4所示。图1-4 用值3覆盖了spam中的值15

我们甚至可以使用spam变量中的这个值,来给spam赋一个新的值:>>> spam = 15>>> spam = spam + 520

赋值语句spam = spam + 5的意思是:“spam变量中的新值是,spam当前的值加上5”。通过在交互式shell中输入如下的语句,让spam中的值持续几次增加5:>>> spam = 15>>> spam = spam + 5>>> spam = spam + 5>>> spam = spam + 5>>> spam30

在这个示例中,我们在第1条语句中给spam赋了一个15的值。在下一条语句中,我们用spam的值加上了5,并且将新的值spam+5赋值给了spam,这个表达式会计算为20。当这么做3次以后,spam的值最终为30。

到目前为止,我们只看到了一个变量,但是,在程序中,你可以根据需要创建任意多个变量。例如,让我们给名为eggs和bacon的两个变量分配不同的值,如下所示:>>> bacon = 10>>> eggs = 15

现在,变量bacon中是10,变量eggs中是15。每个变量都有自己的盒子,其中拥有其自己的值,如图1-5所示。图1-5 变量“bacon”和变量“eggs”中所存储的值

尝试在交互式shell中输入spam = bacon + eggs,然后查看spam中的新值:>>> bacon = 10>>> eggs = 15>>> spam = bacon + eggs>>> spam25

现在,spam中的值是25。当把bacon和eggs相加时,就是把它们的值10和15相加。变量包含的是值而不是表达式。把值25赋给变量spam,而不是把表达式bacon + eggs赋给变量。在spam = bacon + eggs赋值语句之后,对于bacon或者eggs的修改不会再影响到spam。1.5 小结

在本章中,我们介绍了关于编写Python指令的基础知识。计算机不具备人的常识,并且只能理解特定的指令。因此,Python需要你准确地告诉它要做什么工作。

表达式是用操作符(如+或−)把值(如2或5)组合起来。Python可以计算表达式,也就是把表达式规约为一个值。可以把值保存在变量中,以便程序可以记住它们,并且随后可以使用它们。

在Python中,有许多其他类型的操作符和值。在下一章中,我们将介绍更多的基础概念,并且编写第一个程序。我们还会介绍在表达式中使用文本。Python不仅能够处理数字,它的功能比计算器要强大得多。第2章编写程序

现在,让我们来看看Python能够对文本做些什么。几乎所有的程序都会向用户显示文本,并且用户通过键盘把文本输入到程序中。在本章中,我们将编写第一个程序,它既向用户显示文本,也允许用户输入文本。我们将学习如何将文本存储到变量中,如何组合文本,以及如何将其显示到屏幕上。我们所要创建的程序将会显示Hello world!来和用户打招呼,并且询问用户的名字。

本章主要内容:● 字符串;● 连接字符串;● 数据类型(诸如字符串或者整数);● 使用文件编辑器来编写程序;● 在IDLE中保存并且运行程序;● 执行的流程;● 注释;● print()函数;● input()函数;● 区分大小写。2.1 字符串值

在Python中,把文本值叫做字符串(string)。字符串值可以像整数或者浮点数一样地使用。我们可以把字符串保存到变量中。在代码中,字符串值使用单引号(')作为起始和结束。尝试在交互式shell中输入如下代码: >>> spam = 'hello'

单引号告诉Python,字符串从哪里开始到哪里结束。单引号不是字符串值的文本的一部分。现在,如果在交互式shell中输入spam,就可以看到spam变量中的内容。请记住,Python将变量计算为变量中所存储的值。在这个示例中,spam存储的值就是字符串'hello'。 >>> spam = 'hello'>>> spam'hello'

字符串可以包含任意的键盘字符,其长度也可以是任意的。一些字符串示例如下所示:'hello''Hi there!''KITTENS''7 apples, 14 oranges, 3 lemons''Anything not pertaining to elephants is irrelephant.''A long time ago, in a galaxy far, far away...''O*&#wY%*&OCfsdYO*&gfC%YO*&%3yc8r2'2.2 连接字符串</p><p>可以使用操作符把字符串值组合成表达式,就像对整数和浮点数所做的那样。可以使用+操作符组合两个字符串。这就是字符串连接。尝试在交互式shell中输入'Hello' + 'World!'。>>> 'Hello' + 'World!''HelloWorld!'</p><p>这个表达式的结果是字符串值'HelloWorld!'。两个单词之间没有空格,因为两个待连接的字符串中都没有空格,这和下面示例不同:>>> 'Hello ' + 'World!''Hello World!'</p><p>对于字符串和整数来讲,+操作符的作用并不相同,因为字符串和整数是不同的数据类型。所有的值都有一个数据类型。'Hello'的数据类型是字符串。5的数据类型是整数。数据类型告诉Python,当计算表达式时,操作符应该做什么。对于字符串,+操作符会把它们连接起来;而对于整数和浮点数,+操作符会把它们相加。2.3 在IDLE的文件编辑器中编写程序</p><p>到目前为止,我们已经在IDLE的交互式shell中输入过指令,并且一次只输入一条指令。然而,当编写程序时,会输入多条指令,然后让它们一起运行,而这正是我们下面将要做的事情。让我们来编写第一个程序!</p><p>除了解释器,IDLE的另外一个部分叫做文件编辑器(file editor)。单击交互式shell窗口顶端的File菜单,然后选择New File。将会出现一个空白窗口供你输入程序代码,如图2-1所示。图2-1 文件编辑器窗口(左边)和交互式shell窗口(右边)</p><p>这两个窗口看上去很相似,但是请记住:交互式shell窗口有>>>提示符,而文件编辑器窗口则没有。2.3.1 创建Hello World程序</p><p>对于程序员来讲,让自己的第一个程序在屏幕上显示“Hello world!”,这是一个传统。现在,你也要创建自己的Hello World程序了。</p><p>当输入程序时,不要输入代码左边的数字。这些数字是为了方便本书按照行号来引用代码。文件编辑器窗口的右下角会告诉你当前光标的位置。图2-2展示了当前光标在第1行(沿着编辑器从上到下)第0列(沿着编辑器从左到右)。图2-2 文件编辑器窗口右下角会告诉你当前光标在何处</p><p>在新的文件编辑窗口中输入如下文本。这就是程序的源代码(source code)。其中包含了当程序运行时Python所要执行的指令。hello.py 1. # This program says hello and asks for my name. 2. print('Hello world!') 3. print('What is your name?') 4. myName = input() 5. print('It is good to meet you, ' + myName)</p><p>IDLE程序用不同的颜色来表示不同类型的指令。输入代码之后,窗口看上去如图2-3所示。图2-3 输入代码后,文件编辑器窗口的样子</p><p>查看一下,以确保你的IDLE窗口看上去是一样的。2.3.2 保存程序</p><p>一旦输入了源代码,就可以点击File►Save As来保存它。或者按下快捷键Ctrl-S来保存源代码。图2-4展示了这将会打开的Save As窗口。在File name文本框中输入hello.py,然后点击Save按钮。图2-4 保存程序</p><p>当输入程序时,应该经常保存。这样的话,即使计算机崩溃或者突然退出IDLE,也不会丢失太多的工作成果。</p><p>现在,加载之前所保存的程序,点击File►Open。从出现的窗口中选择hello.py文件,并且点击Open按钮。将会在文件编辑器窗口打开所保存的hello.py程序。2.3.3 运行程序</p><p>现在,是时候运行程序了。在文件编辑器窗口中点击File►Run Module或者按下F5键。程序会在交互式shell窗口中运行。</p><p>当程序要求输入姓名时,请输入你的姓名,如图2-5所示。图2-5 运行hello.py之后的交互式shell窗口</p><p>当输入姓名并且按下回车键时,程序将会用你的名字来打招呼。恭喜!你已经编写了第一个程序,并且现在已经成为一名程序员了。1秒钟后再次按下F5键运行该程序,输入另一个名字。</p><p>如果有错误,使用https://www.nostarch.com/inventwithpython#diff的在线diff工具,把你的代码与书中的代码进行比较。复制文件编辑器中的代码并且粘贴到这个Web页面中,然后点击Compare按钮。这个工具会高亮显示你的代码与本书代码之间的所有区别,如图2-6所示。图2-6 https://www.nostarch.com/inventwithpython#diff上的在线diff工具</p><p>如果在编写代码时得到一个NameError错误,如下所示,这表示你使用的是Python 2,而不是Python 3。Hello world!What is your name?AlbertTraceback (most recent call last): File "C:/Python26/test1.py", line 4, in <module> myName = input() File "<string>", line 1, in <module>NameError: name 'Albert' is not defined</p><p>要修正这个问题,请安装Python 3.4并运行该程序(参见本书前言中的介绍)。2.4 Hello World程序如何工作</p><p>每行代码就是一条可供Python解释的指令。这些指令构成了程序。计算机程序的指令就像是菜谱的操作步骤。从程序的顶部,沿着指令的列表向下,顺序地执行每条指令。</p><p>在程序中,把Python当前所处的指令叫做执行。当程序开始运行时,执行的是第一条指令。执行完这条指令之后,执行移到下一条指令。</p><p>我们来看一下每行代码是如何工作的。我们从第1行开始。2.4.1 注释</p><p>这条指令是一条注释。1. # This program says hello and asks for my name.</p><p>跟在#(叫做井号)后边的任何文本都是一条注释。注释是程序员针对代码做些什么而给出的注解。注释不是供Python读取的,而是供程序员阅读的。Python会忽略掉注释。程序员通常在代码的开始处放置一条注释,以便给程序起一个名字。Hello World程序的注释告诉你,这个程序会打招呼并询问你的名字。2.4.2 函数:程序中的小程序</p><p>函数就像是程序中的一个小程序,包含了可供Python执行的数条指令。函数的好处在于,你只需要知道函数是做什么的,而无需知道它是如何做的。Python提供了一些已经内建的函数。在Hello World程序中,我们使用了print()和input()这两个函数。</p><p>函数调用是一条指令,它告诉Python运行函数中的代码。例如,你的程序调用了print()函数,在屏幕上显示一个字符串。print()函数接受括号中的字符串作为输入,并且把该文本显示到屏幕上。print()函数</p><p>Hello World程序的第2行和第3行是对print()函数的调用。2. print('Hello world!')3. print('What is your name?')</p><p>在函数调用中,括号之间的值是参数。第2行的print()函数调用的参数是'Hello world!'。第3行的print()函数调用的参数是'What is your name?'。这叫做给print()函数传递参数。input()函数</p><p>第4行是带有变量(myName)和函数调用(input())的一条赋值语句。4. myName = input()</p><p>当调用input()时,程序等待用户输入文本。用户输入的文本字符串成为函数调用所得到的结果值。在表达式中,在可以使用一个值的任何位置,也都可以使用函数调用。</p><p>函数调用的结果值叫做返回值(实际上,“函数调用返回的值”和“函数调用的结果值”的含义是相同的)。在这个示例中,input()函数的返回值是用户输入他们自己的名称的字符串。如果用户输入“Albert”,input()函数调用的结果就是字符串'Albert'。计算过程如下所示:</p><p>这样就把字符串值'Albert'存储到了myName变量中。在函数调用中使用表达式</p><p>Hello World程序的最后一行代码是另一个print()函数调用。5. print('It is good to meet you, ' + myName)</p><p>在print()括号中,是表达式'It is good to meet you, ' + myName。然而,参数总是单个的值。Python会先计算这个表达式,然后将其值作为参数传递给函数。如果MyName中存储的是'Albert',计算过程如下所示:</p><p>程序就是这样根据名称来向用户打招呼的。2.4.3 终止程序</p><p>一旦程序执行了最后一行代码,它会终止或者退出。这意味着程序将停止运行。Python会忘掉在变量中保存的所有的值,也包括存储在myName中的字符串。如果再次运行程序,并且输入一个不同的名字,程序会认为这才是你的名字。Hello world!What is your name?CarolynIt is good to meet you, Carolyn</p><p>请记住,计算机只能做程序要求它做的事情。计算机不会说话,只能严格遵循你给它的指令。计算机不会在乎你输入的是自己的名字、别人的名字还是一些其他的内容。你可以输入任何想要输入的内容。计算机都会以相同的方式来处理它:Hello world!What is your name?poopIt is good to meet you, poop2.5 命名变量</p><p>给变量一个具有描述性的名称,会更容易理解它在程序中的用途。你也可以把这个变量命名为abrahamLincoln或nAmE,而不是命名为myName。Python不关心这些,它只是以相同的方式运行程序。</p><p>但是,对于该变量保存了什么样的信息,abrahamLincoln或nAmE这样的名称并不能够让你了解很多。正如第1章所介绍的,如果你要搬到一个新家之中,并且你将所有的搬家用的箱子都贴上一个叫做“东西(stuff)”的标签,这根本没有任何帮助。本书中的交互式shell示例,使用诸如spam、eggs和bacon这样的变量名,因为在这些示例中,变量名是无关紧要的。然而,本书的程序都使用了具有描述性的名称,你在自己的程序中也应该这么做。</p><p>变量名称区分大小写。区分大小写意味着会把字母相同但大小写不同的变量名当做是不同的变量。所以在Python中,spam、SPAM、Spam和sPAM是4个不同的变量。它们每一个都包含自己的、不同的值。在程序中使用字母相同而大小写不同的变量,这不是一个好主意。应该为变量使用具有描述性的名称。</p><p>变量名通常是小写的。如果变量名中有多个单词,第一个单词之后的每一个单词的首字母都要大写。这会使得代码更容易阅读。例如,变量名whatIHadForBreakfastThisMorning要比whatihadforbreakfastthismorning更容易阅读。像这样将变量名首字母大写的方式,叫做骆驼命名法,它使得代码更具有可读性。程序员还喜欢使用较短的变量名,以使得代码更容易理解: breakfast或者foodThisMorning,要比whatIHadForBreakfastThisMorning更容易阅读。这些都是惯例:你也可以不这么做,但是在Python编程中,这些是标准的做法。2.6 小结</p><p>一旦学习了字符串和函数,就可以开始编写与用户交互的程序了。这很重要,因为文本是用户和计算机彼此通信的主要方式。使用input()函数,用户通过键盘输入文本。使用print()函数,计算机把文本显示到屏幕上。</p><p>字符串只是一种新的数据类型的值。任何值都有一种数据类型,并且一个值的数据类型会影响到+操作符的功能。</p><p>函数可以用做程序的一部分,以执行一些复杂的指令。Python有许多内建函数,我们会在本书中介绍它们。在表达式中,在可以使用值的任何位置,也都可以使用函数调用。</p><p>在程序中,把Python当前所处的指令叫做执行。在下一章中,我们将介绍使得执行移动的更多的方式,而不只是直接从上向下执行。一旦我们掌握了这些知识,就为创建游戏做好了准备。第3章“猜数字”游戏</p><p>在本章中,我们准备编写一个叫做“猜数字”的游戏。计算机想到一个1到20之间的随机数,让你来猜它是几。计算机会告诉你每次猜的数太大还是太小。如果你能够在6次之内猜到正确的数字,就赢了。</p><p>这是一个进行编程练习的很好的游戏,因为在这个小程序中,用到了随机数字、循环和用户输入。我们已经介绍过如何把值转换成不同的数据类型,以及为什么需要这么做。因为这个程序是一个游戏,所以我们会把其用户称为玩家。</p><p>本章主要内容:● import语句;● 模块;● randint()函数;● for语句;● 语句块;● str()函数、int()函数和float()函数;● 布尔类型;● 比较操作符;● =和==的区别;● if语句;● break语句。3.1 “猜数字”的运行示例</p><p>如下是玩家运行程序时的样子。玩家输入的文本用粗体表示。Hello! What is your name?AlbertWell, Albert, I am thinking of a number between 1 and 20.Take a guess.10Your guess is too high.Take a guess.2Your guess is too low.Take a guess.4Good job, Albert! You guessed my number in 3 guesses!3.2 “猜数字”程序的源代码</p><p>通过点击File►New Window打开一个新的文件编辑器窗口。在出现的空白窗口中,输入源代码,并且把它保存为guess.py。然后按下F5键来运行程序。当在文件编辑器中输入代码时,要留意一些代码行前面的空格。有些行有4个或者8个缩进空格。</p><p>如果输入这些代码之后出现错误,请使用在http//www.nostarch.com/inventwithpython #diff的在线diff工具,对比你输入的代码和本书代码。guess.py 1. # This is a Guess the Number game. 2. import random 3. 4. guessesTaken = 0 5. 6. print('Hello! What is your name?') 7. myName = input() 8. 9. number = random.randint(1, 20) 10. print('Well, ' + myName + ', I am thinking of a number between 1 and 20.') 11. 12. for i in range(6): 13. print('Take a guess.') # Four spaces in front of "print" 14. guess = input() 15. guess = int(guess) 16. 17. if guess < number: 18. print('Your guess is too low.') # Eight spaces in front of "print" 19. 20. if guess > number: 21. print('Your guess is too high.') 22. 23. if guess == number: 24. break 25. 26. if guess == number: 27. guessesTaken = str(guessesTaken) 28. print('Good job, ' + myName + '! You guessed my number in ' + guessesTaken + ' guesses!') 29. 30. if guess != number: 31. number = str(number) 32. print('Nope. The number I was thinking of was ' + number + '.')3.3 导入random模块</p><p>我们来看一下这个程序的前两行代码:1. # This is a Guess the Number game.2. import random</p><p>第1行是一条注释,我们在第2章中介绍过注释。记住,Python会忽略掉#字符后边的所有内容。注释只是提醒我们程序要做什么。</p><p>第2行是一条import语句。记住,语句是执行某些动作的指令,而不像表达式那样会计算为一个值。我们已经见过语句了,例如把一个值存储到一个变量中的赋值语句。</p><p>Python包含许多内建的函数,有些函数存在于叫做模块的单独的程序中。可以使用一条import语句把模块导入到你的程序中,这样就可以使用这些函数了。</p><p>第2行导入了名为random的模块,以便程序可以调用random.randint()函数。这个函数将产生一个随机数字,供用户进行猜测。</p><p>既然已经导入了random模块,我们需要设置一些变量来存储程序稍后将要用到的值。</p><p>第4行创建了一个名为guessesTaken的新的变量:4. guessesTaken = 0</p><p>我们将把玩家猜过的次数保存到这个变量中。因为此时玩家还没有做过任何猜测,所以这里保存的是整数0。6. print('Hello! What is your name?')7. myName = input()</p><p>第6行和第7行与我们在第2章的Hello World程序中见到的代码行一样。程序员经常复用其他程序中的代码,以减少自己的工作量。</p><p>第6行是对print()函数的一次调用。请记住,函数就像是程序中的一个小程序。当程序调用一个函数时,它会运行这个小程序。print()函数中的代码把传递给它的字符串参数显示到屏幕上。</p><p>第7行要求用户输入姓名,并且将输入值存储到myName变量中(记住,这个字符串可能并不是玩家的真实姓名。它可能只是玩家输入的任意字符串。计算机则只会无条件地执行指令)。3.4 用random.randint()函数生成随机数</p><p>既然已经设置好了其他的变量,我们可以使用random模块的函数来设置计算机的神秘数字了:9. number = random.randint(1, 20)</p><p>第9行调用了一个名为randint()的新函数,并且把返回值存储到了变量number中。记住,函数调用可以是表达式的一部分,因为函数调用也会求得一个值。</p><p>randint()函数是由random模块提供的,所以在它前边要加上random.(别漏掉那个点),这用来告诉Python,randint()是random模块中的函数。</p><p>randint()函数会返回一个随机的整数,该整数在接收到的两个整数参数之间(也包括这两个整数)。第9行把1和20传入到函数名称后边的圆括号中,两个数之间用逗号隔开。把randint()返回的随机整数存储到名为number的变量中,这就是玩家试图猜测的神秘数字。</p><p>稍等片刻,回到交互式shell,并且输入import random,以导入random模块。然后输入random.randint(1, 20),以查看这个函数调用的结果。例如,在交互式shell中输入下面的语句。它会返回1到20之间的一个整数。再输一次这行代码,函数调用会返回一个不同的整数。randint()函数每次返回一个随机的整数,就像每次掷色子都会得到一个随机数字一样。当调用randint()函数时,所得到的结果可能是不同的(毕竟它是随机的)。>>> import random>>> random.randint(1, 20)12>>> random.randint(1, 20)18>>> random.randint(1, 20)3>>> random.randint(1, 20)18>>> random.randint(1, 20)7</p><p>也可以通过修改参数,来尝试不同范围的数字。例如,输入random.randint(1, 4),只会得到1到4之间的整数(包含1和4)。或者尝试random.randint(1000, 2000),来获取1000到2000之间的整数。</p><p>在交互式shell中输入如下这行代码,看看会得到什么数字:>>> random.randint(1, 4)3>>> random.randint(1000, 2000)1294</p><p>对游戏代码稍作修改,就可以使得游戏的行为有所不同。在我们的初始代码中,使用了1到20之间的一个整数: 9. number = random.randint(1, 20)10. print('Well, ' + myName + ', I am thinking of a number between 1 and 20.')</p><p>将其修改为如下所示: 9. number = random.randint(1, 100)10. print('Well, ' + myName + ', I am thinking of a number between 1 and 100.')</p><p>现在计算机将会考虑1到100之间的一个整数,而不是1到20之间的一个整数。第9行的改动将会改变随机数字的范围,但是要记住还要修改第10行,以便让游戏告诉玩家新的数字范围而不是旧的范围。</p><p>当你想要为游戏增加随机性时,使用randint()函数。在许多游戏中,都会用到随机性(想想看,有那么多的桌上游戏要使用色子)。3.5 欢迎玩家</p><p>在计算机给number分配了一个随机数之后,它和玩家打招呼:10. print('Well, ' + myName + ', I am thinking of a number between 1 and 20.')</p><p>第10行的print()函数根据姓名来欢迎玩家,并且告诉他们计算机所考虑的数字范围。</p><p>乍一看,好像不止1个字符串参数,但是仔细看看这一行。加号把3个字符串连接成1个字符串。最终,只有1个字符串作为参数传递给了print()函数。如果再看一下,会看到引号中的逗号以及各个部分的字符串。3.6 流程控制语句</p><p>在前面各章中,程序执行都是从程序中最上方的指令开始的,直接向下移动,依次执行每一条指令。但是,使用for、if、else和break语句,我们可以根据条件来执行循环或者跳过指令。这些语句就是流程控制语句(flow control statement),因为它们改变了程序执行过程中的流程。

试读结束[说明:试读内容隐藏了图片]

下载完整电子书


相关推荐

最新文章


© 2020 txtepub下载