# 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中可以立即结束当前这一次的循环 |