之前我有说过,感觉目前学的几课缺少互动,今天,互动踏着五彩祥云来了。input()就是新手阶段接触的第一个互动。通过input()我们就可以做一些简单的可互动程序了,如我之前写的猜数字的游戏。
那么废话不多,看看课本里是怎么说的吧。
7.1 函数input()的工作原理
函数input()让程序暂停运行,等待用户输入一些文本。获取用户输入后,Python将其赋给一个变量,以方便你使用。
例如,下面的程序让用户输入一些文本,再将这些文本呈现给用户:
>>> mygilrfrind = input("我的女朋友是:")
我的女朋友是:全烋星
>>> print(mygilrfrind)
全烋星
函数inout()接受一个参数——要向用户显示的提示或说明,让用户知道该如何做。在本例中,Python运行第一行代码时,用户将看到提示我的女朋友是:。程序等待用户输入,并在用户按回车键后继续运行。输入被赋给变量mygilrfrind,接下来的print(mygilrfrind)将输入呈现给用户:
全烋星
7.1.1 编写清晰的程序
每当使用函数input()时,都应指定清晰易懂的提示,准确地指出希望用户提供什么样的信息——指出用户应该输入何种信息的任何提示都行,如下所示:
name = input("请输入女朋友的名字:")
print(f"\n我的女朋友是{name}")
通过在提示末尾(这里是冒号后面)包含一个空格,可将提示与用户输入分开,让用户清楚地知道其输入始于何处,如下所示:
请输入女朋友的名字:全烋星
我的女朋友是全烋星
有时候,提示可能超过一行。例如,你可能需要指出获取特定输入的原因。在这种情况下,可将提示赋给一个变量,再将该变量传递给函数input()。这样,即便提示超过一行,input()语句也会非常清晰。
girl = "我的女朋友又漂亮又温柔。"
girl += "\n关键是身材还好。她的名字是:"
girl1 = input(girl)
print(girl1)
本例演示了一种创建多行字符串的方式。第一行将消息的前半部分赋给变量girl中。在第二行中,运算符+=在前面赋给变量girl的字符串末位附加一个字符串。
最终的提示占据两行,且问号后面又一个空格,这也是为了让其更加清晰:
我的女朋友又漂亮又温柔。
关键是身材还好。她的名字是:全烋星
全烋星
7.1.2使用int()来获取数值输入
使用input()时,Python将用户输入解读为字符串。请看下面让用户输入年龄的解释器会话:
>>> girl = input("我的女朋友年龄是:")
我的女朋友年龄是:18
>>> girl
'18'
用户输入的是数21,但我们请求Python提供变量age的值时,它返回的是'18'——用户输入数值的字符串表示。我们怎么知道Python将输入解读成了字符串呢?因为这个数用引号括起了。如果只想打印输入,这一点问题都没有:但如果试图将输入作为数来用,就会引发错误:
>>> girl = input("我的女朋友年龄是:")
我的女朋友年龄是:18
>>> girl
'18'
>>> girl + 18
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: can only concatenate str (not "int") to str
试图将输入用于数值比较时,Python会引发错误,因为它无法将字符串和整数进行比较:不能将赋给age的字符串“18”与数值10相加。
为解决这个问题,可使用函数int(),它让Python将输入视为卧虎之。函数int()将数的字符串表示转化为数值表示,如下所示:
>>> girl = int(input("我的女朋友年龄是:"))
我的女朋友年龄是:18
>>> girl += 10
>>> girl
28
在本例中,用户根据提示输入18后,Python将这个数解读为字符串,但随后int()将这个字符串转换成了数值表示。这样Python就能运行条件解读:将变量girl(它现在表示的是数值18)同10相加。测试结果为28.
如何在实际程序中使用函数int()呢?请看下面的程序:
girl = int(input("我的女朋友年龄是:"))
if girl >= 18:
print("祝你们幸福~")
else:
print("你女朋友竟然是未成年人,你是社会败类!")
在此程序中,为何可以将girl同18进行比较呢?因为在比较前int()将输入转换成了数值表现。如果输入的数值大于或等于18,就祝福用户幸福美满:
我的女朋友年龄是:18
祝你们幸福~
将数值输入用于计算和比较前,务必将其转换为数值表示。
7.1.3 求模运算符
处理数值信息时,求模运算符(%)是个很有用的工具,它将两个数相除并返回余数:
>>> 10 % 3
1
>>> 10 % 4
2
>>> 10 % 7
3
求模运算符不会指出一个数是另外一个数的多少倍,只指出余数是多少。
如果一个数可被另一个数整除,余数就是0.因此求模运算符将返回0.可利用这一点来判断一个数是奇数还是偶数:
girl = int(input("我的女朋友年龄是:"))
if girl % 2 == 0:
print("你女朋友的年龄是偶数")
else:
print("你女朋友是奇数!")
偶数都能被2整除,因此如果一个数和2执行求模运算的结果为0,即girl % 2 == 0,那么这个数就是偶数;否则就是奇数。
我的女朋友年龄是:17
你女朋友是奇数!
7.2 while 循环简介
for循环用于针对集合中的每个元素都执行一次代码块,而while循环则不断运行,直到制定的条件不满足为止:
7.2.1 使用while循环
可使用while循环来数数。例如,下面的while循环从1数到5:
num = 1
while num <= 5:
num += 1
print(num)
在第一行,将0赋值给变量num,从而指定从1开始数.将接下来的while循环设置成:只要num小于或等于5,就接着运行这个循环。循环中的代码打印num的值,再使用代码num += 1将其值加1.
只要满足条件num <= 5,python就接着运行这个循环。因为1小于5,所以Python打印1并将num加1,使其为2.一旦num大于5,循环就将停止,整个程序也将结束:
1
2
3
4
5
你每天使用的程序很可能就包含while循环。例如,游戏使用while循环,确保在玩家想玩时不断运行。并在玩家想退出时停止运行。如果程序在用户没有让它停止时停止运行,或者在用户想退出时还继续运行,那就太没意思了。因此,while循环很有用。
7.2.2 让用户选择何时退出
可以使用while循环让程序在用户愿意时不断运行,如下面的程序表示。我们在其中定义了一个退出值,只要用户输入的不是这个值,程序就将接着运行:
girl = input("你女朋友多少岁?(输入'退出'则退出本程序)")
if girl == "退出":
print("欢迎下次光临~")
else:
while girl != "退出":
girl = int(girl)
if girl >= 18:
print("祝你们幸福")
girl = input("你女朋友多少岁?(输入'退出'结束本程序)")
else:
print("你这个社会败类!")
girl = input("你女朋友多少岁?(输入'退出'结束本程序)")
在第一行定义了一条提示消息,告诉用户有两个选择,要么输入一条消息,要么输入退出值“退出”。接下来进入判断,如果用户输入“退出”,则提示"欢迎下次光临~"。如果不是,则循环代码,当用户输入的不是“退出”时,将变量girl的值用int()定义为数。再将数进行判断。根据分支不同,打印不同的消息。同时提示用户再次输入值,进行判断后是否重新进入循环。(胭惜雨:本段内容是我自己写的,并非教科书上的内容,但含义一致。)
你女朋友多少岁?(输入'退出'则退出本程序)18
祝你们幸福
你女朋友多少岁?(输入'退出'结束本程序)16
你这个社会败类!
你女朋友多少岁?(输入'退出'结束本程序)退出
进程已结束,退出代码0
7.2.3 使用标志
在前一个示例中,我们让程序在满足指定条件时执行特定的任务。但在更复杂的程序中,很多不同的事件会导致程序停止运行。在这种情况下,该怎么办呢?
例如:在游戏中玩家的飞船坠毁、时间已用尽。导致程序结束的事件有很多时,如果在一条while语句中检查所有这些条件,将既复杂又困难。
在要求很多条件都满足才继续运行的程序中,可定义一个变量,用于判断整个程序是否处于活动状态。这个变量称为标志(flag),充当程序的交通信号灯。可以让程序在标志True时继续运行,并在任何事件导致标志的值为False时让程序停止运行。这样,在while语句中就只需检查一个条件:标志的当前值是否为True。然后将所有其他测试(是否发生了应将标志设置为False的事件)都放在其他地方,从而让程序更整洁。
下面再前一节的程序中添加一个标志。将其命名为active,用于判断程序是否应该继续运行。
girl = input("你女朋友多少岁?(输入'退出'则退出本程序)")
active = True
while active:
if girl == "退出":
active = False
elif girl != "退出":
girl = int(girl)
if girl >= 18:
print("祝你们幸福")
girl = input("你女朋友多少岁?(输入'退出'结束本程序)")
else:
print("你这个社会败类!")
girl = input("你女朋友多少岁?(输入'退出'结束本程序)")
将变量acive设置为true,让程序最初处于活动状态。这样做简化了while语句,因为不需要在其中做任何比较——相关的逻辑由程序的其他部分处理。只要变量active 为true,循环就将继续运行。
在while循环中,在用户输入后使用一条if语句来检查变量girl的值。如果用户输入的是“退出”,就将变量active设置为false。这将导致while循环不再继续执行。如果用户输入的不是“退出”,就将后续设定好的内容打印出来。
这个程序的输出与前一个示例相同。前一个示例将条件测试直接放在while语句中,而这个程序则使用一个标志来指出程序是否处于活动状态。这样,如果要添加测试(如elif语句)以检查是否发生了其他导致active变为false的事件,就会很容易。在复杂的程序(如很多事件会导致程序停止运行的游戏)中,标志很有用:在任意一个事件导致活动标志变为false时,主游戏循环将推出,此时可显示一条游戏结束消息,并让用户选择是否要重新玩。
7.2.4 使用break 退出循环
要立即退出while循环,不再运行循环中余下的代码,也不管条件测试的结果如何,可使用break语句。break语句用于控制程序流程,可用来控制哪些代码行将执行、哪些代码行不执行,从而让程序按你的要求执行你要执行的代码。
例如,来看一个让用户指出自己有哪些女朋友的程序。在这个程序中,可在用户输入“退出”后使用break语句立即退出while循环:
girl = "我的女朋友们是:(输入'退出'退出本程序)"
girls = ""
while True :
girl = input(girl)
if girl == "退出" :
print(f"我的女朋友们是:{girls}")
break
else:
print(f"哎哟,{girl}竟然是你女朋友,情场浪子啊。还有呢?")
girls = girls + girl + "\t"
girl = "我的女朋友们是:(输入'退出'退出本程序)"
以while True打头的循环将不断运行,知道遇到break语句。这个程序中的循环不断让用户输入他女朋友的名字,直到用户输入“退出”为止。用户输入“退出”后,将执行break语句,导致Python退出循环:
我的女朋友们是:(输入'退出'退出本程序)刘亦菲
哎哟,刘亦菲竟然是你女朋友,情场浪子啊。还有呢?
我的女朋友们是:(输入'退出'退出本程序)长泽雅美
哎哟,长泽雅美竟然是你女朋友,情场浪子啊。还有呢?
我的女朋友们是:(输入'退出'退出本程序)朴智妍
哎哟,朴智妍竟然是你女朋友,情场浪子啊。还有呢?
我的女朋友们是:(输入'退出'退出本程序)退出
我的女朋友们是:刘亦菲 长泽雅美 朴智妍
注意:在任何Python循环中都可使用break语句。例如,可使用break语句来退出遍历列表或字典中的for循环。
7.2.5 在循环中使用continue
要返回循环开头,并根据条件测试结果决定是否继续执行循环,可使用continue语句,它不像break语句那样不再执行余下的代码而退出整个循环。例如,来看一个从1数到10但只打印其中奇数的循环:
num = 0
while num < 10 :
num += 1
if num % 2 == 0 :
continue
print(num)
首先将num设置为0,由于它小于10,Python进入while循环。进入循环后,以步长1的放上往上数,因此num为1.接下来,if语句检查num与2的求模运算结果。如果结果为0,就执行num语句,让Python忽略余下的代码,并返回循环的开头。如果当前的数不能被2整除,就执行循环中的余下的代码,将这个数打印出来:
1
3
5
7
9
7.2.6 避免无限循环
每个while循环都必须有停止运行的途径,这样才不会没完没了地执行下去。例如,下面的循环从1数到5:
x = 1
while x <= 5:
print(x)
x += 1
但如果像下面这样不小心遗漏了代码行X += 1,这个循环将没完没了地运行。
while x <= 5:
print(x)
在这里,x的初始值为1,但根本不会变。因此条件测试X <= 5 始终为True,导致while循环没完没了地打印1.
每个程序员都会偶尔因不小心而编写无限循环,在循环的推出条件比较微妙时尤其如此。如果程序陷入无限循环,可安ctrl + C,也可以关闭显示程序输出多终端窗口。
要避免编写无限循环,务必对while循环进行测试,确保其按预期那样结束。如果你希望程序在用户输入特定值时结束,可运行程序并输入这样的值。如果在这种情形下程序没有结束,请检查程序处理这个值的方式,确认程序至少有一个这样的地方能让循环条件为false,或者让break语句得以执行。
7.3 使用while循环处理列表和字典
到目前为止,我们每次都只处理了一项用户信息:获取用户的输入,再将输入打印出来或作应答;循环再次运行时,获悉另一个输入值并作出响应。然而,要记录大量的用户和信息,需要在while循环中使用列表和字典。
for循环是一种遍历列表的有效方式,但不应在for循环中修改列表,否则将导致Python难以跟踪其中的元素。要在遍历列表的同时对其进行修改,可使用while循环。通过将while循环用列表和字典结合起来使用,可手机、存储并组织大量的输入,供以后查看和显示。
7.3.1 在列表之间移动元素
假设有一个列表包含新注册但还未验证的网站用户。验证这些用户后,如何将他们移到另一个已验证用户列表中呢?一种办法是使用while循环,在验证用户的同时将其从未验证用户列表中提取出来,再将其加入另一个已验证用户列表中。代码可能类似于下面这样:
user = ['全孝盛','朴智妍','朴孝敏']
oldusers = []
while user:
olduser = user.pop()
print(f"已验证用户{olduser}")
oldusers.append(olduser)
print("已验证用户:")
for olduser in oldusers:
print(olduser)
首先创建一个未验证用户列表,还创建了一个空列表,用于存储已验证的用户。while循环将不断运行,直到列表user变成空的。在此循环中,方法pop()以每次一个的方式从列表user末尾删除未验证的用户。由于朴孝敏位于列表user末尾,其名字将首先删除、赋给变量olduser并加入列表oldusers中。
为模拟用户验证过程,我们打印一条验证消息并将用户加入已验证用户列表中。未验证用户列表越来越短,而已验证用户列表越来越长。未验证用户为空后结束循环,再打印已验证用户列表。
已验证用户朴孝敏
已验证用户朴智妍
已验证用户全孝盛
已验证用户:
朴孝敏
朴智妍
全孝盛
7.3.2 删除为特定值的所有列表元素
在第3章中,我们使用函数remove()来删除列表中的特定值。这之所以可行,是因为删除的值只在列表中出现一次。如果要删除列表中所有为特定值的元素,该怎么办呢?
mygirlfriend = ['全孝盛','朴智妍','朴孝敏','朴智妍','朴智妍']
while '朴智妍' in mygirlfriend:
mygirlfriend.remove('朴智妍')
print(mygirlfriend)
首先创建一个列表,其中包含多个值为'朴智妍'的元素。Python进入while循环,因为它发现'朴智妍'在列表中至少出现了一次。进入该循环后,Python删除第一个'朴智妍'并返回while代码行,然后发现'朴智妍'还包含在列表中,因此在此进入循环。直到'朴智妍'这个值不再包含在列表中,然后退出循环并再次打印列表:
['全孝盛', '朴孝敏']
7.3.3 使用用户输入来填充字典
可使用while循环提示用户输入任意多的信息。下面创建一个调查程序,其中的循环每次执行时都提示输入被调查者的名字和回答。我们将手机的数据存储在一个字典中,以便将回答同被调查者关联起来。
xinxi = {}
use = input("你的名字是?")
girl = input("你喜欢的女明星是?")
xinxi = {}
use = input("你的名字是?")
girl = input("你喜欢的女明星是?")
flag = True
shuru = ""
while flag:
xinxi[use] = girl
print()
shuru = input("还要继续输入吗?(是/否)")
if shuru == "否":
print(f"本次收集信息内容如下:{xinxi}")
print("感谢您的配合")
flag = False
continue
else:
use = input("你的名字是?")
girl = input("你喜欢的女明星是?")
这个程序首先定了一个空字典xinxi,并设置了一个标志flag用于指出调查是否继续。只要flag为True,Python就运行while循环中的代码。
这个循环中,提示用户输入自己的名字以及喜欢的女明星。将这些信息存储在字典xinxi中,然后询问用户是否继续调查。如果用户输入“是”,程序将再次进入while循环;如果用户输入“否”,标志flag将被设置为false,同时通过continue回到循环开始进行判断,while循环就此结束。
如果运行这个程序,并输入一些名字和回答,输出就类似于下面这样:
你的名字是?王大锤
你喜欢的女明星是?刘亦菲
还要继续输入吗?(是/否)是
你的名字是?张小雷
你喜欢的女明星是?长泽雅美
还要继续输入吗?(是/否)是
你的名字是?秋水瞳
你喜欢的女明星是?全孝盛
还要继续输入吗?(是/否)德玛西亚
请重新输入是/否
还要继续输入吗?(是/否)否
本次收集信息内容如下:{'王大锤': '刘亦菲', '张小雷': '长泽雅美', '秋水瞳': '全孝盛'}
感谢您的配合
进程已结束,退出代码0
本章内容后面的示例主要是我自己开动小脑筋写的,肯定有很多很蠢的地方,但按下不表,基本上还是能还原课本中的意思。
这节的内容相对较少,还是比较轻松的,下节《函数》、以及第九课《类》都是大部头的部分。把这两个部分啃完,再学两节相对简单的课,就要进入《项目》环节了。
想想还有些小激动呢,嘿嘿。
胭惜雨
2021年02月07日