第2章 编写程序

第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 连接字符串

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

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

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

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

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

2.3 在IDLE的文件编辑器中编写程序

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

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

G:\yds\17-0509\tu\0201.tif

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

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

2.3.1 创建Hello World程序

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

G:\yds\17-0509\3j\0202b.tif

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

G:\yds\17-0509\tu\0202.tif

图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所示。

G:\yds\17-0509\tu\0203.tif

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

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

2.3.2 保存程序

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

G:\yds\17-0509\tu\0204.tif

图2-4 保存程序

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

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

2.3.3 运行程序

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

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

G:\yds\17-0509\tu\0205.tif

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

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

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

G:\yds\17-0509\tu\0206.tif

图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并运行该程序(参见本书前言中的介绍)。

2.4 Hello World程序如何工作

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

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

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

2.4.1 注释

这条指令是一条注释。

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

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

2.4.2 函数:程序中的小程序

函数就像是程序中的一个小程序,包含了可供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'。计算过程如下所示:

G:\yds\17-0509\1j\p019a.tif

这样就把字符串值'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',计算过程如下所示:

G:\yds\17-0509\1j\p019B.tif

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

2.4.3 终止程序

一旦程序执行了最后一行代码,它会终止或者退出。这意味着程序将停止运行。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

2.5 命名变量

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

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

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

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

2.6 小结

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

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

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

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

目录

  • 版权
  • 版权声明
  • 内容提要
  • 前言
  • 第1章 交互式Shell
  • 第2章 编写程序
  • 第3章 “猜数字”游戏
  • 第4章 一个讲笑话程序
  • 第5章 Dragon Realm
  • 第6章 使用调试器
  • 第7章 用流程图设计Hangman
  • 第8章 编写Hangman的代码
  • 第9章 Hangman扩展
  • 第10章 Tic Tac Toe
  • 第11章 推理游戏Bagels
  • 第12章 笛卡尔坐标
  • 第13章 Sonar Treasure Hunt游戏
  • 第14章 凯撒密码
  • 第15章 Reversegam游戏
  • 第16章 Reversegam AI模拟
  • 第17章 创建图形
  • 第18章 动画图形
  • 第19章 碰撞检测
  • 第20章 声音和图像
  • 第21章 带有声音和图像的Dodger

相关技术

推荐用户