Class - 7 用户输入和while循环

Posted mack-yang

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Class - 7 用户输入和while循环相关的知识,希望对你有一定的参考价值。

7.1 函数input()的工作原理

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

message = input("Tell me somethhing, and i will repeat it back to you:")
print(message)
输出:
Tell me somethhing, and i will repeat it back to you:Hello!
Hello!

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

注意:Sublime Text不能运行提示用户输入的程序。可以Sublime Text来编写提示用户输入的程序,但必须冲终端运行。

7.1.1 编写清晰的程序

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

name = input("Please enter your name: ")
print("Hello,"+ name +"!")
输出:
Please enter your name: Mack
Hello,Mack!

通过在提示末尾包含一个空格,可将提示与用户输入分开,让用户清楚地知道起输入始于何处。

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

prompt ="If you tell us who you are, we can personalize the message you see."
prompt +="
What is your first name?"

name = input(prompt)
print("
Hello, "+ name + "!")
输出:
If you tell us who you are, we can personalize the message you see.
What is your first name?Mack

Hello, Mack!

 该示例演示一种穿件多行字符串的方式。第一行将消息前半部分存储在prompt中;第二行中,运算符+=在存储在prompt中国的字符串末尾附件一个字符串。最终的提示跨两行,并在问号后面包含一个空格,也是出于清晰考虑。

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

使用函数input()时,python将用户输入解读Wie字符串。列:

>>> age = input("How old are you? ")
How old are you? 21
>>> age
‘21‘

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

>>> age = input("How old are you? ")
How old are you? 21
? >>> age >= 18
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
? TypeError: unorderable types: str() >= int()

当试图将输入用于数值比较时,python会报错,因为他无法将字符串和整数进行比较:不能讲存储在age中的字符串21与18比较。为解决这个问题,可使用函数int(),它让python将输入视为数值。函数int()将数字的字符串表示转换为数值表示。

>>> age = input("How old are you? ")
How old are you? 21
? >>> age = int(age)
>>> age >= 18
True

我们在提示时输入21后,python将这个数字解读为字符串,但随后int()将这个字符串转换成数值表示(?)。这样python就能运行条件测试了:将变量age同18进行比较。

height = input("How tall are you,in inches?")
height = int(height)  #转换成数值表示
if height >= 36:
    print("
You‘re tall enough to ride!")
else:
    print("
You‘ll be able to ride when you‘re a little order.")
输出:
How tall are you,in inches? 26

You‘ll be able to ride when you‘re a little order.

为何可以将height与36比较?因为再叫前,height = int(height)将输入转换成数值表示。如果输入数字小于36,就输出用户满足的身高条件

注意:将数值输入用于计算和比较前,必须将其转换成数值表示。

7.1.3 求模运算符

处理信息时,求模运算符(%)是一个很有用的工具,它将两个数相处并返回余数。求模运算符不会指出一个数是另外一个数的多少倍,只指出余数是多少。

number = input("Enter a umber, ane i‘ll tell you if it‘s even or odd: ")
number = int(number)

if number % 2 == 0:
    print("
The number "+ str(number)+ " is even.")
else:
    print("
The number "+ str(number) + " is odd.")
输出:
Enter a umber, ane i‘ll tell you if it‘s even or odd: 5

The number 5 is odd.

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

7.1.4 在python 2.7中获取输入

如果你使用的是python2.7版本,应使用函数raw_input输入来提示用户输入。这个函数与python3中的input()一样,将数解读为字符串。

7.2 while循环

for 循环用于针对集合中的每个元素的一个代码块,而while循环不断的运行,直到指定的条件满足为止。

7.2.1 使用while循环

current_number = 1
while current_number <=3:
    print(current_number)
    current_number +=1
输出:
1
2
3

在第一行中,将current_number设置为1,从而指定从1开始数。接下来的while循环被设置:只要current_number小于或者等于3,就接着运行循环。循环中的代码输出current_number的值,再使用代码current_number +=1(代码current_number = current_number + 1的简写)将其值加1.

只要满足条件current_number <= 3, python就接着循环。一直相加输出,一旦current_number 大于3,循环停止,程序结束。

7.2.2 让用户选择何时退出

可使用while循环让程序在用户愿意时不断运行。其中定义一个退出值,只要用户输入的不是这个值,程序就继续运行:

prompt = "
Tell me something, anfd i will repeat it back to you:"
prompt += "
Enter ‘quit‘ to end the program. " 
message = ""
while message != ‘quit‘:
    message = input(prompt)
    print(message)
输出:
Tell me something, anfd i will repeat it back to you:
Enter ‘quit‘ to end the program. quit
quit

定义一条提示消息,告诉用户两个选择:要么输入一条消息,要不输入退出值(此处为quit)。接下来,创建一个变量-message用于存储用户输入的值。我们将变量message的初始值设置为空字符串“ ”,让python首次执行while代码行时有可供检查的东西。python首次执行while语句时,需要将message的值与‘quit’进行比较,但此时用户还没有输入。如果没有可供比较的东西,python将无法继续运行程序。为解决这问题,必须给别按了message指定一个初始值。虽然做这个初始值只是一个空字符串,但符合要求,让python执行while循环所需的比较。只要message的值不是quit,这个循环就会不断的运行。

 首次遇到这个循环时,message是一个空字符串,因此python进入这个循环。执行到代码行message = input(prompt)时,python显示提示消息,并等待yoghurt输入。不远用户输入什么,都将存储到变量message中b并输出;接下来,python重新检查while语句中的条件。只要用户输入的单词不是quit,python就会再次显示提示消息并等待用户输入。等到用户终于输入quit后,python停止执行while循环,而整个程序到此结束。

如果在停止时,不需要输出quit。需要加一个简单的if测试:

prompt = "
Tell me something, and i will repeat it back to you:"
prompt += "
Enter ‘quit‘ to end the program. " 
message = ""
while message != ‘quit‘:
    message = input(prompt)
    if message != ‘quit‘:
        print(message)
输出:
Tell me something, and i will repeat it back to you:
Enter ‘quit‘ to end the program. yes
yes

Tell me something, and i will repeat it back to you:
Enter ‘quit‘ to end the program. quit

程序在显示消息前做简单的检查,仅在消息不是退出时才输出它。

7.2.3 使用标志

我们让程序在满足指定条件时就执行特定任务,但在更复杂的程序中,很多不同的时间都会导致程序停止运行;在导致程序结束的事件有很多时,如果在一条while语句中检查所有这些条,将复杂又困难。

在很多条件都满足才继续运行的程序中,可定义一个变量,用于判断整个程序是否处于活动状态。这个变量称为标志,充当了程序的交通信号灯。你可以让程序在标志位true时继续运行,并在任何事件导致标志的值为false时让程序停止运行。这样,在while语句中就只需价差一个条件——标志的当前值是否为True,并将所有测试(是否发生了应将标志设置为False的事件)都凡在其他地方,从而让程序变得更为整洁。

我们在程序中添加一个标志。把这个标志命名为active,它将应予判断程序是否应继续运行:

prompt ="If you tell us who you are, we can personalize the message you see."
prompt +="
What is your first name?"

active = True
while active:
    message = input(prompt)
    if message == ‘quit‘:
        active = False
    else:
        print(message)
输出:
If you tell us who you are, we can personalize the message you see.
What is your first name?   Mack
   Mack
If you tell us who you are, we can personalize the message you see.
What is your first name?quit

 我们将变量active设置成True,让程序最初处于活动状态。这样减缓while语句,因为不需要在其中做任何比较——行管的逻辑有程序的其他部分处理。只要在变量active为True,循环while语句就将继续运行。

在while循环中,我们在用户输入后使用一条if语句来检查变量message的值。如果用户输入的是‘quit’(if语句),我就将变量active设置为False,这将导致while循环不再继续执行。如果用户输入的不是quit,我们将输入作为一条消息输出出来。

上个示例中,我们将条件测试直接放在while语句中,在这个程序中,使用一个标志来指出程序是否处于活动状态,这样如果要添加测试(如elif语句)一检查是否发生了其他导致active变为False的事件会很容易。在复杂的程序中,如很多事件都会导致程序停止运行,标志很有用:在其中的任何一个事件导致活动标志变成False时,住游戏循环将退出,此时可显示一条游戏结束消息,并让用户选择是否要重新玩。

7.2.4 使用break退出循环

 要求立即退出while循环,不再运行循环中余下的代码,也不管条件测试的结果如何,可使用break语句。break语句用于控制程序流程,可使用它来控制哪些代码行将执行,哪些代码不执行,从而让程序按你的要求执行你要的代码。

例:

prompt ="
Please enter the name of a city you have visited:"
prompt +="
(Enter ‘quit‘ when you are finished.)"

while True:
    city = input(prompt)
    
    if city == ‘quit‘:
        break
    else:
        print("I‘d love to go to "+city.title()+"!")
输出:

Please enter the name of a city you have visited:
(Enter ‘quit‘ when you are finished.)Beijin
I‘d love to go to Beijin!

Please enter the name of a city you have visited:
(Enter ‘quit‘ when you are finished.)quit

在这个程序中,我们可以再用户输入‘quit’后使用break语句立即退出while循环:
以while Ture打头的循环将不断运行,直到遇到break语句。这个程序中的循环不断输入用户到过的城市的名字,知道他输入quit为止,用户输入‘quit’后,将执行break语句,导致python退出循环。

注意:在任何python循环中都可使用break语句,例如,可使用break语句来退出遍历列表或字典的for循环。

7.2.5  在循环中使用continue

要返回到循环开头,并根据条件测试结果决定是否继续执行循环,可是有continue语句,不会像break语句那样不再执行余下的代码并退出整个循环。例:

current_number = 0 
while current_number < 10:
    current_number += 1  #代码 current_number = current_number + 1 的简写
    if current_number %2 == 0:
        continue
    
    print(current_number)
输出:
1
3
5
7
9

首先将current_number设置成0,由于它小于10,python进入while循环。进入循环后,我们一补偿1的方式往上数(current_number +=1),因此current_number为1.接下来,if语句检查current_number与2的求模运算结果。如果结果为0(意味着current_number可被2整除),执行continue语句,让python忽略余下代码,并返回到循环的开头。如果当前的数字不能被2整除,就执行循环中余下的代码,python输出数字。

7.2.6 避免无限循环

每个while循环都必须有停止运行的途径,这样才不会没完没了的执行下去。例:

x = 1
while x <= 5:
    print(x)
    x += 1
输出:
1
2
3
4
5

如果不小心遗漏 X += 1,这个循环将无限运行,在这里,x的初始值为1,但根本不会改变,因此条件X<= 5始终未True,导致while循环无线运行。如果程序陷入无限循环,可按Ctrl+C,也可关闭显示程序输出的终端窗口。

 

7.3 使用while 循环来处理列表和字典

如果需要积累大量的用户信息,需要在while循环中使用列表和字典。

for循环是一种遍历列表的有效方式,但在for循环中不应修改列表,否则导致python难以跟踪其中的元素。要在遍历列表的同事对其进行修改,可使用while循环。通过将while循环同列表和字典结合起来使用,可手机、存储并组织大量输入,供以后查看和显示。

7.3.1 在列表之间移动元素

假设有一个列表,其中包含像你注册单还未验证的网站用户;验证这些用户以后,如何将他们移到另一个已验证用户列表中呢?一种办法是使用一个while循环,在验证用户的同时将其从未验证用户列表提取出来,再将其加入到另一个已验证用户列表中。例:

#创建一个待验证用户列表
#和一个用于存储已验证用户的空列表
unconfirmed_users = [‘alien‘, ‘brian‘, ‘candace‘]
confirmed_users = []

#验证每个用户,直到没有未验证用户为止
#将每个经过验证的列表都移到已验证用户列表中
while unconfirmed_users:
    current_user = unconfirmed_users.pop()  #pop() 删除并显示列表末尾的元素
    print("Verify user: "+ current_user.title())
    confirmed_users.append(current_user)
    
#显示所有已验证用户
print("
The following users have been confirmed:") 
for confirmed_user in confirmed_users:
    print(confirmed_user.title())
输出:
Verify user: Candace
Verify user: Brian
Verify user: Alien

The following users have been confirmed:
Candace
Brian
Alien

首先定义创建一个未验证的列用户列表,包含用户,还创建一个空列表,用于存储已验证的用户。在while处的循环将不断的运行,直到列表unconfirm_users变成空的。在这个循环中,函数pop()以每次一个的方式从列表unconfirm_users末尾删除为验证的用户。由于Candace位于unconfirm_users末尾,因此名字首先被删除,存储到变量current_user中并加入列表confirmed_users中。

为模拟用户验证过程,我们输出一条验证消息并将用户加入到已验证用户列表中,未验证用户列表将越来越短,而已验证用户列表越来越长。未验证用户列表为空后结束循环,在输出已验证用户列表。

7.3.2 删除包含特定值的所有列表元素

使用remove()来删除列表中的特定值,这之所以可行,是因为删除的值在列表中只出现了一次。如果要删除列表中包含所有(重复)的特定值元素,可不断运行一个while循环,直到列表不在不包含其特定值。例:

pets = [‘dog‘, ‘cat‘, ‘goldfish‘, ‘cat‘, ‘rabbit‘, ‘cat‘]
print(pets)

while ‘cat‘ in pets:
    pets.remove(‘cat‘)

print (pets)
输出:
[‘dog‘, ‘cat‘, ‘goldfish‘, ‘cat‘, ‘rabbit‘, ‘cat‘]
[‘dog‘, ‘goldfish‘, ‘rabbit‘]

首先创建一个列表,其中包含多个‘cat’值的元素。输出这个列表后,进入while循环,因‘cat‘在列表中不止出现一次。

7.3.3 使用用户输入来填充字典

可使用while循环提示用户输入任意数量信息。创建一个调查程序,其中循环每次执行时都输被调查者的名字和回答。将数据存储在一个字典中,以便将回答与被调查者关联起来。例:

responses = {}

#设置一个标志,指出调查是否继续
polling_active = True

while polling_active:
    #提示输入被调查者的名字和回答
    name = input("
What is your name? ")
    response = input("Which montain would you liek to climb someday? ")
    
    #将答卷存储在字典中
    responses[name] = response
    
    #看看是否还有人要参与调查
    repeat = input("Would you like to let another person respond? (yes/ no) ")
    if repeat == ‘no‘:
        polling_active = False

#调查结束,显示结果
print("
--- Poll results --- ")
for name, response in responses.items():
    print(name + "Would like to climb "+ response + ".")
输出:
What is your name? mack
Which montain would you liek to climb someday? dashan
Would you like to let another person respond? (yes/ no) yes

What is your name? tao
Which montain would you liek to climb someday? none
Would you like to let another person respond? (yes/ no) no

--- Poll results ---
mack Would like to climb dashan.
tao Would like to climb none.

这个程序首先定义了一个空字典(response),并设置一个标志(polling_active),用于指出调查是否继续。只要polling_active 为True,就会运行while循环代码。

在这个循环中,提示用户输入其用户名及喜欢爬哪座山。将这些信息存储在字典response中,然后询问用户调查是否继续。如果用户输入yes,程序再次while循环;如果用户输入no,标志polling_active将被设置为False,而while循环就此结束。最后一个代码块显示调查结果。

 


以上是关于Class - 7 用户输入和while循环的主要内容,如果未能解决你的问题,请参考以下文章

第 7 章 用户输入和while 循环

Python初级-7用户输入和while循环

使用用户输入中断while循环(通过arduino和python 2.7控制neopixels)

python的用户输入和while循环

Python编程入门到实践 - 笔记( 7 章)

代码1(while循环和IF条件语句)