第七章 用户输入和while循环

第七章 用户输入和while循环

  大多数的程序旨在解决最终用户的问题,因此通常需要从用户哪里获取一些信息。此外还将学到使用while循环让程序不断地运行,直到指定的条件不再满足为止,才终止循环。

7.1 input()函数的工作原理

  input()函数让程序短暂停止运行,等待用户输入一些信息。获取用户输入后,Python将其赋给一个变量,以便使用。

  实例:

message = input('真糟心,今天晚上我的WiFi坏了,让我修了一个小时之后即浪费了一个小时的时间依然没有修好,请问你能告诉我要怎么修吗:')
print(message);

  输出结果:

真糟心,今天晚上我的WiFi坏了,让我修了一个小时之后即浪费了一个小时的时间依然没有修好,请问你能告诉我要怎么修吗:看一下光猫和你的路由器连接情况!!

看一下光猫和你的路由器连接情况!!

  input()函数接受一个参数,即向用户显示的提示,让用户知道该输入什么样的信息。在这个实例中,当Python运行第一行代码时,用户将看到提示“真糟心,今天晚上我的WiFi坏了,让我修了一个小时之后即浪费了一个小时的时间依然没有修好,请问你能告诉我要怎么修吗:”,然后程序会在控制台等待用户输入,并在用户按回车键后继续运行。用户的输入被赋给变量message,然后接下来的print(message)将输入呈现给用户,即“看一下光猫和你的路由器连接情况!!”。

7.1.1 编写清晰的提示

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

name = input('Please enter you name:')
print(f"Hello,{name}!")

在这里插入图片描述

  通过在提示末尾(冒号后面就是用户自定义输入的信息),用冒号来分割开,可使用户清晰的知道,在哪里输入自定义的信息。

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

message = "您好,请问你今天叫了哪几个来参加晚餐"
message += "\nHello,今天晚上来参加晚会的是:"
name = input(message)
print(f"Hello,{name}!");

在这里插入图片描述

  在第二行中,运算符【+=】在赋给变量message的字符串末尾追加一个字符串。

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

  在使用input()函数时,Python会将用户输入解读为字符串。

age = input("Please enter your age:")
'''此时控制台输出的age,结果为字符串'''
'''print(f"Hello,{age}!")'''                            第一次
'''Hello,25!   —— 这里的25代表的是字符串'''
'''此时,我们使用int()函数来进行强制转换'''
age = int(age)
print(f"Hello,{age}!")                                  第二次

#输出结果为  数字25

  上面的程序中,我们怎么知道,第一次输入的是字符串呢,我们只需要将第一次得到的age和真正的数字进行四则运算或者比较大小写就会知道第一次输入的是字符串。

age = input("Please enter your age:")
'''此时控制台输出的age,结果为字符串'''
print(f"Hello,{age}!")
'''Hello,25!   —— 这里的25代表的是字符串'''
print(f"Hello,{age}!")
print(age + 21)

  如下图所示,【age + 21】最后发生报错,报错内容:【TypeError: can only concatenate str (not “int”) to str】,类型使用错误,一个为数值型,另一个为字符串型。

在这里插入图片描述

7.1.3 求模运算符

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

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

number = input("请输入一个数,并且判断这个数是奇数还是偶数:")
number = int(number)
if number % 2 == 0:
    print(f"这个数{number}是一个偶数。")
else:
    print(f"这个数{number}是一个奇数。")

在这里插入图片描述

7.2 while循环

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

7.2.1 使用while循环

  我们可以使用while循环来进行数数。

current_number = input("请输入一个数字: ")
current_number = int(current_number)
while current_number != 100:
    print(current_number)
    current_number += 10
print("结束循环,拜拜")

  得到结果:

请输入一个数字: >? 20
20
30
40
50
60
70
80
90

  在第一行,使用input()函数,请求用户输入一个数,然后Python将这个数使用int()函数强制转换为整数,然后使用while循环来设定条件,即用户输入的数如果不等于100,则往下执行,如果等于100,则跳出循环,执行print()函数。

7.2.2 让用户选择何时退出

  可以使用while循环让程序在用户愿意时不断地运行,如下面的程序,我们在其中定义一个退出值,只要用户输入的不是这个值,程序就一直运行。

'''定义一个变量'''
prompt = "\n请你告诉我,你是否想要玩这些游戏!!"
prompt += "\n请输入 不想玩,然后去下一个地方!!!"
game = ""
while game != "不想玩":
    game = input(prompt)
    print(f"我想玩的游戏是{game}。")
print("欢迎下次光临!!!")

  输出结果:

请你告诉我,你是否想要玩这些游戏!!
请输入想玩的游戏,如果不想玩,则输入“不想玩”,然后去下一个地方!!!>? 星球大战
我想玩的游戏是星球大战。

请你告诉我,你是否想要玩这些游戏!!
请输入想玩的游戏,如果不想玩,则输入“不想玩”,然后去下一个地方!!!>? 王者荣耀
我想玩的游戏是王者荣耀。

请你告诉我,你是否想要玩这些游戏!!
请输入想玩的游戏,如果不想玩,则输入“不想玩”,然后去下一个地方!!!>? 不想玩

