2.6.1 数据的输入

有的程序处理的是静态数据,即在程序运行之前数据已准备好。这时我们可以预先将数据存储在变量之中,并且能够针对数据的特性来选用合适的处理命令。例如,已知 Lucy 在 2012 年是 7 岁,则可编写下面的程序来显示 Lucy 的出生年份信息:

【程序 2.1】eg2_1.py

name = "Lucy" 
age = 7
birthYear = 2012 - age

print name,"was born in",str(birthYear)+"." 程序中,预定的数据分别存储在变量 name 和 age 中,利用算术表达式 2012-age 求得出 生年份,利用 str 函数将年份转换成字符串类型,利用字符串合并运算+为输出信息添上句 点。运行此程序,无需用户参与即可直接得到下面的结果:

Lucy was born in 2005.

而另一些程序要处理的数据则是在执行程序时由用户提供的。用户提供数据的方式有多 种,其中最简单的方式是在程序中使用输入语句,其他方式包括在启动程序时以命令行参数 的方式传递数据或在图形用户界面中利用输入构件来提供数据。在此我们讨论最简单的输入 语句方式。

Python 中提供了 input()函数用于输入数据,该函数通常的使用方式如下:

<变量名> = input(<提示字符串>)

执行时首先在屏幕上显示提示字符串,然后等待用户输入(以回车键表示输入完毕),并将 用户输 入作为一个表达式进行解释、求值,最后将求值结果赋予变量。例如:

>>> x = input("请输入: ")
请输入: 123
>>> x
123
>>> x = input("请输入: ")
请输入: 1+2
>>> x
3

可见,当用户连续按下数字键 1、2、3、回车键之后,input 函数将 123 视为表达式进行求 值,结果即数值 123。而当用户按下数字键 1、加号键+、数字键 2、回车键之后,input 将 1+2 视为表达式进行求值,结果为数值 3。

当然,作为一个函数,input 也可以直接用在表达式中,其作用相当于一个值。例如:

>>> 3 + input("请输入:")
请输入:4
7

input 不仅能接收数值类型的表达式,也能接收其他类型的表达式。例如:

>>> x = input("请输入: ")
请输入: "123"
>>> x
'123'
>>> x = input("请输入: ")
请输入: "1"+"2"
>>> x
'12'
>>> x = input("请输入: ")
请输入: True and False
>>> x
False

可见,当用户连续按下引号键"、数字键 1、2、3、引号键"、回车键之后,input 将"123" 视为表达式进行求值,得到的结果即为字符串"123"。而当用户连续按下引号键"、数字键 1、引号键"、加号键+、引号键"、数字键 2、引号键"、回车键之后,input 将"1"+"2" 视为字符串运算表达式进行求值,得到结果"12"。第三个输入例子是布尔表达式,结果是 显然的。

下面我们将程序 2.1 改写成另一版本:由用户输入姓名和年龄,然后计算出生年份。

【程序 2.】eg2_2.py

name = input("Name: ") 
age = input("Age: ") 
birthYear = 2012 - age
print name,"was born in",str(birthYear)+"."

以下是程序 2.2 的一次执行示例:

>>> import eg2_2 
Name: "Lucy" Age: 7
Lucy was born in 2005.

从上面的例子可以看到,input 函数在输入数值型数据时很方便,但在接收字符串类 型的数据时有点麻烦,因为要为字符串数据加上引号。如果不加引号,input 会将输入的 字符串解释为变量名,以便构成合法的表达式。除非程序中定义过该变量,否则会导致“变 量未定义”的错误。例如:

>>> x = input("请输入:")
请输入:Lucy
Traceback (most recent call last):
File "<pyshell#18>", line 1, in <module> x=input("请输入:")
File "<string>", line 1, in <module> NameError: name 'Lucy' is not defined
>>> Lucy = 7
>>> x = input("请输入:")
请输入:Lucy
>>> x
7

其实,Python 还提供了另一个输入函数 raw_input(),它用于字符串数据输入时更方 便。raw_input 函数通常的使用方式如下:

<变量名> = raw_input(<提示字符串>) 执行时首先在屏幕上显示提示字符串,然后等待用户输入(以回车键表示输入完毕),用户 键入的所有内容视为一个普通的字符串而不是表达式,该字符串就是 raw_input 的返回 值,可以赋值给其他变量。例如:

>>> x = raw_input("请输入:")
请输入:hello world
>>> x
'hello world'

可见,raw_input 将用户键入的所有字符构成一个字符串并作为函数的返回值。因此,用raw_input 输入字符串时不需要加引号,比 input 略为方便些。

同样可以将 raw_input 函数直接用在某个表达式中,其作用相当于一个字符串。例如:

>>> 2 * raw_input("请输入:")
请输入:Hello
'HelloHello'

input 与 raw_input 的比较 根据上面的介绍可知,如果需要输入数值或数值表达式,最好用 input;如果需要输入字符串,最好使用 raw_input。但这不是绝对的,实际应用中经常也用 raw_input 输入数值数据,具体做法是:先作为字符串输入,然后通过类型转换函数(int、long、float)或 eval 函数来将字符串转换成数值。例如:

>>> x = int(raw_input("Please enter a number: "))
Please enter a number: 123
>>> x + 456
579

例中 raw_input 所接收的输入字符串被 int 函数转换成整数类型。这看起来比直接使用 input 来输入数值麻烦,但 raw_input 有个好处是能处理空输入的情况(即用户直接按 回车键),而使用 input 时空输入会导致错误。试比较:

>>> x = input("Press Enter: ")
Press Enter:
Traceback (most recent call last):
File "&lt;pyshell#15&gt;", line 1, in &lt;module&gt; x = input("Press Enter: ")
File "&lt;string&gt;", line 0
^
SyntaxError: unexpected EOF while parsing
>>> x = raw_input("Press Enter: ")
Press Enter:
>>> x
''