python 学习之用户输入和 while 循环
敬一杯给我们的现在

1引言
将学习如何让程序不断地运行,以便用户根据需要输入信息,并在程序中使用这些信息。为此,你将使用 while 循环让程序不断运行,直到指定的条件不满足为止。
2函数 input() 的工作原理
函数 input() 让程序暂停运行,等待用户输入一些文本。获取用户输入后,Python 将其赋给一个变量,以方便你使用。
例如,下面的程序让用户输入一些文本,再将这些文本呈现给用户:
message = input("Tell me something, and I will repeat it back to you: ")
print(message)
Tell me something, and I will repeat it back to you: Hello everyone!
Hello everyone!
函数 input() 接受一个参数——要向用户显示的提示 (prompt)或说明,让用户知道该如何做。程序等待用户输入,并在用户按回车键后继续运行。输入被赋给变量 message ,接下来的 print(message) 将输入呈现给用户。
编写清晰的程序
每当使用函数 input() 时,都应指定清晰易懂的提示,准确地指出希望用户提供什么样的信息——指出用户应该输入何种信息的任何提示都行,如下所示:
name = input("Please enter your name: ")
print(f"nHello, {name}!")
Please enter your name: laojunjun
Hello, laojunjun!
通过在 提示末尾(这里是冒号后面)包含一个空格,可将提示与用户输入分开,让用户清楚地知道其输入始于何处。
有时候,提示可能超过一行。例如,你可能需要指出获取特定输入的原因。在这种情况下,可将提示赋给一个变量,再将该变量传递给函数 input() 。这样,即便提示超过一行,input() 语句也会非常清晰:
prompt = "If you tell us who you are, we can personalize the messages you see."
prompt += "nWhat is your first name? "
name = input(prompt)
print(f"nHello, {name}!")
If you tell us who you are, we can personalize the messages you see.
What is your first name? laojunjun
Hello, laojunjun!
第一行将消息的前半部分赋给变量 prompt 中。在第二行中,运算符+= 在前面赋给变量 prompt 的字符串末尾附加一个字符串。
使用 int() 来获取数值输入
使用函数 input() 时,Python 将用户输入解读为 字符串 :
age = input("How old are you? ")
How old are you? 21
age
'21'
为解决这个问题,可使用函数 int() ,它让 Python 将输入视为数值。函数 int() 将数的字符串表示转换为数值表示,如下所示:
age = input("How old are you? ")
How old are you? 21
age = int(age)
age >= 18
True
求模运算符
处理数值信息时,求模运算符 (%)是个很有用的工具,它将两个数相除并返回余数:
4 % 3
1
6 % 3
0
求模运算符不会指出一个数是另一个数的多少倍,只指出余数是多少。
如果一个数可被另一个数整除,余数就为 0,因此求模运算将返回 0。可利用这一点来判断一个数是奇数还是偶数:
number = input("Enter a number, and I'll tell you if it's even or odd: ")
number = int(number)
if number % 2 == 0:
print(f"nThe number {number} is even.")
else:
print(f"nThe number {number} is odd.")
Enter a number, and I'll tell you if it's even or odd: 3
The number 3 is odd.
3while 循环简介
for 循环用于针对集合中的每个元素都执行一个代码块,而 while 循环则不断运行,直到指定的条件不满足为止。
使用 while 循环
可使用 while 循环来数数。例如,下面的 while 循环从 1 数到 5:
current_number = 1
while current_number <= 5:
print(current_number)
current_number += 1
1
2
3
4
5
让用户选择何时退出
可以使用 while 循环让程序在用户愿意时不断运行,如下面的所示。我们在其中定义了一个退出值 ,只要用户输入的不是这个值,程序就将接着运行:
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)
print(message)
Tell me something, and I will repeat it back to you:
Enter 'quit' to end the program. test
test
Tell me something, and I will repeat it back to you:
Enter 'quit' to end the program. quit
quit
首次遇到这个循环时,message 是一个空字符串,因此 Python 进入该循环。执行到代码行 message = input(prompt) 时,Python 显示提示消息,并等待用户输入。不管用户输入是什么,都将赋给变量 message 并打印出来。接下来,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. test
test
Tell me something, and I will repeat it back to you:
Enter 'quit' to end the program. quit
使用标志
在要求很多条件都满足才继续运行的程序中,可定义一个变量,用于判断整个程序是否处于活动状态。这个变量称为标志 (flag),充当程序的交通信号灯。可以让程序在标志为 True 时继续运行,并在任何事件导致标志的值为 False 时让程序停止运行。这样,在 while 语句中就只需检查一个条件:标志的当前值是否为 True 。然后将所有其他测试(是否发生了应将标志设置为 False 的事件)都放在其他地方,从而让程序更整洁:
prompt = "nTell me something, and I will repeat it back to you:"
prompt += "nEnter 'quit' to end the program. "
active = True
while active:
message = input(prompt)
if message == 'quit':
active = False
else:
print(message)
Tell me something, and I will repeat it back to you:
Enter 'quit' to end the program. test
test
Tell me something, and I will repeat it back to you:
Enter 'quit' to end the program. quit
将变量 active 设置为 True,让程序最初处于活动状态, 在 while 循环中,在用户输入后使用一条 if 语句来检查变量 message 的值。如果用户输入的是’quit’ ,就将变量 active 设置为 False 。这将导致 while 循环不再继续执行。如果用户输入的不是’quit’ ,就将输入作为一条消息打印出来。
使用 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(f"I'd love to go to {city.title()}!")
Please enter the name of a city you have visited:
(Enter 'quit' when you are finished.) nanjin
I'd love to go to Nanjin!
Please enter the name of a city you have visited:
(Enter 'quit' when you are finished.) shanghai
I'd love to go to Shanghai!
Please enter the name of a city you have visited:
(Enter 'quit' when you are finished.) quit
以 while True 打头的循环将不断运行,直到遇到 break 语句。这个程序中的循环不断让用户输入他到过的城市的名字,直到用户输入 ‘quit‘ 为止。用户输入’quit’ 后,将执行 break 语句,导致 Python 退出循环。
在循环中使用 continue
要返回循环开头,并根据条件测试结果决定是否继续执行循环,可使用 continue 语句,它不像 break 语句那样不再执行余下的代码并退出整个循环。例如,来看一个从 1 数到 10 但只打印其中奇数的循环:
current_number = 0
while current_number < 10:
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。接下来,if 语句检查 current_number 与 2 的求模运算结果。如果结果为 0(意味着 current_number 可被 2 整除),就执行 continue 语句,让 Python 忽略余下的代码,并返回循环的开头。如果当前的数不能被 2 整除,就执行循环中余下的代码,将这个数打印出来。
避免无限循环
每个 while 循环都必须有停止运行的途径,这样才不会没完没了地执行下去。例如,下面的循环从 1 数到 5:
x = 1
while x <= 5:
print(x)
x += 1
1
2
3
4
5
但如果像下面这样不小心遗漏了代码行 x += 1 ,这个循环将没完没了地运行:
# 这个循环将没完没了地运行!
x = 1
while x <= 5:
print(x)
1
1
1
1
--snip--
每个程序员都会偶尔因不小心而编写出无限循环,在循环的退出条件比较微妙时尤其如此。如果程序陷入无限循环,可按 Ctrl + C,也可关闭显示程序输出的终端窗口。
4使用 while 循环处理列表和字典
for 循环是一种遍历列表的有效方式,但不应在 for 循环中修改列表,否则将导致 Python 难以跟踪其中的元素。要在遍历列表的同时对其进行修改,可使用 while 循环。通过将 while 循环同列表和字典结合起来使用,可收集、存储并组织大量输入,供以后查看和显示。
在列表之间移动元素
假设有一个列表包含新注册但还未验证的网站用户。验证这些用户后,如何将他们移到另一个已验证用户列表中呢?一种办法是使用一个 while 循环,在验证用户的同时将其从未验证用户列表中提取出来,再将其加入另一个已验证用户列表中。代码可能类似于下面这样:
# 首先,创建一个待验证用户列表
# 和一个用于存储已验证用户的空列表。
unconfirmed_users = ['alice', 'brian', 'candace']
confirmed_users = []
# 验证每个用户,直到没有未验证用户为止。
# 将每个经过验证的用户都移到已验证用户列表中。
while unconfirmed_users:
current_user = unconfirmed_users.pop()
print(f"Verifying 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())
Verifying user: Candace
Verifying user: Brian
Verifying user: Alice
The following users have been confirmed:
Candace
Brian
Alice
删除为特定值的所有列表元素
使用函数 remove() 来删除列表中的特定值。这之所以可行,是因为要删除的值只在列表中出现一次。如果要删除列表中所有为特定值的元素,该怎么办呢?
假设你有一个宠物列表,其中包含多个值为’cat’ 的元素。要删除所有这些元素,可不断运行一个 while 循环,直到列表中不再包含值’cat’ ,如下所示:
pets = ['dog', 'cat', 'dog', 'goldfish', 'cat', 'rabbit', 'cat']
print(pets)
while 'cat' in pets:
pets.remove('cat')
print(pets)
['dog', 'cat', 'dog', 'goldfish', 'cat', 'rabbit', 'cat']
['dog', 'dog', 'goldfish', 'rabbit']
使用用户输入来填充字典
可使用 while 循环提示用户输入任意多的信息。下面创建一个调查程序,其中的循环每次执行时都提示输入被调查者的名字和回答。我们将收集的数据存储在一个字典中,以便将回答同被调查者关联起来:
responses = {}
# 设置一个标志,指出调查是否继续。
polling_active = True
while polling_active:
# 提示输入被调查者的名字和回答。
name = input("nWhat is your name? ")
response = input("Which mountain would you like 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(f"{name} would like to climb {response}.")
What is your name? junjun
Which mountain would you like to climb someday? qixiashan
Would you like to let another person respond? (yes/ no) yes
What is your name? laojunjun
Which mountain would you like to climb someday? fangshan
Would you like to let another person respond? (yes/ no) no
--- Poll Results ---
junjun would like to climb qixiashan.
laojunjun would like to climb fangshan.
这个程序首先定义了一个空字典(responses ),并设置了一个标志( polling_active )用于指出调查是否继续。只要 polling_active 为 True ,Python 就运行 while 循环中的代码。
在这个循环中,提示用户输入其名字及其喜欢爬哪座山。将这些信息存储在字典 responses 中,然后询问用户是否继续调查。如果用户输入 yes ,程序将再次进入 while 循环;如果用户输入 no ,标志 polling_active 将被设置为 False ,而 while 循环将就此结束。最后一个代码块显示调查结果。
5小结
在本章中,你学习了:如何在程序中 使用 input() 来让用户提供信息;如何处理文本和数的输入,以及如何 使用 while 循环 让程序按用户的要求不断运行;多种控制 while 循环流程的方式:设置活动标志、使用 break 语句以及使用 continue 语句;如何使用 while 循环在列表之间移动元素,以及如何从列表中删除所有包含特定值的元素;如何结合使用 while 循环和字典。

欢迎加入生信交流群。加我微信我也拉你进 微信群聊 老俊俊生信交流群
哦,数据代码已上传至QQ群,欢迎加入下载。
群二维码:

老俊俊微信:
知识星球:
所以今天你学习了吗?
欢迎小伙伴留言评论!
今天的分享就到这里了,敬请期待下一篇!
最后欢迎大家分享转发,您的点赞是对我的鼓励和肯定!
如果觉得对您帮助很大,赏杯快乐水喝喝吧!
往期回顾
◀组会文献分享 — YTHDF2 介导靶基因 mRNA 降解参与前列腺癌进展
◀…
请关注“恒诺新知”微信公众号,感谢“R语言“,”数据那些事儿“,”老俊俊的生信笔记“,”冷🈚️思“,“珞珈R”,“生信星球”的支持!