我想玩的游戏是不想玩。
欢迎下次光临!!!

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

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

  这个程序,存在着一些不足,也就是,当用户输入“不想玩”while中的“我想玩的游戏是不想玩”还是被输出,这个输出不是我们想要的结果,顾为了优化这种形式,就需要加个判断,也就是加一个if条件:

prompt = "\n请你告诉我,你是否想要玩这些游戏!!"
prompt += "\n请输入想玩的游戏,如果不想玩,则输入“不想玩”,然后去下一个地方!!!"
game = ""
while game != "不想玩":
    game = input(prompt)
    if game != "不想玩":
        print("感谢您尝试我们的游戏,祝你玩的愉快!!")
        print(f"我想玩的游戏是{game}。")
    """print(f"我想玩的游戏是{game}。")"""
print("欢迎下次光临!!!")

  运行结果:

请你告诉我,你是否想要玩这些游戏!!
请输入想玩的游戏,如果不想玩,则输入“不想玩”,然后去下一个地方!!!>? 王者荣耀
感谢您尝试我们的游戏,祝你玩的愉快!!
我想玩的游戏是王者荣耀。

请你告诉我,你是否想要玩这些游戏!!
请输入想玩的游戏,如果不想玩,则输入“不想玩”,然后去下一个地方!!!>? 小王
感谢您尝试我们的游戏,祝你玩的愉快!!
我想玩的游戏是小王。

请你告诉我,你是否想要玩这些游戏!!
请输入想玩的游戏,如果不想玩,则输入“不想玩”,然后去下一个地方!!!>? 和平精英
感谢您尝试我们的游戏,祝你玩的愉快!!
我想玩的游戏是和平精英。

请你告诉我,你是否想要玩这些游戏!!
请输入想玩的游戏,如果不想玩,则输入“不想玩”,然后去下一个地方!!!>? 不想玩
欢迎下次光临!!! #运行结果  输入“不想玩”时  输出
7.2.3 使用标志

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

prompt = "\n请你告诉我,你是否想要玩这些游戏!!"
prompt += "\n请输入想玩的游戏,如果不想玩,则输入“不想玩”,然后去下一个地方!!!"
game = ""
active = True
while active:
    game = input(prompt)
    if game == '不想玩':
        active = False
    else:
        print("感谢您尝试我们的游戏,祝你玩的愉快!!")
        print(f"我想玩的游戏是{game}。")
print("欢迎下次光临!!!")

  运行结果:

请你告诉我,你是否想要玩这些游戏!!
请输入想玩的游戏,如果不想玩,则输入“不想玩”,然后去下一个地方!!!>? 王者荣耀
感谢您尝试我们的游戏,祝你玩的愉快!!
我想玩的游戏是王者荣耀。

请你告诉我,你是否想要玩这些游戏!!
请输入想玩的游戏,如果不想玩,则输入“不想玩”,然后去下一个地方!!!>? 不想玩
欢迎下次光临!!!

  将变量active设置为True,让程序最初处于活动状态。这样就简化了while语句,因为不需要在其中做任何比较,相关的逻辑由程序的其他部分处理。只要变量active为True,循环就将一直执行。

  在while循环中,在用户输入后,使用一条if语句来检查game的值,如果用户输入的是“不想玩”,就将active设置为False,这将导致while循环不在执行,即结束;如果用户输入的不是“不想玩”,则将else后面的语句打印出来,继续循环。

7.2.4 使用break退出循环

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

prompt = "\n请你告诉我,你是否想要玩这些游戏!!"
prompt += "\n请输入想玩的游戏,如果不想玩,则输入“不想玩”,然后去下一个地方!!!"
game = ""
while True:
    game = input(prompt)
    if game == '不想玩':
        break
    else:
        print("感谢您尝试我们的游戏,祝你玩的愉快!!")
        print(f"我想玩的游戏是{game}。")
print("欢迎下次光临!!!")

  运行结果:

请你告诉我,你是否想要玩这些游戏!!
请输入想玩的游戏,如果不想玩,则输入“不想玩”,然后去下一个地方!!!>? 王者荣耀
感谢您尝试我们的游戏,祝你玩的愉快!!
我想玩的游戏是王者荣耀。

请你告诉我,你是否想要玩这些游戏!!
请输入想玩的游戏,如果不想玩,则输入“不想玩”,然后去下一个地方!!!>? 不想玩
欢迎下次光临!!!

  以while True 打头的循环将不断运行,直到遇到break语句。这个程序中的循环不断地让用户输入他到过的城市的名字,直到用户输入“不想玩”为止。在用户输入“不想玩”,将执行break语句,直接令Python退出循环。

  注意:在Python的所有循环中,都可以使用break语句,可使用break语句来退出遍历列表或字典的for循环。

7.2.5 在循环中使用continue

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

# 使用while循环来打印0到30以内的奇数
numberss = 0
while numberss < 30:
    numberss += 1
    if numberss % 2 == 0:
        continue
    print(numberss)

  首先将变量numberss 的值初始化为0,由于它小于30,将进入while循环中,以步长为1的方式升序,当numberss 为1时,与2进行模运算,如果结果为0,则返回循环开头,步长继续加1,…,直到numberss大于30,跳出循环。

