循环语句

【Python】Python中的循环语句_if语句

导读

大家好,很高兴又和大家见面啦!!!

在上一篇内容中我们介绍了条件语句的相关内容,我们先简单的回顾一下:

在Python中有两种条件语句——if语句和match……case语句。其中if语句是由关键字if、elif、else引导的特定语句块,而match……case是在Python 3.10之后新增的一种条件语句,并且match与case并不是Python中的关键字,也就是说我们在没有使用match……case语法结构时,是可以定义重名的变量的。

在if语句中有三种形式的分支语句:

  1. 单分支语句——由if引导的条件语句,其语法格式为:
if True:  # True代表的是语句中的判断语句
    pass  # pass——空语句,代表的是if语句块中的语句
  • 1.
  • 2.
  1. 双分支语句——由if……else引导的条件语句,其语法格式为:
if True:  # if后带有判断语句
    pass
else:  # else后不带判断语句
    pass
  • 1.
  • 2.
  • 3.
  • 4.
  1. 多分支语句——由if……elif……else引导的条件语句,其语法格式为:
if 1:
    pass
elif 2:  # elif可以存在多个
    pass
else:
    pass
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.

if条件语句还有两种使用方式:

  1. if嵌套使用,嵌套格式如下所示:
if True: 
    if True:  # 在if语句的任一分支中都能继续使用if语句
        # ……
        pass
    else:
        pass
    pass
else:
    pass
pass
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  1. 省略else,在两种情况下可以省略else语句:
  • 不需要借助else语句的判断逻辑,可以省略else,其语法结构如下:
# 双分支或多分支语句中不需要使用else的判断逻辑时可以省略else
if True:
    pass
pass  # 双分支语句省略else变为单分支语句

if 1:
    pass
elif 2:
    pass
pass  # 三分支语句省略else变为双分支语句
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 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
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.

match……case语句的用法与C/C++中的开关语句(Switch语句)的使用方式一致,通过match作为语句的引导词,case作为语句中各分支的引导词,其语法格式如下所示:

a = 1
match a + 1:  # match 引导词后跟一个表达式
    case 1:  # case 引导词后可以跟常量、变量、函数、通配符等
        pass  # case 语句块中的内容都是独立的语句块
    case 2:
        pass
    case _:  # 通配符_ 可以指代一切内容,相当于default
        pass
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.

但是match……case语句要比Switch语句的功能强大:

  1. Switch引导词后只能跟一个整型表达式,而match引导词后可以跟一个任一类型的表达式
  2. Switch语句中case引导词后只能跟整型常量表达式,而match语句中case引导词后可以跟常量、变量、函数……
  3. Switch语句中case分支是连通的需要借助break将分支给独立出来,match语句中case分支是相互独立的

复习完了Python中的分支语句的内容,下面我们来看一下Python中的第二类控制语句——循环语句,

一、基本概念

循环语句指的是能够重复执行同一件事情的语句,是循环结构的具体体现。

1.1 循环语句的执行流程

循环语句的执行流程如下所示:

【Python】Python中的循环语句_循环语句_02

在循环语句中循环体中可以是空语句,但是下面三条语句是一个循环语句中必不可少的内容:

  • 循环对象语句——在循环语句中参与循环的对象
  • 循环判断语句——通过判断语句的值来决定是否进入循环
  • 循环递进语句——循环对象通过递进语句逐渐向循环的结束条件靠近

1.2 循环语句的分类

C/C++中有三种循环语句——while循环语句、for循环语句以及do……while循环语句除了这三种循环语句外我们还可以通过goto语句来实现循环;

但是在Python中,只存在两种形式的循环语句——while循环语句和for循环语句。Python中的循环语句与C/C++中所对应的while循环语句与for循环语句有相同点也有不同点,接下来我们就分别来看一下这两种语言中的while语句与for语句之间的差异;

二、while语句

在C/C++中while语句的语法结构如下所示:

int i = 1;//循环对象语句
	while (i != 100) {
		//while——语句引导词
		//i != 100——循环判断语句
		printf("%d\n", i);//循环体语句——循环语句需要执行的具体内容,可以为空语句
		i++;//循环递进语句——对象语句根据递进语句逐渐靠近循环的介绍条件
	}
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.

在Python中while语句的语法结构与该结构相似,但还是会有些许区别:

i = 1  # 循环对象语句
while i != 100:
    # while——语句引导词
    # i != 100——循环判断语句
    print(i)  # 循环体语句——循环语句中需要执行的具体内容
    i += 1  # 循环递进语句——循环对象根据递进语句逐渐靠近循环的介绍条件
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.

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("%d\n", i);
	}
  • 1.
  • 2.
  • 3.

可以看到,在C/C++的for语句中,循环对象语句、循环判断语句、循环递进语句都位于引导词for后面的圆括号内'()',这样就能在我们需要修改这三者中的任一一条语句时,就能通过循环语句引导词for很轻松的找到这三条语句。

在Python中,for语句的语法结构与C/C++的for语句的语法结构有很大的不同,如下所示:

for i in range(1, 101):
    print(i)
# i——循环对象
# in——成员运算符
# range()——可迭代对象,也可以是字符串、元组、列表……
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.

在Python中,for循环语句的判断语句与递进语句都被整合到了可迭代对象中。可迭代对象指的是一种特殊的变量~内部包含了很多其他的值。循环体在执行时,可以通过成员运算符'in'将可迭代对象中的值一个一个的取出来并存放在循环对象变量中。

这里展示的可迭代对象range(),是一个可以依次获取参数区间内整数的内建函数,该函数的区间为前闭后开区间,也就是说对于区间1~101我们通过成员运算符'in'可以从函数中获取到的内容为1~100的所有整数。

