2.11 Python while 循环

image-20221123152906027

1. while 循环语句

while 循环语句: 对条件进行判断, 
为真: 则执行代码块内的语句, 执行完后会再次放回到 while 语句的条件判断, 为真则继续执行子代码块.
为假: 跳过代码块内的语句, 往下运行.
* 死循环: while 的条件永远为真, 一直执行子代码块, 程序不会停止运行.

结构: 
* 1. while 关键字
* 2. 条件+冒号, 所有的控制语句都以冒号结尾, 后面紧跟着一个代码块.
* 3. 代码块(代码块为 while 的子句)

2. 无限循环

无限循环油称'死循环', 它会占用很多的计算机资源.
正常的业务编程中应该尽量避免死循环. 不然会影响程序性能, 严重的话会造成程序卡死崩溃.
while True:
    print(1)
    

GIF 2022-11-22 1-01-43

2022-11-11_01451

3. while 循环使用

设计程序时几乎不会是死循环, 而是重复多少次后结束循环.
3.1 循环打印数学
设计一个程序, 循环运行字代码块打印15后停止运行.
# 1. 定义一个变量, 值为1
x = 1

# 2. 判断 x 的值是否比 6 小, 条件为 True 执行子代码块
while x < 6:
    # 2.1 打印x的值
    print(x)
    # 2.2 自增
    x += 1

2022-11-22_01608

2022-11-12_01452

Pythontutor 是一个在线可视化代码执行过程的的网站, 借助于图形化我们可以更好地理解代码.
Pythontutor 地址: https://pythontutor.com/render.html#mode=display
* 支持Python 3.6  2.7 版本.

GIF 2022-11-22 0-51-18

3.2 循环获取输入
设计一个程序, 一直获取用户输入, 要求输入字符信息, 输入任何字符都打印 '输入的指令不对!', 
直到用户输入'q'退出程序.
# 先获取用户输入的字符, 在判断输入字符串是否等于 'q'
while input("请输入执行的代码(按下q退出)>>>:") != 'q':
    print('代码执行完毕!')

print('退出程序成功!')

2022-11-22_01609

2022-11-12_01454

3.3 模拟登录
设计一个程序, 模拟网站登录, 获取账户名称与密码, 都输入正确, 打印'登录成功!', 结束程序.
用户名密码错误提示'账户名或密码错误', 之后再次获取用户的输入对输入进行判断.
三次错误后提示'你的账户名被锁定, 请联系管理员!', 结束程序.
* 1. 先设计主体程序, 获取账户名称与密码, 比对输入的信息.
# 1. 定义账户名称 与 密码(直接使用字符串格式)
username = 'kid'
password = '123'

# 2. 获取用户输入字符串
input_username = input('账户名称>>>:')
input_password = input('账户密码>>>:')

# 3. 判断输入的账户名称 与 密码是否正确
if (input_username == username) and (input_password == password):
    print('登录成功!')

image-20221122011245515

* 2. 添加输入信息不正常三次锁账户.
# 1. 定义账户名称 与 密码(直接使用字符串格式)
username = 'kid'
password = '123'

# 4. 定义一个计数器
error_num = 0

# 5. 循环代码块
while error_num < 3:

    # 2. 获取用户输入字符串
    input_username = input('账户名称>>>:')
    input_password = input('账户密码>>>:')

    # 3. 判断输入的账户名称 与 密码是否正确
    if (input_username == username) and (input_password == password):
        print('登录成功!')
        # 8. 输入信息正确跳出循环(让error_num不小于3即可)
        error_num = 3

    # 6. 输入错误, 计时器+1
    else:
        error_num += 1

        # 7. 三次错误提示账户被锁
        if error_num == 3:
            print('你的账户名被锁定, 请联系管理员!')

2022-11-22_01610

2022-11-12_01455

4. break 关键字

4.1 break 的使用
break 关键字在 while 循环的子代码块内使用, 当程序执行 break , 会立刻跳出本层循环.
# 定义一个变量值为 0
num = 0

# 循环
while True:
    print(num)
    num += 1
    # num 等于 3 执行 if的代码块
    if num == 3:
        # 结束本层循环
        break

print('程序结束')

2022-11-22_01611