7.2.6 避免无限循环

  每个while循环都必须有结束运行的途径,这样才不会无休止的运行下去。

在这里插入图片描述

  程序:

x = 0
while x < 5:
    print(x)

  在上面的这个程序中,将无休止的一直循环下去,因为漏了一个 x += 1;

  要避免写出无限循环,就需要我们对每个循环条件进行测试,确保他们按预期的结果运行。

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

  到目前为止,我们每次都只处理了一项用户信息:获取用户的输入,再将输入打印出来或做出响应;循环再次运行运行时,获取另一个输入值并做出响应。然而,要记录大量的用户和信息,需要在while循环中使用列表和字典。

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

7.3.1 在列表之间移动元素

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

#首先,创建一个待验证用户列表和一个用于存储已验证用户的列表
unconfirmed_user = ['Alice','Smeth','小王']
confirmed_user = []
#验证每个用户,直到没有未验证的用户为止
#将每一个经过验证的用户都移到已验证用户列表中
while unconfirmed_user:
    current_user = unconfirmed_user.pop()
    print(f"验证的用户:{current_user}")
    confirmed_user.append(current_user)
#显示所有的已验证用户
print("已验证的用户如下:")
for i in confirmed_user:
    print(i.title())

  运行结果:

验证的用户:小王
验证的用户:Smeth
验证的用户:Alice

已验证的用户如下:
小王
Smeth
Alice
7.3.2 删除为特定值的所有列表元素

  在上面的所学知识中,我们使用remove()方法来删除列表中的特定值,而remove()方法,是将指定的值进行删除。如果我们要删除列表中所有为特定值的元素,又该怎么做呢?

  我们举例一个宠物列表,其中包含重复的元素,如果要删除这些重复的元素,该怎么做呢?其实,我们只要使用while循环,直到列表中不含重复的元素就行。

#定义一个列表
pets = ['dog','cat','mouse','rabbit','cat','dog','mouse','goldfish','cat']
print(pets)
while 'dog' in pets:
    pets.remove('dog')
print(pets)


print('=====================')

#拓展知识
pets = ['dog','cat','mouse','rabbit','cat','dog','mouse','goldfish','cat']
#使用set()方法得到一个字典即集合
lists = set(pets)
print(lists)
print('=====================')
#再使用list()方法得到一个列表
lists = list(lists)
print(lists)

  运行结果:

#使用while循环,将指定重复的元素删除,永久性删除
['dog', 'cat', 'mouse', 'rabbit', 'cat', 'dog', 'mouse', 'goldfish', 'cat']
#运行结果
['cat', 'mouse', 'rabbit', 'cat', 'mouse', 'goldfish', 'cat']

=====================

#使用set()方法得到一个字典即集合
{'rabbit', 'cat', 'dog', 'mouse', 'goldfish'}

=====================

#再使用list()方法得到一个列表
['rabbit', 'cat', 'dog', 'mouse', 'goldfish']

  首先创建一个列表,其中包含指定重复的元素。而remove()是永久性删除

7.3.3 使用用户输入填充字典

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

#定义一个空的字典
responses = {}
#设置一个标志位,指出调查者是否继续
poll_active = True

while poll_active:
    #提示用户输入被调查者的名字和回答
    name = input("你叫什么名字??")
    response = input("请告诉我几点?")
    #将回答存储到上面定义的空字典中
    responses[name] = response
    #询问其他人是否参与或者看见这个事件发生的经过
    repeat = input("请告诉我,除了上面回答的,其他人是否需要补充(输入是或者否)。")
    #条件判断
    if repeat == '否':
        poll_active = False
#得到调查结果
for name,response in responses.items():
    print(f"{name}回答的是{response}点。")

  输出结果:

你叫什么名字??>? 老王
请告诉我几点?>? 4

请告诉我,除了上面回答的,其他人是否需要补充(输入是或者否)。>? 是

你叫什么名字??>? 老李
请告诉我几点?>? 8
请告诉我,除了上面回答的,其他人是否需要补充(输入是或者否)。>? 否

老王回答的是4点。
老李回答的是8点。

  解释程序:

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

  在这个循环中,提示用户输入其用户名及要回答的时间。将这些信息存储在字典responses中,然后询问用户调查是否继续。如果用户输入是,程序将再次进入while循环;如果用户输入否,标志poll_active将被设置为False,而while循环将就此结束。最后一个代码块for循环显示调查结果。

7.3.4 小结

  在本章中,你学习了:如何在程序中使用input()来让用户提供信息;如何处理文本和数字输入,以及如何使用while循环让程序按用户的要求不断地运行;多种控制while循环流程的方式:设置活动标志、使用break语句以及使用continue语句;如何使用while循环在列表之间移动元素,以及如何从列表中删除所有包含特定值的元素;如何结合使用while循环和字典。

  以上的内容,是本人自学Python,写的笔记,如有错误,请留言哦!!!本人会在第一时间及时更正。如果你觉得有用,请关注我,一起学习Python,一起高薪!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

殇淋狱陌

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值