python3xiaobaike_2020/chapter4/4-2 python3小白课:while循环结构.md
2025-04-20 23:22:14 +08:00

161 lines
7.6 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# python3小白课while循环结构
### 循环结构
除了分支结构,我们的流程控制里面还有一个大类,叫做循环结构,它是我们的程序能帮我们省去很多人力的关键。顾名思义,循环结构的作用就是能让某一段代码执行体能够反复的执行我们规定的次数,同时在执行的过程中还能有一些自己智能的选择。
我们来举个例子:
比如我们都知道重要的事情说三次那么我们需要实现一个功能就是设定一句话只需要设定一次然后就会自动说三次。如果我们打印三行相同的print代码也是可以实现的。但如果我们说重要的事情说10遍、100遍呢这样敲代码我们是要累死的。这时候我们就可以用上循环结构了只需要写一行print代码就可以实现指定次数的反复执行。
我们再来举一个例子:
比如有一个饮料自动贩售机里面有雪碧、芬达、可乐、矿泉水四种饮品。每种饮品我们假定有5瓶所以总共有20瓶。现在我们就来贩售饮料它的过程是小白同学会按下需要什么饮料然后扫码支付对应的金额对吧然后饮料就从贩售机下方吐出来了。这就是一个完整的售卖饮料的过程完成之后又会陷入等待下一位消费者购买的循环而下一位购买者也是这样的操作步骤只不过有可能买的不是同一种饮料罢了。
像这样的过程,我们就完全可以使用循环结构来智能地实现。
---
### while循环的语句结构
while循环的一般语句结构为
```python
while 条件:
执行体
```
它是以while来作为关键字的如果条件返回True则会循环执行循环体的代码。执行完毕后会再次判断条件是否为True如果为False了就会结束循环否则再次执行循环体代码。
> [!question]
>
> 有的同学会问,那什么时候是个头呢?
我们可以看到当上述结构中的条件部分返回True时就会执行循环体的代码。如果它一直返回为True那么这个循环称作死循环死循环结构在某些业务场景下也可能会写也是允许的比如循环监控、循环等待下一步指令等等。
但当我们只是打算循环指定的次数或者满足某些条件退出的时候,我们在写循环结构的时候,就应该注意从`条件`这块下功夫当执行完执行体条件改变之后是可以退出循环的。所以比如我们打算实现前面的重要的话只说3遍的效果我们可以这样写。
```python
# coding:utf-8
a = "我是小白,我很白,重要的话说三遍"
i = 0
while i < 3:
print(a)
i += 1
```
如代码所示,我们一般会设定一个循环变量,很多编程语言中都喜欢用`i`来做循环变量当然你也可以用别的名字。设定初始值为0条件设置为`i < 3`每次执行完循环的执行体关键代码之后将这个循环变量自增1。可以预见的是`i`的值在循环内部会分别为`0, 1, 2`当它变为3的时候判断`i < 3`就不成立并返回False了循环就会自动退出了而代码正好循环了三次。
这就是我们在使用while循环时的一种通用的重复一定次数的做法。希望大家掌握它的使用。
---
### 使用while循环遍历列表或元组
使用while循环的另一种场景是遍历列表或者元组的元素我们以列表为例子看下怎么写
```python
# coding:utf-8
a = [1, 2, 3, 4, 5]
i = 0
while i < len(a):
print(a[i]) # 可以将循环变量i作为索引访问列表成员
i += 1
```
结合len函数还有索引访问列表成员我们就轻松实现了列表的遍历。
---
### while编写死循环以及break语句
我们在某些业务场景下需要使用while死循环的我们可以写一个永远为True的表达式可以写`while True:`或者`while 1==1:`都行。我们看个例子:
```python
# coding:utf-8
while True:
print("我是死循环,永远不会结束")
```
> [!danger]
>
> 但如果你吃饱了没事儿,还是不要随便乱写,要根据自己的业务需要来编写。
如果我们编写了死循环,就永远也无法出来了吗?还是有办法的,我们可以使用`break`语句来实现退出当前层级的循环注意是当前层级比如我们在while循环里面又嵌套了一个while循环这是两层嵌套这时候最内层的while循环碰到了`break`语句只能退出最内层循环但还得在最外层循环中根据条件来判断是否继续循环运行。if结构不是循环结构使用break无效
我们看个例子:
```python
# coding:utf-8
i = 0
while True:
print("我是死循环,但有时候还是会无奈地结束")
i += 1
if i >= 10:
break
```
这也是一个while结构跟if结构嵌套写的例子大家注意看一下里面的缩进关系编写python时缩进关系一定要注意好。这里会每次判断i的值最后的效果是这句话只打印了10次循环就退出了这就是因为遇到了`break`语句的原因。
掌握了前面的知识,我们可以试着来写自动贩售机的源码了。大家也可以不看我写的代码,自己尝试先写一下,看能否用我们已经学过的知识写出来?
自动贩售机代码参考(我们也用上一点新知识,跟大家一同讲解提高):
```python
# coding:utf-8
# 自动贩售机源码参考
# 我们有雪碧、芬达、可乐、矿泉水四种饮品每种饮品我们假定有5瓶
# 通过input语句获取用户需要什么饮品可以用序号替代买完后库存要减少
# 当需要的饮品卖完之后,会智能的弹出提示提示用户卖完了请买别的
# 定义饮品字典通过数字序号作为key方便后续获取值
drinks = {
1: ["雪碧", 5],
2: ["芬达", 5],
3: ["可乐", 5],
4: ["矿泉水", 5]
}
while True:
# 这里用了多行文本,多行文本内如果使用了缩进,输出时也会保留缩进,所以我们不缩进
question = f"""
你想喝什么呢?
===================
1. 雪碧(剩余{drinks[1][1]}瓶)
2. 芬达(剩余{drinks[2][1]}瓶)
3. 可乐(剩余{drinks[3][1]}瓶)
4. 矿泉水(剩余{drinks[4][1]}瓶)
请输入你想喝的饮品序号并回车:
"""
answer = input(question)
# 字符串的isdigit方法会检查字符串是否均为数字若是返回True
if not(answer.isdigit()):
print("\t\t\t>>> 请输入饮品序号!您的输入无法识别!")
# continue可以立即结束本次循环但还会进入下一次循环
continue
answer = int(answer)
if answer in range(1, 5):
print("\t\t\t>>> 您选择的饮料是:%s" % drinks[answer][0])
if drinks[answer][1] > 0:
drinks[answer][1] -= 1
print("\t\t\t>>> 您要的饮料已弹出!")
else:
print("\t\t\t>>> 您要的饮料库存已不足!请重新选择!")
else:
print("\t\t\t>>> 啊哦,您要的饮料货架上没有,再看看吧!")
```
### 单词释义
| 单词 | 释义 |
| -------- | ------------------------------------------ |
| while | 当...的时候 |
| break | 弄坏,弄破,这里是退出当前循环体的语句 |
| drinks | drink饮品的复数形式 |
| question | 问题 |
| answer | 答案,回答 |
| isdigit | is是digit数字判断是否都为数字的命令 |
| continue | 继续python中可以立即结束当前这一次的循环 |