2022-11-12_01458

4.2 模拟登录
设计一个程序, 模拟网站登录, 账户密码输入正确, 打印'登入成功!', 结束程序.
fouz提示校验失败信息, 要求再次输入, 直到输入正确才结束程序, 使用break.
* 1. 先设计主体程序, 获取账户名称与密码, 比对输入的信息.
# 1. 定义账户名称 与 密码(字符串类型)
username = 'kid'
password = '123'

# 2. 获取用户输入字符串
input_username = input('账户名称>>>:')
input_password = input('账户密码>>>:')

# 3. 判断输入的账户名称 与 密码是否正确
if (input_username == username) and (input_password == password):
    print('登录成功!')

* 2. 添加循环语句与跳出循环语句
# 1. 定义账户名称 与 密码(字符串类型)
username = 'kid'
password = '123'

# 4. 循环代码块
while True:
    # 2. 获取用户输入字符串
    input_username = input('账户名称>>>:')
    input_password = input('账户密码>>>:')

    # 3. 判断输入的账户名称 与 密码是否正确
    if (input_username == username) and (input_password == password):
        # 3.1 登录成功并结束程序.
        print('登录成功!')
        # 3.2 跳出循环
        break

    # 4. 校验失败提示
    else:
        print('账户名称或密码输入有误, 请重新输入!')
        

2022-11-22_01612

2022-11-12_01460

4.3 while 嵌套
设计一个程序, 模拟网站登录, 先要求输入账户名称, 对账户名称进行校验.
校验失败打印提示信息, 并要求再次输入.

检验成功, 在要求输入账户密码, 对账户密码进行校验, 校验失败打印提示信息, 并要求再次输入.
校验成功, 打印'登录成功!', 并退出程序.
* 1. 先设计主体程序, 获取账户名称与密码, 比对输入的信息.
# 1. 定义账户名称 与 密码(字符串类型)
username = 'kid'
password = '123'

# 2. 获取账户名称
input_username = input('账户名称>>>:')
# 3. 校验账户名称
if input_username == username:
    # 3.1 获取账户密码
    input_password = input('账户密码>>>:')
    # 3.2 校验账户密码
    if input_password == password:
        print('登入成功!')

image-20221122013206202

* 2. 添加账户校验失败与密码校验失败提示
# 1. 定义账户名称 与 密码(字符串类型)
username = 'kid'
password = '123'

# 2. 获取账户名称
input_username = input('账户名称>>>:')
# 3. 校验账户名称
if input_username == username:
    # 3.1 获取账户密码
    input_password = input('账户密码>>>:')
    # 3.2 校验账户密码
    if input_password == password:
        print('登入成功!')

    # 3.3 校验密码失败
    else:
        print('密码输入有误, 请重新输入!')

# 4. 校验账户失败
else:
    print('账户输入有误, 请重新输入!')

第一次运行, 运行工具窗口显示:
账户名称>>>:xxx
账户输入有误, 请重新输入!
--------------------------
第二次运行, 运行工具窗口显示:
账户名称>>>:kid
账户密码>>>:789
密码输入有误, 请重新输入!
* 3. 添加循环语句
# 1. 定义账户名称 与 密码(字符串类型)
username = 'kid'
password = '123'

# 5. 添加循环获取账户名称
while True:
    # 2. 获取账户名称
    input_username = input('账户名称>>>:')

    # 3. 校验账户名称
    if input_username == username:
        # 6. 添加循环获取账户密码
        while True:
            # 3.1 获取账户密码
            input_password = input('账户密码>>>:')
            # 3.2 校验账户密码
            if input_password == password:
                print('登入成功!')
                # 7. 退出循环获取账户密码
                break
            # 3.3 校验密码失败
            else:
                print('密码输入有误, 请重新输入!')
        # 8. 退出循环获账户名称
        break
    # 4. 校验账户失败
    else:
        print('账户输入有误, 请重新输入!')

运行工具窗口显示:
账户名称>>>:(kid)
账户密码>>>:(123)
登入成功!

2022-11-22_01613

2022-11-12_01462

4.4 标志位的使用
程序中嵌套使用多个 while 循环语句, 在退出程序时, 使用 break 语句一层层的退出循环比较复杂.

