7.1 函数input() 的工作原理

函数input() 让程序暂停运行,等待用户输入一些文本。获取用户输入后,Python将其存储在一个变量中,以方便你使用。

例如,下面的程序让用户输入一些文本,再将这些文本呈现给用户:

parrot.py

  1. message = input("Tell me something, and I will repeat it back to you: ")
  2. print(message)
  3.  
  4.  
  5.  
  6.  
  7.  
  8.  
  9.  

函数input() 接受一个参数:即要向用户显示的提示 或说明,让用户知道该如何做。在这个示例中,Python运行第1行代码时,用户将看到提示Tell me something, and I will repeat it back to you: 。程序等待用户输入,并在用户按回车键后继续运行。输入存储在变量message 中,接下来的print(message) 将输入呈现给用户:

  1. Tell me something, and I will repeat it back to you: Hello everyone!
  2. Hello everyone!
  3.  
  4.  
  5.  
  6.  
  7.  
  8.  
  9.  

注意  Sublime Text不能运行提示用户输入的程序。你可以使用Sublime Text来编写提示用户输入的程序,但必须从终端运行它们。详情请参阅1.4节。

7.1.1 编写清晰的程序

每当你使用函数input() 时,都应指定清晰而易于明白的提示,准确地指出你希望用户提供什么样的信息——指出用户该输入任何信息的提示都行,如下所示:

greeter.py

  1. name = input("Please enter your name: ")
  2. print("Hello, " + name + "!")
  3.  
  4.  
  5.  
  6.  
  7.  
  8.  
  9.  

通过在提示末尾(这里是冒号后面)包含一个空格,可将提示与用户输入分开,让用户清楚地知道其输入始于何处,如下所示:

  1. Please enter your name: Eric
  2. Hello, Eric!
  3.  
  4.  
  5.  
  6.  
  7.  
  8.  
  9.  

有时候,提示可能超过一行,例如,你可能需要指出获取特定输入的原因。在这种情况下,可将提示存储在一个变量中,再将该变量传递给函数input() 。这样,即便提示超过一行,input() 语句也非常清晰。

greeter.py

  1. prompt = "If you tell us who you are, we can personalize the messages you see."
  2. prompt += "\nWhat is your first name? "
  3. name = input(prompt)
  4. print("\nHello, " + name + "!")
  5.  
  6.  
  7.  
  8.  
  9.  
  10.  
  11.  

这个示例演示了一种创建多行字符串的方式。第1行将消息的前半部分存储在变量prompt 中;在第2行中,运算符+= 在存储在prompt 中的字符串末尾附加一个字符串。

最终的提示横跨两行,并在问号后面包含一个空格,这也是出于清晰考虑:

  1. If you tell us who you are, we can personalize the messages you see.
  2. What is your first name? Eric
  3. Hello, Eric!
  4.  
  5.  
  6.  
  7.  
  8.  
  9.  
  10.  

7.1.2 使用int() 来获取数值输入

使用函数input() 时,Python将用户输入解读为字符串。请看下面让用户输入其年龄的解释器会话:

  1. >>> age = input("How old are you? ")
  2. How old are you? 21
  3. >>> age
  4. '21'
  5.  
  6.  
  7.  
  8.  
  9.  
  10.  
  11.  

用户输入的是数字21,但我们请求Python提供变量age 的值时,它返回的是'21' ——用户输入的数值的字符串表示。我们怎么知道Python将输入解读成了字符串呢?因为这个数字用引号括起了。如果我们只想打印输入,这一点问题都没有;但如果你试图将输入作为数字使用,就会引发错误:

  1. >>> age = input("How old are you? ")
  2. How old are you? 21
  3. >>> age >= 18
  4. Traceback (most recent call last):
  5. File "<stdin>", line 1, in <module>
  6. TypeError: unorderable types: str() >= int()
  7.  
  8.  
  9.  
  10.  
  11.  
  12.  
  13.  

