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

978-7-115-46641-9
作者: 【美】Al Sweigart(斯维加特)
译者: 李 强
编辑: 陈冀康
分类: Python

图书目录:

详情

本书通过编写一个个小巧、有趣的游戏来教授Python编程,并且采用了直接展示游戏的源代码并通过实例来解释编程的原理的方式。全书共21章,12个游戏程序和示例贯穿其中,介绍了Python基础知识、数据类型、函数、流程控制、程序调试、流程图设计、字符串操作、列表和字典、笛卡尔坐标系、密码学基础、游戏AI模拟、动画图形、碰撞检测、声音和图像等方方面面的程序设计知识。

图书摘要

版权信息

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

ISBN:978-7-115-46641-9

本书由人民邮电出版社发行数字版。版权所有,侵权必究。

您购买的人民邮电出版社电子书仅供您个人使用,未经授权,不得以任何方式复制和传播本书内容。

我们愿意相信读者具有这样的良知和觉悟,与我们共同保护知识产权。

如果购买者有侵权行为,我们可能对该用户实施包括但不限于关闭该帐号等维权措施,并可能追究法律责任。

• 著    [美] Al Sweigart

  译    李 强

  责任编辑 陈冀康

• 人民邮电出版社出版发行  北京市丰台区成寿寺路11号

  邮编 100164  电子邮件 315@ptpress.com.cn

  网址 http://www.ptpress.com.cn

• 读者服务热线:(010)81055410

  反盗版热线:(010)81055315


Simplified Chinese-language edition copyright © 2017 by Posts and Telecom Press.

Copyright © 2017 by Al Sweigart. Title of English-language original: Invent Your Own Computer Games with Pyhton, 4th edition. 978-1-59327-795-6,published by No Starch Press.

All rights reserved.

本书中文简体字版由美国No Starch出版社授权人民邮电出版社出版。未经出版者书面许可,对本书任何部分不得以任何方式复制或抄袭。

版权所有,侵权必究。


Python是一种高级程序设计语言,因其简洁、易读及可扩展性日渐成为程序设计领域备受推崇的语言。

本书通过编写一个个小巧、有趣的游戏来教授Python编程,并且采用直接展示游戏的源代码并通过实例来解释编程的原理的方式。全书共21章,12个游戏程序和示例贯穿其中,介绍了Python基础知识、数据类型、函数、流程控制、程序调试、流程图设计、字符串操作、列表和字典、笛卡尔坐标系、密码学基础、游戏AI模拟、动画图形、碰撞检测、声音和图像等方方面面的程序设计知识。本书可以帮助读者在轻松有趣的过程中,掌握Python游戏编程的基本技能。

本书适合不同年龄和层次的Python编程初学者阅读。


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

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

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

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

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

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

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

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

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

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

我建议你自行将每个程序的代码输入到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”。

下面,我将介绍如何针对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表示交互式开发环境(Interactive DeveLopment Environment)。对于编写Python程序来说,这个开发环境就像是字处理软件一样。在不同的操作系统上,启动IDLE的方式有所不同。

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

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

在Ubuntu或者Linux操作系统中,打开一个终端窗口,然后输入“idle3”。也可以单击屏幕上端的Applications。然后单击ProgrammingIDLE 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。

当询问编程问题时,注意如下几点。

记住,你将自己的编程问题描述的越好,其他人就越能够给予你帮助。当询问编程问题的时候,请做好以下的事情。

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


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

本章主要内容

按照前言中介绍的步骤打开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要对它们旁边的数字进行何种运算。

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

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

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

图1-2 表达式由值和操作符组成

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

尝试在交互式shell中输入一些这样的数学问题,每输入完一道题后按一下回车键。

>>> 2+2+2+2+2
10
>>> 8*6
48
>>> 10-5+6
11
>>> 2 + 2
4

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

当计算机求解表达式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 - 9
12.0

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

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

>>> 5 +
SyntaxError: invalid syntax

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

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

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

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