定义一个变量, 让流程控制语句判断程序是否执行, 这个变量被称为'标志'.
标志值为 True 时程序继续运行, 标志值为 False 时让程序停止运行.
在使用 while 嵌套时, 只需检查标志的当前值是否为 True.

布尔值类型变量命名注意点:
标志位的值一般是布尔值, Python 中定义布尔值的变量名, 一般会在前面加上 'is_'.
能让开发者能够通过变量名知道变量的类型.
不使用break 重新上例程序, 前两步一样.
# 1. 定义账户名称 与 密码(字符串类型)
username = 'kid'
password = '123'

# 5. 定义一个标志位
is_flag = True

# 6. 添加循环获取账户名称(终止循环的条件是 is_flag 不为 True)
while is_flag:
    # 2. 获取账户名称
    input_username = input('账户名称>>>:')
    # 3. 校验账户名称
    if input_username == username:
        # 7. 添加循环获取账户密码(终止循环的条件是 is_flag 不为 True)
        while is_flag:
            # 3.1 获取账户密码
            input_password = input('账户密码>>>:')
            # 3.2 校验账户密码
            if input_password == password:
                print('登入成功!')
                # 8. 修改标志位
                is_flag = False

            # 3.3 校验密码失败
            else:
                print('密码输入有误, 请重新输入!')

    # 4. 校验账户失败
    else:
        print('账户输入有误, 请重新输入!')

运行工具窗口显示:
账户名称>>>:(kid)
账户密码>>>:(123)
登入成功!

2022-11-22_01614

4.5 猜数字游戏
设计一个程序, 定义一个数字, 让用户输入猜的数字, 有三次机会.
猜对了打印'恭喜你猜对了!', 退出程序,
猜大了打印'你输入数字大了!', 
猜小了打印'你输入数字小了!', 
三次机会使用完后询问是否继续玩, 输入'q'退出游戏, 否则继续猜数字游戏.
* 1. 先设计主体程序, 定义一个变量存储需要猜测的值, 在获取输入的字符串, 与其做比较.
# 1. 定义一个变量存储猜测的数字
guess_numbers = 21

# 2. 获取用户输入
input_str = input('输入猜测的数字>>>:')
# 3. 将字符串纯数字转为整型
input_numbers = int(input_str)

# 4. 判断猜测的数字是否正确(猜的数字不比要猜的数字大, 也不不比要猜的数字小, 就是等于!)
if input_numbers > guess_numbers:
    print('你输入数字大了!')
elif input_numbers < guess_numbers:
    print('你输入数字小了!')
else:
    print('恭喜你猜对了!')

第一次运行工具窗口显示:
输入猜测的数字>>>:(15)
你输入数字小了!

第二次运行工具窗口显示:
输入猜测的数字>>>:(24)
你输入数字大了!

第三次运行工具窗口显示:
输入猜测的数字>>>:(21)
恭喜你猜对了!
* 2. 添加循环猜测, 三次猜测限制.
# 1. 定义一个变量存储猜测的数字
guess_numbers = 21

# 5. 定义一个计数器
count = 0

# 6. 循环猜测
while count < 3:

    # 2. 获取用户输入
    input_str = input('输入猜测的数字>>>:')
    # 3. 将字符串纯数字转为整型
    input_numbers = int(input_str)

    # 4. 判断猜测的数字是否正确(猜的数字不比要猜的数字大, 也不不比要猜的数字小, 就是等于!)
    if input_numbers > guess_numbers:
        print('你输入数字大了!')
    elif input_numbers < guess_numbers:
        print('你输入数字小了!')
    else:
        print('恭喜你猜对了!')
        # 7. 退出循环猜测
        break

    # 8. 猜错了计数
    count += 1

运行工具窗口显示:
输入猜测的数字>>>:(1)
你输入数字小了!
输入猜测的数字>>>:(2)
你输入数字小了!
输入猜测的数字>>>:(25)
你输入数字大了!
* 3. 添加 三次机会使用完了询问是否继续玩游戏.
# 1. 定义一个变量存储猜测的数字
guess_numbers = 21

# 5. 定义一个计数器
count = 0

