Class - 7 用户输入和while循环

7.1 函数input()的工做原理python

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

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)将输入呈现给用户。python2.7

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

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 +="\nWhat is your first name?" name = input(prompt) print("\nHello, "+ 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中国的字符串末尾附件一个字符串。最终的提示跨两行,并在问号后面包含一个空格,也是出于清晰考虑。ui

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

使用函数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("\nYou're tall enough to ride!") else: print("\nYou'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("\nThe number "+ str(number)+ " is even.") else: print("\nThe 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 = "\nTell me something, anfd i will repeat it back to you:"
prompt += "\nEnter '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 = "\nTell me something, and i will repeat it back to you:"
prompt += "\nEnter '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 +="\nWhat 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 ="\nPlease enter the name of a city you have visited:"
prompt +="\n(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("\nThe 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("\nWhat 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("\n--- 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循环就此结束。最后一个代码块显示调查结果。

相关文章
相关标签/搜索