第7章 用户输入和while循环
- 我们设计的程序大多是为了解决用户最终的问题,所以我们大多需要在用户那里获取一些信息。
- 学习用户输入的获取与处理,学习while循环让程序不断运行直到达到指定的条件不满足为止。
7.1 函数input()的工作原理
- 函数input()让程序暂停,等待用户输入一些文本。
- 获取用户输入后将其存储在一个变量中,方便对其的使用。
- 函数input()只接受一个参数:即要想用户显示的提示或者说明,让用户知道该如何做。
Name = input('请输入您的姓名: ') print(Name)
输出结果为:
请输入您的姓名: 饶庆龙
饶庆龙
7.1.1 编写清晰的程序
- 每当你使用input()函数,都应指定清晰易于明白的提示,准确的指出你希望用户输入的信息。
- 通过末尾(冒号后面)包含一个空格,可以将提示与用户输入分开,让用户清楚的知道输入何处。
- 当提示可能超过一行,在这种情况下你可以将提示存储在一个变量中,再将该变量传给函数input(),这样可以更加清晰。
Tishi = '春眠不觉晓,处处闻啼鸟。\n夜来风雨声,花落知多少。\n' Tishi += '我们来玩一个游戏吧!游戏的名字叫做看诗猜名。\n请输入您觉得正确的诗名: ' Caice = input(Tishi) if Caice == '春晓': print('恭喜您回答正确。') else: print('不好意思,输入错误!再加油哟!')
输出的结果为:
春眠不觉晓,处处闻啼鸟。
夜来风雨声,花落知多少。
我们来玩一个游戏吧!游戏的名字叫做看诗猜名。
请输入您觉得正确的诗名: 唐诗
不好意思,输入错误!再加油哟!
- 第1行 我们创建了第一个提示就是一首完整的诗。
- 第2行 我们是运算符 += 将第1行和第2行的两个字符串进行拼接。
- 第3行 调用input函数将Tishi的内容传参进去,这样提示的内容完整清晰,用户很轻易的知道自己要输入的信息。
- 第4行 调用if条件测试 测试用户传进来的参数是否 字符串 春晓
- 第5行 如果第4行的条检测试通过,执行输出操作
- 第6行 如果第4行的条件测试未通过,执行else语块下第7行的操作。
7.1.2 使用 int()来获取数值输入
- 使用input函数时,python将用户输入解读为字符串。
- 为解决这个问题,可使用函数int()让他将python输入内容转换为整数。
- 将数值输入用于比较和计算前,务必将去转换为数值表示。
age = input('请输入您的年龄(整数): ') print(type(age)) age = int(age) print(type(age)) if age < 18: print('您是未成年!') else: print('您已经成年了')
输出结果为:
请输入您的年龄(整数): 18 <class 'str'> <class 'int'> 您已经成年了
- 第1行 使用input函数等待用户输出
- 第2行 打印第一次输入时候输入过后信息的类型,为字符串类型。
- 第3行 将第1行age使用int函数,转换为整数数值。
- 第4行 打印新的变量age的类型,为整数类型。
- 第5行 判断用户输入的数值是否小于18
- 第6行 如果判断通过,执行改行操作,输出 您是未成年
- 第7行 判断不通过,执行else语块下 第8行操作 输出 您已经成年了
7.1.3 求模运算符
- 处理数值信息的时候,求模运算符 % 是一个很有用的工具,将两个整数相除并返回余数。
- 求模运算符不会支出一个数是另一个数的几倍,而只是指出余数是多少。
- 判断数值是否是偶数时,可以让一个数与2求余,如果余0则是偶数,余1则是奇数。
Numbers = [ i for i in range(1,10) if i % 2 == 0] Numbers1 = [ i for i in range(1,10) if i % 2 == 1] print(Numbers,Numbers1)
输出的结果为:
[2, 4, 6, 8] [1, 3, 5, 7, 9]
- 第1行 使用列表解析式创建列表Numbers 表示为迭代变量i 在数值1-9范围类 如果能整除2 则存贮为变量i 存储1-9内偶数
- 第2行 使用列表解析式创建列表Numbers1 表示为迭代变量i 在数值1-9范围类 如果整除2余1 则存贮为变量i 存储1-9内奇数
- 第3行 输出两个列表
7.1.4 在python2.7中获取输入
- 在python2.7中使用raw_input()函数来输入,与input函数意义一样,在2.7中最好使用raw_input()来让用户输入。
7.2 while循环简介
- for循环用于针对集合中的每一个元素都一个代码块,二while循环不断地运行,知道指定的条件不满足为止。
7.2.1 使用while循环
start_number = 1 while start_number <= 5 : print(start_number) start_number += 1
输出结果为:
1 2 3 4 5
- 第1行 我们定义一个变量存贮数值 1
- 第2行 调用while循环 当变量中的满足条件 变量数值小于等于5时 不断运行
- 第3行 输出循环的数值
- 第4行 将循环中的值加1 然后返回到第2行进行判断 当数值不满足小于等于5时循环中断
7.2.2 让用户选择何时退出
Tishi = '请告诉我一些东西,待会我将返回给你。' Tishi += '\n如果你想退出,可以输入 q 用于退出。\n开始输入: ' message = '' while message != 'q': message = input(Tishi) if message != 'q': print(message)
输出结果为:
请告诉我一些东西,待会我将返回给你。
如果你想退出,可以输入 q 用于退出。
开始输入: 我是饶庆龙
我是饶庆龙
请告诉我一些东西,待会我将返回给你。
如果你想退出,可以输入 q 用于退出。
开始输入: q
- while循环的条件我们是对比 message 与 字符 q 是否相等。
- 因为 message 我们需要在后面输入 前面没由与q比较的内容 所以我们创建一个空字符串 message
- 当我们输入内容为q时候 进入if语句 因为if语句条件是不等于q时 输出输入内容 所以当我们输入q时 不会进行任何输出
- 当你输入不等于q的内容 while语句和if语句的条件均会通过,那么我们输入的话,将会被无限循环输出。
7.2.3 使用标志
- 如果一条while循环要检查多个条件,将即负责又困难。
- 在要求很多条件满足才能继续进行的程序中,可以定义一个变量,用于判断整个程序是否处于活动状态。这个变量称为标志!
Tishi = '请告诉我一些东西,待会我将返回给你。' Tishi += '\n如果你想退出,可以输入 q 用于退出。\n开始输入: ' message = '' active = True while active: message = input(Tishi) if message == 'q': active = False else: print(message)
输出结果为:
请告诉我一些东西,待会我将返回给你。
如果你想退出,可以输入 q 用于退出。
开始输入: 我爱您
我爱您
请告诉我一些东西,待会我将返回给你。
如果你想退出,可以输入 q 用于退出。
开始输入: q
- 对比7.2.2中代码 我们设置了一个标志变量 active 当触发if语句中的条件 active会被变成False 然后返回到循环中
- while循环的条件为False时,循环中断。
7.2.4 使用break退出循环
- 当我们要立即退出while循环,不再运行余下的代码,也不管条件测试的结果如何,可使用break语句。
- break语句用于控制程序流程,可使用他来控制那些代码执行,那些代码不执行,从而让您的程序按您的要求执行代码。
- 在任何python循环中都可以使用break来推出循环。
#使用while循环循环1-10内偶数 start_number = 0 #设置条件为True 没有退出机制将会无限循环 while True: #让初始数值0 循环一次加上1 start_number += 1 #设置退出条件,如果条件被触发,将退出循环。 if start_number > 10: break #用if语句判断是否偶数 if start_number % 2 == 0: print(start_number) else: pass
输出的结果为:
2 4 6 8 10
- 开始循环初始数值是0 进入第一步+1 变成数值1
- 判断是否大于10 不通过下一步 判断是否能整除2
- 能整除通过,输出该数字。
- 不能通过则不进行任何操作,使用pass占位符
- 当最后一次输出10的时候,再进循环+1 这个时候数值变为11
- 当数值为11 满足大于10条件 触发break语句 中断循环
7.2.5 再循环中使用continue
- 返回到循环的开头,并根据条件测试结果决定是否继续执行循环,可使用continue语句。
- 它只是中断当前循环返回循环的开头。
1 #使用while循环循环1-10内奇数 2 start_number = 0 3 #设置条件为True 没有退出机制将会无限循环 4 while True: 5 #让初始数值0 循环一次加上1 6 start_number += 1 7 #设置退出条件,如果条件被触发,将退出循环。 8 if start_number > 10: 9 break 10 #用if语句判断是否偶数,是偶数则使用continue语句返回到第4行重新开始循环 11 if start_number % 2 == 0: 12 continue 13 else: 14 print(start_number)
输出结果为:
1 3 5 7 9
7.2.6 避免无限循环
- 每个while循环都必须有停止的途径,这样才不会没玩的执行下去。
- 如果程序陷入无限循环,可按ctrl+c,也可以关闭显示程序的终端窗口。
- 务必检查循环的条件以及包含语块的设计,避免无意义的死循环。
- 数值循环中,很多可能因为忘记变更数字以及数字变更的位置错误导致死循环。
练习:
#7-4 披萨配料 #将提示存储到一个变量中方便后面调用 Tishi = '请输入您要添加的配料,\n输入 q 以退出,\n请在此输入: ' #构建while循环 while True: #等待用户输入信息 ingredients = input(Tishi) #判断用户输入信息是否字符 q 如果是则触发break语句 退出循环 if ingredients == 'q': break #如果没有触发退出机制,则执行输出 else: print('我们会在披萨中添加 '+ingredients+' 这种配料')
输出结果为:
请输入您要添加的配料,
输入 q 以退出,
请在此输入: 芝士
我们会在披萨中添加 芝士 这种配料
请输入您要添加的配料,
输入 q 以退出,
请在此输入: q
#7-5电影票 ''' age <3 0 age >= 3 and age <= 12 10 age > 12 15 ''' while True: age = input('请输入您的年龄:') age = int(age) if age <3 : print('您无需支付任何费用。') elif age >= 3 and age <= 12 : print('您需要支付10美元!') elif age > 12 : print('您需要支付15美元!')
输出结果为:
请输入您的年龄:2 您无需支付任何费用。 请输入您的年龄:7 您需要支付10美元! 请输入您的年龄:15 您需要支付15美元! 请输入您的年龄:
1 #7-5电影票 2 ''' 3 age <3 0 4 age >= 3 and age <= 12 10 5 age > 12 15 6 ''' 7 active = True 8 while active: 9 age = input('请输入您的年龄,\n输入 q 退出,\n请在此处输入:') 10 if age == 'q': 11 active = False 12 continue 13 new_age = int(age) 14 if new_age <3 : 15 print('您无需支付任何费用。') 16 elif new_age >= 3 and new_age <= 12 : 17 print('您需要支付10美元!') 18 elif new_age > 12 : 19 print('您需要支付15美元!')
- 这个地方我要讲下我自己的错误,试了几次之前把 第10行-第12行代码块放到了 第13行后面 程序一直报错
- 我们要注意同级别代码是按顺序执行的,如果先执行第13行 那么我们输入的 q 是无法转换为数值的,所以会报错。
- 更改顺序后,可以使用break 也可以先将标志改为False然后使用continue将active新值带回到循环开头,这样循环就结束了。
- 如果不使用continue或者break语句,我们还将执行第13行,将输入内容转换为数值,而这个是我们要避免的。
- 也可以使用if嵌套的模式。
输出结果为:
请输入您的年龄, 输入 q 退出, 请在此处输入:2 您无需支付任何费用。 请输入您的年龄, 输入 q 退出, 请在此处输入:q
7.3 使用while循环来处理列表和字典
- for循环是遍历列表的有效方式,但是在for循环中不应该修改列表,否则将导致python难以跟踪其中的元素。
- 要在遍历列表同时对其修改,可以使用while循环。
- 通过将while循环和列表字典结合起来用,可收集存储并组织输入,供以后查看和显示。
7.3.1 在列表之间移动元素
1 #创建一个有元素的未接受检查的用户列表 2 unconfirmed_users = ['令狐冲','任我行','任盈盈'] 3 #创建一个空列表用于添加已经接受了检查的用户 4 confirmed_users = [] 5 #使用while循环 循环列表 当列表为空 循环条件为False 循环终止 6 while unconfirmed_users: 7 #创建一个变量接受用pop方法在为接受检查列表末尾弹出的元素 8 confirmed_user = unconfirmed_users.pop() 9 #输出 接受检查用户:和刚才接受的变量 10 print('接受检查用户: '+confirmed_user) 11 #将变量添加到接受检查列表的末尾 12 confirmed_users.append(confirmed_user) 13 #当未接受检查列表为空时,循环结束,执行输出操作 以下用户接受了检查 14 print('以下用户接受了检查:') 15 #使用for循环换行打印出接受检查列表的每个元素 16 for user in confirmed_users: 17 print(user)
输出结果为:
接受检查用户: 任盈盈
接受检查用户: 任我行
接受检查用户: 令狐冲
以下用户接受了检查:
任盈盈
任我行
令狐冲
7.3.2 删除包含特定值的所有列表
- 使用remove函数来删除列表中的特定值。
- 使用while循环,条件设置为查看特定值是否在列表中,如果在执行删除命令。
#创建一个数值列表,其中有多个重复数值1 Numbers = [1,6,7,5,4,1,3,5,1,8,1] #使用while循环 条件为1在列表中 while 1 in Numbers: Numbers.remove(1) #输出删除 数值1的列表并且给他来个倒序 Numbers.sort(reverse=True) print(Numbers)
输出结果为:
[8, 7, 6, 5, 5, 4, 3]
7.3.3 使用用户输入来填充字典
- 首先我们创建一个空字典。
- 然后将用户输入的信息分为针对键 的输入,针对 值得输入,然后使用创建字典的方法将组合的键值对添加到字典中。
- 不过有一个问题,键是唯一的,如果名字重复了怎么办?这个问题我们需要考虑哈。
#创建一个空字典,方便后面的用户输入信息录入字典 love_team = {} #设置激活标志 active = True #使用while循环 while active: #获取用户的姓名和喜爱球队分别存储到对应的变量中 name = input('请输入您的姓名: ') team = input('您最喜欢的英超球队是: ') #将用户的姓名作为键,喜爱的球队作为值,往空字典中加入键值对 love_team[name] = team #询问是否还有人参与测试 repeat = input('您是否想让朋友参加此次测试:(yes/no)') #设置if语句当没有的时候将激活标志变为False终止循环 if repeat == 'no': active = False print('\n---最终结果---') #遍历循环后的字典,并且输出 for name,team in love_team.items(): print(name+'最喜欢的英超队伍是: '+team)
输出结果为:
请输入您的姓名: 任我行 您最喜欢的英超球队是: 曼城 您是否想让朋友参加此次测试:(yes/no)yes 请输入您的姓名: 令狐冲 您最喜欢的英超球队是: 曼联 您是否想让朋友参加此次测试:(yes/no)yes 请输入您的姓名: 任盈盈 您最喜欢的英超球队是: 狼队 您是否想让朋友参加此次测试:(yes/no)no ---最终结果--- 任我行最喜欢的英超队伍是: 曼城 令狐冲最喜欢的英超队伍是: 曼联 任盈盈最喜欢的英超队伍是: 狼队
联系:
1 #7-8熟食店 2 #创建一个点单的三明治列表 3 sandwich_orders = ['Tuna sandwich','Ham cheese sandwich','Potato salad sandwich'] 4 #创建一个已经做成功的三明治列表 5 sandwich_finished = [] 6 while sandwich_orders: 7 sandwich = sandwich_orders.pop() 8 print('我已经做好了您的 '+sandwich) 9 sandwich_finished.append(sandwich) 10 print('您的三明治都做好了,名单如下:') 11 for sandwich in sandwich_finished: 12 print(sandwich)
输出的结果为:
我已经做好了您的 Potato salad sandwich
我已经做好了您的 Ham cheese sandwich
我已经做好了您的 Tuna sandwich
您的三明治都做好了,名单如下:
Potato salad sandwich
Ham cheese sandwich
Tuna sandwich
#7-9 五香熏牛肉 sandwich_orders = ['Tuna sandwich','pastrami','Ham cheese sandwich','pastrami','Potato salad sandwich','pastrami','pastrami'] while 'pastrami' in sandwich_orders: sandwich_orders.remove('pastrami') print('pastrami 已经卖完了。') print('还剩下以下食品供您选择:') for sandwich in sandwich_orders: print(sandwich)
输出的结果为:
pastrami 已经卖完了。
还剩下以下食品供您选择:
Tuna sandwich
Ham cheese sandwich
Potato salad sandwich
#7-10 梦想的独家圣地 like_places = {} active = True while active: name = input('请输入您的姓名: ') place = input('您最想去的地方:') like_places[name] = place repeat = input('您是否想让您的朋友参加此次测试:(yes/no)') if repeat == 'no': active = False print('\n---测试结果---') for name,place in like_places.items(): print(name+'最想去的地方是: '+place)
输出的结果为:
请输入您的姓名: 任我行 您最想去的地方:非洲 您是否想让您的朋友参加此次测试:(yes/no)yes 请输入您的姓名: 令狐冲 您最想去的地方:欧洲 您是否想让您的朋友参加此次测试:(yes/no)yes 请输入您的姓名: 任盈盈 您最想去的地方:中国 您是否想让您的朋友参加此次测试:(yes/no)no ---测试结果--- 任我行最想去的地方是: 非洲 令狐冲最想去的地方是: 欧洲 任盈盈最想去的地方是: 中国