python自学Day06(自学书籍python编程从入门到实践)

第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

---测试结果---
任我行最想去的地方是: 非洲
令狐冲最想去的地方是: 欧洲
任盈盈最想去的地方是: 中国

猜你喜欢

转载自www.cnblogs.com/raoqinglong/p/11546468.html
今日推荐