在循环语句中我们还可以通过转向语句来控制循环体语句的执行逻辑,在C/C++中循环体中的转向语句有两种——breakcontinue,在Python中,这两种转向语句同样适用,下面我们就来看一下Python中的breakcontinue的用法

四、break与continue

在循环语句中,break可以用来立即结束循环并跳出循环,continue可以用来立即结束当前循环开始进入下一次循环,具体用法如下所示:

【Python】Python中的循环语句_if语句_03

从测试中可以看到,通过for循环语句我们完成了从1到100 的打印,当在循环中加入breakcontinue之后,循环的执行逻辑发生了变化:

  • i == 10 时,第一个if语句能够正常执行,也就是说此时循环体中执行的是转向与continue,可以看到continue后的print语句并没有执行,而是直接进入了下一次循环打印i == 11
  • i == 20 时,在完成打印后,第二个if语句能够正常执行,也就是说此时循环体中执行的是转向语句break,可以看到在执行完break后,循环并未继续执行,而是执行了循环外的print语句;

这个例子很好的说明了这两个转向语句在循环中的用法:

  • continue——用于结束当前循环,continue后的语句不再执行,程序立即进入下一次循环
  • break——用于结束循环,程序直接跳出循环,执行循环外的语句

五、死循环

死循环也就是无线循环——循环无法停止,会一直运行。当我们在写程序时,最怕的就是遇到死循环,会导致死循环的原因主要有以下几点:

  1. 判断语句的值永远为真
  2. 缺少递进语句导致判断语句恒成立
  3. 递进语句的递进方向错误,导致循环对象逐渐远离循环的结束条件

下面我们通过一个最简单的死循环来认识什么是死循环:

【Python】Python中的循环语句_循环语句_04

可以看到此时程序已经运行到了i==1622878任然未停止运行,之所以无法停止,正是因为在该循环中判断条件一直成立,且循环体内没有转向语句break来结束循环,因此循环进入了死循环。

那是不是说所有的死循环都是不合理的呢?

实际上并不是这样,比如一款游戏的运行,当我们在结束一句游戏后,如果游戏就直接退出了,那我们想要开启下一句游戏,只能够重新启动该游戏,显然这种设计是不合理的,因此我们就可以设置死循环,并通过转向语句来控制循环的结局,如下所示:

【Python】Python中的循环语句_循环语句_05

可以看到,同样的代码,当我们在循环体中添加了转向语句后循环变不再是死循环了。

设想一下,如果我们是将条件语句的判断条件改为输入某个值,或者检测键盘按下了某个按键,或者鼠标点击了某个按键,才会执行转向语句,这样我们是不是就能够保证即使一局游戏结束后,不会第一时间退出程序,而是会继续运行了。

因此合理的利用死循环和转向语句,能够帮助我们实现更多的操作。

六、循环中的else语句

在Python中对于循环语句而言,新增了一个语法——else语句:

  • while……else语句
  • for……else语句

这种语法就是在双分支语句的基础上将if语句替换成了循环语句,如下所示:

【Python】Python中的循环语句_if语句_06

看到这里,有朋友就会好奇了,这跟不加else有什么区别?不一样的都是在不满足循环条件时运行循环体外的语句吗?

如果我们只是看这个测试代码,确实,循环语句后加一个else语句与不加else语句并无区别,但是当我们在循环体中加入了转向语句后,我们就能知道他们的区别在哪里了,如下所示:

【Python】Python中的循环语句_循环语句_07

从测试结果中大家应该能够明白在循环语句后加了else语句与不加else语句的区别了。

循环……else语句就像双分支条件语句一样,它们是一个整体,对于转向语句breakcontinue而言,它们的作用是用来结束循环语句,因此,当循环体中出现转向语句时,会直接结束整个循环,包括else语句。

下面我们通过一个例子来说明该语法的运用场景:

【Python】Python中的循环语句_if语句_08

可以看到实现同样功能的代码,第一次加了else,第二次没有加else,但是输出的结果却不相同,第二次比第一次多输出了一行信息。

导致这种错误的原因是因为对于该功能而言,我们在实际的运行中只会尝试两种结果——是质数与不是质数,也就是说这两种判断结果我们只需要输出其中之一。

  • 当我们通过else语句来控制时,能完美的实现二者输出其一的操作;
  • 但是当我们不加else时,第二个print语句属于第一层循环的循环体中的内容,因此第二层循环的循环体中的break语句无法对其生效,所以会导致进行重复输出的情况。

也就是说这种语法结构比较适合需要根据判断条件进行不同输出的结果,并且其中一种判断条件需要通过循环来实现。

七、range()函数

range()函数作为Python中的内置函数,它的作用是生成一组数字序列,并将其以可迭代的对象进行返回,其返回值的类型为对象类型。该函数语法如下所示:

range(stop)
range(start, stop[, step])
  • 1.
  • 2.

函数中的参数的含义依次为:

  • 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,如下所示:

【Python】Python中的循环语句_循环语句_09

下面我们来简单总结一下range函数的用法:

  • range函数可以用于生成一组数字序列,并将其作为可迭代对象返回,返回值的类型为对象类型;
  • range中的三个参数分别是序列开始值、序列结束值以及序列步长;
  • 开始值默认为0,序列步长默认为1
  • 当步长为负数时,传入的序列开始值需要大于结束值

结语

今天的内容到这里就全部结束了,在下一篇内容中我们将介绍《Python中的函数》,大家记得关注哦!如果大家喜欢博主的内容,可以点赞、收藏加评论支持一下博主,当然也可以将博主的内容转发给你身边需要的朋友。最后感谢各位朋友的支持,咱们下一篇再见!!!