你试图将输入用于数值比较时(见❶),Python会引发错误,因为它无法将字符串和整数进行比较:不能将存储在age 中的字符串'21' 与数值18 进行比较(见❷)。

为解决这个问题,可使用函数int() ,它让Python将输入视为数值。函数int() 将数字的字符串表示转换为数值表示,如下所示:

  1. >>> age = input("How old are you? ")
  2. How old are you? 21
  3. >>> age = int(age)
  4. >>> age >= 18
  5. True
  6.  
  7.  
  8.  
  9.  
  10.  
  11.  
  12.  

在这个示例中,我们在提示时输入21 后,Python将这个数字解读为字符串,但随后int() 将这个字符串转换成了数值表示(见❶)。这样Python就能运行条件测试了:将变量age (它现在包含数值21)同18 进行比较,看它是否大于或等于18。测试结果为True

如何在实际程序中使用函数int() 呢?请看下面的程序,它判断一个人是否满足坐过山车的身高要求:

rollercoaster.py

  1. height = input("How tall are you, in inches? ")
  2. height = int(height)
  3. if height >= 36:
  4. print("\nYou're tall enough to ride!")
  5. else:
  6. print("\nYou'll be able to ride when you're a little older.")
  7.  
  8.  
  9.  
  10.  
  11.  
  12.  
  13.  

在这个程序中,为何可以将height36 进行比较呢?因为在比较前,height = int(height) 将输入转换成了数值表示。如果输入的数字大于或等于36,我们就告诉用户他满足身高条件:

  1. How tall are you, in inches? 71
  2. You're tall enough to ride!
  3.  
  4.  
  5.  
  6.  
  7.  
  8.  
  9.  

将数值输入用于计算和比较前,务必将其转换为数值表示。

7.1.3 求模运算符

处理数值信息时,求模运算符 (%)是一个很有用的工具,它将两个数相除并返回余数:

  1. >>> 4 % 3
  2. 1
  3. >>> 5 % 3
  4. 2
  5. >>> 6 % 3
  6. 0
  7. >>> 7 % 3
  8. 1
  9.  
  10.  
  11.  
  12.  
  13.  
  14.  
  15.  

求模运算符不会指出一个数是另一个数的多少倍,而只指出余数是多少。

如果一个数可被另一个数整除,余数就为0,因此求模运算符将返回0。你可利用这一点来判断一个数是奇数还是偶数:

even_or_odd.py

  1. number = input("Enter a number, and I'll tell you if it's even or odd: ")
  2. number = int(number)
  3. if number % 2 == 0:
  4. print("\nThe number " + str(number) + " is even.")
  5. else:
  6. print("\nThe number " + str(number) + " is odd.")
  7.  
  8.  
  9.  
  10.  
  11.  
  12.  
  13.  

偶数都能被2整除,因此对一个数(number )和2执行求模运算的结果为零,即number % 2 == 0 ,那么这个数就是偶数;否则就是奇数。

  1. Enter a number, and I'll tell you if it's even or odd: 42
  2. The number 42 is even.
  3.  
  4.  
  5.  
  6.  
  7.  
  8.  
  9.  

7.1.4 在Python 2.7中获取输入

如果你使用的是Python 2.7,应使用函数raw_input() 来提示用户输入。这个函数与Python 3中的input() 一样,也将输入解读为字符串。

Python 2.7也包含函数input() ,但它将用户输入解读为Python代码,并尝试运行它们。因此,最好的结果是出现错误,指出Python不明白输入的代码;而最糟的结果是,将运行你原本无意运行的代码。如果你使用的是Python 2.7,请使用raw_input() 而不是input() 来获取输入。

动手试一试

7-1 汽车租赁 :编写一个程序,询问用户要租赁什么样的汽车,并打印一条消息,如“Let me see if I can find you a Subaru”。

7-2 餐馆订位 :编写一个程序,询问用户有多少人用餐。如果超过8人,就打印一条消息,指出没有空桌;否则指出有空桌。

7-3 10的整数倍 :让用户输入一个数字,并指出这个数字是否是10的整数倍。