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


    第7章 用户输入和while循环

    • 我们设计的程序大多是为了解决用户最终的问题,所以我们大多需要在用户那里获取一些信息。
    • 学习用户输入的获取与处理,学习while循环让程序不断运行直到达到指定的条件不满足为止。

    7.1 函数input()的工作原理

    • 函数input()让程序暂停,等待用户输入一些文本。
    • 获取用户输入后将其存储在一个变量中,方便对其的使用。
    • 函数input()只接受一个参数:即要想用户显示的提示或者说明,让用户知道该如何做。
    Name = input('请输入您的姓名: ')
    print(Name)

    输出结果为:

    请输入您的姓名: 饶庆龙
    饶庆龙

    7.1.1 编写清晰的程序

    • 每当你使用input()函数,都应指定清晰易于明白的提示,准确的指出你希望用户输入的信息。
    • 通过末尾(冒号后面)包含一个空格,可以将提示与用户输入分开,让用户清楚的知道输入何处。
    • 当提示可能超过一行,在这种情况下你可以将提示存储在一个变量中,再将该变量传给函数input(),这样可以更加清晰。
    Tishi = '春眠不觉晓,处处闻啼鸟。
    夜来风雨声,花落知多少。
    '
    Tishi += '我们来玩一个游戏吧!游戏的名字叫做看诗猜名。
    请输入您觉得正确的诗名: '
    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 += '
    如果你想退出,可以输入 q 用于退出。
    开始输入: '
    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 += '
    如果你想退出,可以输入 q 用于退出。
    开始输入: '
    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 = '请输入您要添加的配料,
    输入 q 以退出,
    请在此输入: '
    #构建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('请输入您的年龄,
    输入 q 退出,
    请在此处输入:')
    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('
    ---最终结果---')
    #遍历循环后的字典,并且输出
    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('
    ---测试结果---')
    for name,place in like_places.items():
        print(name+'最想去的地方是: '+place)

    输出的结果为:

    请输入您的姓名: 任我行
    您最想去的地方:非洲
    您是否想让您的朋友参加此次测试:(yes/no)yes
    请输入您的姓名: 令狐冲
    您最想去的地方:欧洲
    您是否想让您的朋友参加此次测试:(yes/no)yes
    请输入您的姓名: 任盈盈
    您最想去的地方:中国
    您是否想让您的朋友参加此次测试:(yes/no)no
    
    ---测试结果---
    任我行最想去的地方是: 非洲
    令狐冲最想去的地方是: 欧洲
    任盈盈最想去的地方是: 中国
  • 相关阅读:
    Linux 命令[5]:rmdir
    Linux 命令[4]:pwd,date
    Linux 命令[0]:起航
    Linux 命令[3]:cd
    vscode插件
    Object.freeze()
    插件
    前端开发调试线上代码
    前端自动化测试是浪费时间还是节约时间?
    踩坑之用lrz插件进行图片压缩
  • 原文地址:https://www.cnblogs.com/raoqinglong/p/11546468.html
Copyright © 2020-2023  润新知