# 6. 循环猜测
while count < 3:

    # 2. 获取用户输入
    input_str = input('输入猜测的数字>>>:')
    # 3. 将字符串纯数字转为整型
    input_numbers = int(input_str)

    # 4. 判断猜测的数字是否正确(猜的数字不比要猜的数字大, 也不不比要猜的数字小, 就是等于!)
    if input_numbers > guess_numbers:
        print('你输入数字大了!')
    elif input_numbers < guess_numbers:
        print('你输入数字小了!')
    else:
        print('恭喜你猜对了!')
        # 7. 退出循环猜测
        break

    # 8. 猜错了计数
    count += 1

    # 9. 三次机会使用完了, 询问是否继续玩游戏
    if count == 3:
        # 10. 清空计数器
        count = 0
        if input('三次机会使用完了, 按下q退出,否则继续! 请输入>>>:') == 'q':
            break

# 11. 程序结束提示
print('程序结束!')

运行工具窗口显示:
输入猜测的数字>>>:(1)
你输入数字小了!
输入猜测的数字>>>:(2)
你输入数字小了!
输入猜测的数字>>>:(2)
你输入数字小了!
三次机会使用完了, 按下q退出,否则继续! 请输入>>>:(5)
输入猜测的数字>>>:(2)
你输入数字小了!
输入猜测的数字>>>:(5)
你输入数字小了!
输入猜测的数字>>>:(6)
你输入数字小了!
三次机会使用完了, 按下q退出,否则继续! 请输入>>>:(q)
程序结束!

2022-11-12_01464

5. continue 关键字

continue 关键字,  while 循环子代码块内使用, 
当程序执行到 continue 时立刻结束本次循环, 回到循环的条件判断.
设计一个程序, 使用 while 循环打印数字 0-9 跳过 4, 需要使用 continuce关 键字.
# 1. 定义变量
x = 0

# 2. 循环打印
while x < 10:
    # 2.1 判断 x的值如果4, 则结束本次循环, 不往后面执行, 回到条件判断处.
    if x == 4:
        # 注意点, 如果x的值不改变就造成死循环了.
        x += 1
        continue

    # 2.2 打印x的值
    print(x)
    # 2.3 x的值自增
    x += 1

2022-11-22_01615

很多情况下可以使用其它方法不执行某次循环, 而不使用continuce 关键字.
# 1. 定义一个变量
x = 0

# 2. 循环打印
while x < 10:
    # 2.1 x的值不为4 打印x的值
    if x != 4:
        print(x)

    # 2.2 x的值自增
    x += 1

运行工具窗口显示:
0
1
2
3
5
6
7
8
9

6. else 从句

while循环还可以增加一个 else 从句, while与 else 缩进相同.
 while 循环正确执行完毕后结束循环之后, 会执行 else 的子代码.
如果,  break 语句中断的循环不执行 else 的子代码.
标准位, continue 结束循环不影响 else 的子代码.
6.1 标志位退出循环
# 1. 定义一个变量
x = 0

# 2. 定义一个标志位
is_out = True

# 3. 循环代码块
while is_out:
    # 3.1 打印x值
    print(x)
    # 3.2 x的值自增
    x += 1
    # 3.3 x的值为3 修改标志位为False
    if x == 3:
        is_out = False

# 4. while的else语句
else:
    print('循环结束了!')

image-20221103010611652

6.2 continue 结束本次循环
# 1. 定义一个变量
x = 0

# 2. 循环代码块
while x < 4:
    # 2.1 x的值为3 跳过本次循环
    if x == 3:
        # 注意点, x的值不自增会进入死循环
        x += 1
        continue
    # 2.2 打印x值
    print(x)
    # 2.3 x的值自增
    x += 1


# 3. while的else语句
else:
    print('循环结束了!')

image-20221103011826491

6.3 break结束本次循环
# 1. 定义一个变量
x = 0

# 2. 循环代码块
while x < 4:
    # 2.1 x的值为3 结束本层循环
    if x == 3:
        break
    # 2.2 打印x值
    print(x)
    # 2.3 x的值自增
    x += 1


# 3. while的else语句
else:
    print('循环结束了!')

2022-11-22_01616

7. while 嵌套