一条赋值语句(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
>>> spam
15

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

>>> spam = 15
>>> spam + 5
20

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

在赋值语句创建变量之前,不能使用该变量。否则,Python将会给出一个NameError错误,因为尚不存在该名称的变量。输错了变量名称也会得到这样一个错误:

>>> spam = 15
>>> spma
Traceback (most recent call last):
  File "<pyshell#8>", line 1, in <module>
    spma
NameError: name 'spma' is not defined

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

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

>>> spam = 15
>>> spam + 5
20
>>> spam = 3
>>> spam + 5
8

当第一次输入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 + 5
20

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

>>> spam = 15
>>> spam = spam + 5
>>> spam = spam + 5
>>> spam = spam + 5
>>> spam
30

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

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

>>> 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
>>> spam
25

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

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

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

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


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

本章主要内容

在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'

可以使用操作符把字符串值组合成表达式,就像对整数和浮点数所做的那样。可以使用+操作符组合两个字符串。这就是字符串连接。尝试在交互式shell中输入'Hello' + 'World!'。

>>> 'Hello' + 'World!'
'HelloWorld!'

这个表达式的结果是字符串值'HelloWorld!'。两个单词之间没有空格,因为两个待连接的字符串中都没有空格,这和下面示例不同:

>>> 'Hello ' + 'World!'
'Hello World!'

对于字符串和整数来讲,+操作符的作用并不相同,因为字符串和整数是不同的数据类型。所有的值都有一个数据类型。'Hello'的数据类型是字符串。5的数据类型是整数。数据类型告诉Python,当计算表达式时,操作符应该做什么。对于字符串,+操作符会把它们连接起来;而对于整数和浮点数,+操作符会把它们相加。

到目前为止,我们已经在IDLE的交互式shell中输入过指令,并且一次只输入一条指令。然而,当编写程序时,会输入多条指令,然后让它们一起运行,而这正是我们下面将要做的事情。让我们来编写第一个程序!

除了解释器,IDLE的另外一个部分叫做文件编辑器(file editor)。单击交互式shell窗口顶端的File菜单,然后选择New File。将会出现一个空白窗口供你输入程序代码,如图2-1所示。

图2-1 文件编辑器窗口(左边)和交互式shell窗口(右边)

这两个窗口看上去很相似,但是请记住:交互式shell窗口有>>>提示符,而文件编辑器窗口则没有。

对于程序员来讲,让自己的第一个程序在屏幕上显示“Hello world!”,这是一个传统。现在,你也要创建自己的Hello World程序了。

当输入程序时,不要输入代码左边的数字。这些数字是为了方便本书按照行号来引用代码。文件编辑器窗口的右下角会告诉你当前光标的位置。图2-2展示了当前光标在第1行(沿着编辑器从上到下)第0列(沿着编辑器从左到右)。

图2-2 文件编辑器窗口右下角会告诉你当前光标在何处

在新的文件编辑窗口中输入如下文本。这就是程序的源代码(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)

IDLE程序用不同的颜色来表示不同类型的指令。输入代码之后,窗口看上去如图2-3所示。

图2-3 输入代码后,文件编辑器窗口的样子

查看一下,以确保你的IDLE窗口看上去是一样的。

一旦输入了源代码,就可以点击FileSave As来保存它。或者按下快捷键Ctrl-S来保存源代码。图2-4展示了这将会打开的Save As窗口。在File name文本框中输入hello.py,然后点击Save按钮。

图2-4 保存程序

当输入程序时,应该经常保存。这样的话,即使计算机崩溃或者突然退出IDLE,也不会丢失太多的工作成果。

现在,加载之前所保存的程序,点击FileOpen。从出现的窗口中选择hello.py文件,并且点击Open按钮。将会在文件编辑器窗口打开所保存的hello.py程序。

现在,是时候运行程序了。在文件编辑器窗口中点击FileRun Module或者按下F5键。程序会在交互式shell窗口中运行。

当程序要求输入姓名时,请输入你的姓名,如图2-5所示。

图2-5 运行hello.py之后的交互式shell窗口

当输入姓名并且按下回车键时,程序将会用你的名字来打招呼。恭喜!你已经编写了第一个程序,并且现在已经成为一名程序员了。1秒钟后再次按下F5键运行该程序,输入另一个名字。

如果有错误,使用https://www.nostarch.com/inventwithpython#diff的在线diff工具,把你的代码与书中的代码进行比较。复制文件编辑器中的代码并且粘贴到这个Web页面中,然后点击Compare按钮。这个工具会高亮显示你的代码与本书代码之间的所有区别,如图2-6所示。

图2-6 https://www.nostarch.com/inventwithpython#diff上的在线diff工具

如果在编写代码时得到一个NameError错误,如下所示,这表示你使用的是Python 2,而不是Python 3。

Hello world!
What is your name?
Albert
Traceback (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

要修正这个问题,请安装Python 3.4并运行该程序(参见本书前言中的介绍)。

每行代码就是一条可供Python解释的指令。这些指令构成了程序。计算机程序的指令就像是菜谱的操作步骤。从程序的顶部,沿着指令的列表向下,顺序地执行每条指令。

在程序中,把Python当前所处的指令叫做执行。当程序开始运行时,执行的是第一条指令。执行完这条指令之后,执行移到下一条指令。

我们来看一下每行代码是如何工作的。我们从第1行开始。

这条指令是一条注释。

1. # This program says hello and asks for my name.

跟在#(叫做井号)后边的任何文本都是一条注释。注释是程序员针对代码做些什么而给出的注解。注释不是供Python读取的,而是供程序员阅读的。Python会忽略掉注释。程序员通常在代码的开始处放置一条注释,以便给程序起一个名字。Hello World程序的注释告诉你,这个程序会打招呼并询问你的名字。

函数就像是程序中的一个小程序,包含了可供Python执行的数条指令。函数的好处在于,你只需要知道函数是做什么的,而无需知道它是如何做的。Python提供了一些已经内建的函数。在Hello World程序中,我们使用了print()和input()这两个函数。

函数调用是一条指令,它告诉Python运行函数中的代码。例如,你的程序调用了print()函数,在屏幕上显示一个字符串。print()函数接受括号中的字符串作为输入,并且把该文本显示到屏幕上。

print()函数

Hello World程序的第2行和第3行是对print()函数的调用。

2. print('Hello world!')
3. print('What is your name?')

在函数调用中,括号之间的值是参数。第2行的print()函数调用的参数是'Hello world!'。第3行的print()函数调用的参数是'What is your name?'。这叫做给print()函数传递参数。

input()函数

第4行是带有变量(myName)和函数调用(input())的一条赋值语句。

4. myName = input()

当调用input()时,程序等待用户输入文本。用户输入的文本字符串成为函数调用所得到的结果值。在表达式中,在可以使用一个值的任何位置,也都可以使用函数调用。

函数调用的结果值叫做返回值(实际上,“函数调用返回的值”和“函数调用的结果值”的含义是相同的)。在这个示例中,input()函数的返回值是用户输入他们自己的名称的字符串。如果用户输入“Albert”,input()函数调用的结果就是字符串'Albert'。计算过程如下所示:

这样就把字符串值'Albert'存储到了myName变量中。

在函数调用中使用表达式

Hello World程序的最后一行代码是另一个print()函数调用。

5. print('It is good to meet you, ' + myName)

在print()括号中,是表达式'It is good to meet you, ' + myName。然而,参数总是单个的值。Python会先计算这个表达式,然后将其值作为参数传递给函数。如果MyName中存储的是'Albert',计算过程如下所示:

程序就是这样根据名称来向用户打招呼的。

一旦程序执行了最后一行代码,它会终止或者退出。这意味着程序将停止运行。Python会忘掉在变量中保存的所有的值,也包括存储在myName中的字符串。如果再次运行程序,并且输入一个不同的名字,程序会认为这才是你的名字。

Hello world!
What is your name?
Carolyn
It is good to meet you, Carolyn

请记住,计算机只能做程序要求它做的事情。计算机不会说话,只能严格遵循你给它的指令。计算机不会在乎你输入的是自己的名字、别人的名字还是一些其他的内容。你可以输入任何想要输入的内容。计算机都会以相同的方式来处理它:

Hello world!
What is your name?
poop
It is good to meet you, poop

给变量一个具有描述性的名称,会更容易理解它在程序中的用途。你也可以把这个变量命名为abrahamLincoln或nAmE,而不是命名为myName。Python不关心这些,它只是以相同的方式运行程序。

但是,对于该变量保存了什么样的信息,abrahamLincoln或nAmE这样的名称并不能够让你了解很多。正如第1章所介绍的,如果你要搬到一个新家之中,并且你将所有的搬家用的箱子都贴上一个叫做“东西(stuff)”的标签,这根本没有任何帮助。本书中的交互式shell示例,使用诸如spam、eggs和bacon这样的变量名,因为在这些示例中,变量名是无关紧要的。然而,本书的程序都使用了具有描述性的名称,你在自己的程序中也应该这么做。

变量名称区分大小写。区分大小写意味着会把字母相同但大小写不同的变量名当做是不同的变量。所以在Python中,spam、SPAM、Spam和sPAM是4个不同的变量。它们每一个都包含自己的、不同的值。在程序中使用字母相同而大小写不同的变量,这不是一个好主意。应该为变量使用具有描述性的名称。

变量名通常是小写的。如果变量名中有多个单词,第一个单词之后的每一个单词的首字母都要大写。这会使得代码更容易阅读。例如,变量名whatIHadForBreakfastThisMorning要比whatihadforbreakfastthismorning更容易阅读。像这样将变量名首字母大写的方式,叫做骆驼命名法,它使得代码更具有可读性。程序员还喜欢使用较短的变量名,以使得代码更容易理解: breakfast或者foodThisMorning,要比whatIHadForBreakfastThisMorning更容易阅读。这些都是惯例:你也可以不这么做,但是在Python编程中,这些是标准的做法。

一旦学习了字符串和函数,就可以开始编写与用户交互的程序了。这很重要,因为文本是用户和计算机彼此通信的主要方式。使用input()函数,用户通过键盘输入文本。使用print()函数,计算机把文本显示到屏幕上。

字符串只是一种新的数据类型的值。任何值都有一种数据类型,并且一个值的数据类型会影响到+操作符的功能。

函数可以用做程序的一部分,以执行一些复杂的指令。Python有许多内建函数,我们会在本书中介绍它们。在表达式中,在可以使用值的任何位置,也都可以使用函数调用。

在程序中,把Python当前所处的指令叫做执行。在下一章中,我们将介绍使得执行移动的更多的方式,而不只是直接从上向下执行。一旦我们掌握了这些知识,就为创建游戏做好了准备。


相关图书

深度学习的数学——使用Python语言
深度学习的数学——使用Python语言
动手学自然语言处理
动手学自然语言处理
Python高性能编程(第2版)
Python高性能编程(第2版)
图像处理与计算机视觉实践——基于OpenCV和Python
图像处理与计算机视觉实践——基于OpenCV和Python
Web应用安全
Web应用安全
Python数据科学实战
Python数据科学实战

相关文章

相关课程