循环语句
导读
大家好,很高兴又和大家见面啦!!!
在上一篇内容中我们介绍了条件语句的相关内容,我们先简单的回顾一下:
在Python中有两种条件语句——if
语句和match……case
语句。其中if
语句是由关键字if、elif、else
引导的特定语句块,而match……case
是在Python 3.10之后新增的一种条件语句,并且match与case并不是Python中的关键字,也就是说我们在没有使用match……case
语法结构时,是可以定义重名的变量的。
在if语句中有三种形式的分支语句:
- 单分支语句——由
if
引导的条件语句,其语法格式为:
if True: # True代表的是语句中的判断语句
pass # pass——空语句,代表的是if语句块中的语句
- 双分支语句——由
if……else
引导的条件语句,其语法格式为:
if True: # if后带有判断语句
pass
else: # else后不带判断语句
pass
- 多分支语句——由
if……elif……else
引导的条件语句,其语法格式为:
if 1:
pass
elif 2: # elif可以存在多个
pass
else:
pass
if条件语句还有两种使用方式:
- if嵌套使用,嵌套格式如下所示:
if True:
if True: # 在if语句的任一分支中都能继续使用if语句
# ……
pass
else:
pass
pass
else:
pass
pass
- 省略else,在两种情况下可以省略else语句:
- 不需要借助
else
语句的判断逻辑,可以省略else,其语法结构如下:
# 双分支或多分支语句中不需要使用else的判断逻辑时可以省略else
if True:
pass
pass # 双分支语句省略else变为单分支语句
if 1:
pass
elif 2:
pass
pass # 三分支语句省略else变为双分支语句
- 在
if、elif
语句中存在转向语句的情况,可以省略else,其语法结构如下:
def ignoreElse():
# 在函数中if、elif分支中存在转向语句return,可以省略else
if True:
return True
return False
while True:
# 在循环语句中,if、elif分支中存在转向语句break、continue,可以省略else
if 1:
continue
elif 2:
break
pass
match……case
语句的用法与C/C 中的开关语句(Switch
语句)的使用方式一致,通过match
作为语句的引导词,case
作为语句中各分支的引导词,其语法格式如下所示:
a = 1
match a 1: # match 引导词后跟一个表达式
case 1: # case 引导词后可以跟常量、变量、函数、通配符等
pass # case 语句块中的内容都是独立的语句块
case 2:
pass
case _: # 通配符_ 可以指代一切内容,相当于default
pass
但是match……case
语句要比Switch
语句的功能强大:
Switch
引导词后只能跟一个整型表达式,而match
引导词后可以跟一个任一类型的表达式Switch
语句中case
引导词后只能跟整型常量表达式,而match
语句中case
引导词后可以跟常量、变量、函数……Switch
语句中case
分支是连通的需要借助break
将分支给独立出来,match
语句中case分支是相互独立的
复习完了Python中的分支语句的内容,下面我们来看一下Python中的第二类控制语句——循环语句,
一、基本概念
循环语句指的是能够重复执行同一件事情的语句,是循环结构的具体体现。
1.1 循环语句的执行流程
循环语句的执行流程如下所示:
在循环语句中循环体中可以是空语句,但是下面三条语句是一个循环语句中必不可少的内容:
- 循环对象语句——在循环语句中参与循环的对象
- 循环判断语句——通过判断语句的值来决定是否进入循环
- 循环递进语句——循环对象通过递进语句逐渐向循环的结束条件靠近
1.2 循环语句的分类
C/C 中有三种循环语句——while
循环语句、for
循环语句以及do……while
循环语句除了这三种循环语句外我们还可以通过goto
语句来实现循环;
但是在Python中,只存在两种形式的循环语句——while
循环语句和for
循环语句。Python中的循环语句与C/C 中所对应的while
循环语句与for
循环语句有相同点也有不同点,接下来我们就分别来看一下这两种语言中的while
语句与for
语句之间的差异;
二、while语句
在C/C 中while语句的语法结构如下所示:
代码语言:javascript复制int i = 1;//循环对象语句
while (i != 100) {
//while——语句引导词
//i != 100——循环判断语句
printf("%dn", i);//循环体语句——循环语句需要执行的具体内容,可以为空语句
i ;//循环递进语句——对象语句根据递进语句逐渐靠近循环的介绍条件
}
在Python中while
语句的语法结构与该结构相似,但还是会有些许区别:
i = 1 # 循环对象语句
while i != 100:
# while——语句引导词
# i != 100——循环判断语句
print(i) # 循环体语句——循环语句中需要执行的具体内容
i = 1 # 循环递进语句——循环对象根据递进语句逐渐靠近循环的介绍条件
while
语句的语法结构在两种语言中唯一的不同在于判断语句的表示,在C/C 中,判断语句会通过圆括号'()'
括起来,但是在Python中,判断语句则是通过冒号':'
来表示判断语句的结束。
需要注意的是,在C/C 中如果递进语句是逐个递进,那我们可以通过前置' '/'--'
或者后置' '/'--'
来完成语句的递进,但是在Python中舍弃了这类操作符,在自增自减的递进语句中,可以通过赋值运算符来实现自增自减的操作。
while
语句是循环语句的最基础的一种语法,语法的使用上也比较简单,这里就不再继续赘述,下面我们继续来看一下for语句在两种语言中的异同点;
三、for语句
在while
语句中,语句的循环对象位于语句的外部,循环递进语句则位于循环体中,它们三者在位置上呈现的是一种上下关系,这样就容易出现一种情况——当循环对象语句与while引导词中间的语句内容过多或者循环体中的语句比较多时,导致循环对象语句、判断语句以及循环递进语句间隔太远。
在这种情况下如果在循环语句中出现问题时,我们想要修改这三者中的其中之一,则会需要花费大量的时间去一一寻找这三条语句。因此如果我们在编写循环语句时,需要尽可能的让这三条语句靠近一些。
在计算机语言中,for
循环语句就很好的弥补了while
语句中的这个问题,下面我们先来看一下C/C 中的for语句的语法结构,如下所示:
for (int i = 1; i != 100; i ) {
printf("%dn", i);
}
可以看到,在C/C 的for
语句中,循环对象语句、循环判断语句、循环递进语句都位于引导词for
后面的圆括号内'()'
,这样就能在我们需要修改这三者中的任一一条语句时,就能通过循环语句引导词for
很轻松的找到这三条语句。
在Python中,for语句的语法结构与C/C 的for语句的语法结构有很大的不同,如下所示:
代码语言:javascript复制for i in range(1, 101):
print(i)
# i——循环对象
# in——成员运算符
# range()——可迭代对象,也可以是字符串、元组、列表……
在Python中,for循环语句的判断语句与递进语句都被整合到了可迭代对象中。可迭代对象指的是一种特殊的变量~内部包含了很多其他的值。循环体在执行时,可以通过成员运算符'in'
将可迭代对象中的值一个一个的取出来并存放在循环对象变量中。
这里展示的可迭代对象range()
,是一个可以依次获取参数区间内整数的内建函数,该函数的区间为前闭后开区间,也就是说对于区间1~101
我们通过成员运算符'in'
可以从函数中获取到的内容为1~100
的所有整数。
在循环语句中我们还可以通过转向语句来控制循环体语句的执行逻辑,在C/C 中循环体中的转向语句有两种——break
与continue
,在Python中,这两种转向语句同样适用,下面我们就来看一下Python中的break
与continue
的用法
四、break与continue
在循环语句中,break
可以用来立即结束循环并跳出循环,continue可以用来立即结束当前循环开始进入下一次循环,具体用法如下所示:
从测试中可以看到,通过for循环语句我们完成了从1到100 的打印,当在循环中加入break
与continue
之后,循环的执行逻辑发生了变化:
- 在
i == 10
时,第一个if语句能够正常执行,也就是说此时循环体中执行的是转向与continue
,可以看到continue
后的print
语句并没有执行,而是直接进入了下一次循环打印i == 11
; - 在
i == 20
时,在完成打印后,第二个if语句能够正常执行,也就是说此时循环体中执行的是转向语句break
,可以看到在执行完break
后,循环并未继续执行,而是执行了循环外的print
语句;
这个例子很好的说明了这两个转向语句在循环中的用法:
continue
——用于结束当前循环,continue后的语句不再执行,程序立即进入下一次循环break
——用于结束循环,程序直接跳出循环,执行循环外的语句
五、死循环
死循环也就是无线循环——循环无法停止,会一直运行。当我们在写程序时,最怕的就是遇到死循环,会导致死循环的原因主要有以下几点:
- 判断语句的值永远为真
- 缺少递进语句导致判断语句恒成立
- 递进语句的递进方向错误,导致循环对象逐渐远离循环的结束条件
下面我们通过一个最简单的死循环来认识什么是死循环:
可以看到此时程序已经运行到了i==1622878
任然未停止运行,之所以无法停止,正是因为在该循环中判断条件一直成立,且循环体内没有转向语句break
来结束循环,因此循环进入了死循环。
那是不是说所有的死循环都是不合理的呢?
实际上并不是这样,比如一款游戏的运行,当我们在结束一句游戏后,如果游戏就直接退出了,那我们想要开启下一句游戏,只能够重新启动该游戏,显然这种设计是不合理的,因此我们就可以设置死循环,并通过转向语句来控制循环的结局,如下所示:
可以看到,同样的代码,当我们在循环体中添加了转向语句后循环变不再是死循环了。
设想一下,如果我们是将条件语句的判断条件改为输入某个值,或者检测键盘按下了某个按键,或者鼠标点击了某个按键,才会执行转向语句,这样我们是不是就能够保证即使一局游戏结束后,不会第一时间退出程序,而是会继续运行了。
因此合理的利用死循环和转向语句,能够帮助我们实现更多的操作。
六、循环中的else语句
在Python中对于循环语句而言,新增了一个语法——else语句:
- while……else语句
- for……else语句
这种语法就是在双分支语句的基础上将if语句替换成了循环语句,如下所示:
看到这里,有朋友就会好奇了,这跟不加else有什么区别?不一样的都是在不满足循环条件时运行循环体外的语句吗?
如果我们只是看这个测试代码,确实,循环语句后加一个else语句与不加else语句并无区别,但是当我们在循环体中加入了转向语句后,我们就能知道他们的区别在哪里了,如下所示:
从测试结果中大家应该能够明白在循环语句后加了else
语句与不加else
语句的区别了。
循环……else
语句就像双分支条件语句一样,它们是一个整体,对于转向语句break
与continue
而言,它们的作用是用来结束循环语句,因此,当循环体中出现转向语句时,会直接结束整个循环,包括else语句。
下面我们通过一个例子来说明该语法的运用场景:
可以看到实现同样功能的代码,第一次加了else,第二次没有加else,但是输出的结果却不相同,第二次比第一次多输出了一行信息。
导致这种错误的原因是因为对于该功能而言,我们在实际的运行中只会尝试两种结果——是质数与不是质数,也就是说这两种判断结果我们只需要输出其中之一。
- 当我们通过
else
语句来控制时,能完美的实现二者输出其一的操作; - 但是当我们不加
else
时,第二个print语句属于第一层循环的循环体中的内容,因此第二层循环的循环体中的break语句无法对其生效,所以会导致进行重复输出的情况。
也就是说这种语法结构比较适合需要根据判断条件进行不同输出的结果,并且其中一种判断条件需要通过循环来实现。
七、range()
函数
range()函数作为Python中的内置函数,它的作用是生成一组数字序列,并将其以可迭代的对象进行返回,其返回值的类型为对象类型。该函数语法如下所示:
代码语言:javascript复制range(stop)
range(start, stop[, step])
函数中的参数的含义依次为:
- start: 计数从 start 开始。默认是从 0 开始。例如 range(5) 等价于 range(0, 5)
- stop: 计数到 stop 结束,但不包括 stop。例如:range(0, 5) 是 [0, 1, 2, 3, 4] 没有 5
- step:步长,默认为 1。例如:range(0, 5) 等价于 range(0, 5, 1)
这里我们需要了解的是函数的第三个参数——步长(step
)。
所谓的步长,我们可以理解为对象语句递进的方式,函数默认的步长为1,其对象语句会依次增加1,当步长为n时,其对象语句依次增加n,如下所示:
下面我们来简单总结一下range函数的用法:
- range函数可以用于生成一组数字序列,并将其作为可迭代对象返回,返回值的类型为对象类型;
- range中的三个参数分别是序列开始值、序列结束值以及序列步长;
- 开始值默认为0,序列步长默认为1
- 当步长为负数时,传入的序列开始值需要大于结束值
结语
今天的内容到这里就全部结束了,在下一篇内容中我们将介绍《Python中的函数》,大家记得关注哦!如果大家喜欢博主的内容,可以点赞、收藏加评论支持一下博主,当然也可以将博主的内容转发给你身边需要的朋友。最后感谢各位朋友的支持,咱们下一篇再见!!!