设计一个程序, 模拟登入, 
先获取用户名, 然后校验用户名, 用户名不正确打印'用户名不存在', 继续让用户输入用户名, 
用户名正确, 打印'用户名正确',继续让用户输入密码, 然后校验密码, 
密码不正确打印'密码不正确', 继续让用户输入密码, 密码正确, 打印'登录成功'.
# 1. 循环获取用户名
while True:
    # 2. 校验用户名
    # 2.1获取用户名
    username = input('请输入登入用户>>>: ')

    # 2.2 用户名正确
    if username == 'kid':
        # 2.2.1 打印'用户名正确'
        print('用户名正确!')
        # 2.2.2 循环获取密码
        while True:
            # 2.2.2.1 获取密码
            password = input('请输入用户密码>>>: ')
            # 2.2.2.2 校验密码成功
            if password == '123':
                # 2.2.2.2.1 打印'登录成功'
                print('登录成功!')
                # 2.2.2.2.2 退出循环获取密码
                break

            # 2.2.2.3 校验密码不成功
            else:
                # 2.2.2.3.1 打印'密码不正确'
                print('密码不正确!')
        # 2.2.3 退出循环获取用户名
        break

    # 2.3 用户名不正确
    else:
        # 2.3.1 打印'用户名不存在!
        print('用户名不存在!')

2022-11-23_01632

先写错误的逻辑在写正确的逻辑, 减少代码的层次.
能够保持正确执行逻辑的前提下, 尽量按符合人类思维和阅读习惯编写代码.
* 学习前期不要想要取优化代码, 首先要保证程序能够正确的运行.
# 1. 循环获取用户名
while True:
    # 2. 校验用户名
    # 2.1 获取用户名
    username = input('请输入登入用户>>>: ')

    # 2.2 用户名不正确
    if username != 'kid':
        # 2.2.1 打印'用户名不存在!
        print('用户名不存在!')
        # 2.2.2 返回循环条件判断
        continue

    # 2.3 打印'用户名正确'
    print('用户名正确!')

    # 2.4 循环获取密码
    while True:
        # 2.4.1  获取密码
        password = input('请输入用户密码>>>: ')
        # 2.4.2 校验密码不成功
        if password != '123':
            # 2.4.1 打印'密码不正确'
            print('密码不正确!')
            # 2.4.2返回循环判断处
            continue

        # 2.4.3 打印'登录成功'
        print('登录成功!')
        # 2.4.4 退出循环获取密码
        break

    # 2.5 退出循环获取用户名
    break

2022-11-23_01633

8. 练习

1. 使用while循环输出1 2 3 4 5 6     8 9 10.
2. 1-100的所有数的和.
3. 输出 1-100 内的所有奇数.
4. 输出 1-100 内的所有偶数.
5. 1-2+3-4+5 ... 99的所有数的和.
6. 用户登陆(三次机会重试).
7. 猜年龄游戏
    要求:
    允许用户最多尝试3, 3次都没猜对的话, 就直接退出, 如果猜对了, 打印恭喜信息并退出.

8. 猜年龄游戏升级版
    要求:
    允许用户最多尝试3,
    每尝试3次后, 如果还没猜对, 就问用户是否还想继续玩, 如果回答Y或y, 
    就继续让其猜3, 以此往复, 如果回答N或n, 就退出程序,
    如何猜对了, 就直接退出.

文章的段落全是代码块包裹的, 留言0是为了避免文章提示质量低.
文章的段落全是代码块包裹的, 留言1是为了避免文章提示质量低.
文章的段落全是代码块包裹的, 留言2是为了避免文章提示质量低.
文章的段落全是代码块包裹的, 留言3是为了避免文章提示质量低.
文章的段落全是代码块包裹的, 留言4是为了避免文章提示质量低.
文章的段落全是代码块包裹的, 留言5是为了避免文章提示质量低.
文章的段落全是代码块包裹的, 留言6是为了避免文章提示质量低.
文章的段落全是代码块包裹的, 留言7是为了避免文章提示质量低.
文章的段落全是代码块包裹的, 留言8是为了避免文章提示质量低.
文章的段落全是代码块包裹的, 留言9是为了避免文章提示质量低.


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值