【Python】Python中的循环语句

news2024/11/16 19:31:58

循环语句

  • 导读
  • 一、基本概念
    • 1.1 循环语句的执行流程
    • 1.2 循环语句的分类
  • 二、while语句
  • 三、for语句
  • 四、break与continue
  • 五、死循环
  • 六、循环中的else语句
  • 七、`range()`函数
  • 结语

封面

导读

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

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

在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. 双分支语句——由if……else引导的条件语句,其语法格式为:
if True:  # if后带有判断语句
    pass
else:  # else后不带判断语句
    pass
  1. 多分支语句——由if……elif……else引导的条件语句,其语法格式为:
if 1:
    pass
elif 2:  # elif可以存在多个
    pass
else:
    pass

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

  1. if嵌套使用,嵌套格式如下所示:
if True: 
    if True:  # 在if语句的任一分支中都能继续使用if语句
        # ……
        pass
    else:
        pass
    pass
else:
    pass
pass

  1. 省略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语句的功能强大:

  1. Switch引导词后只能跟一个整型表达式,而match引导词后可以跟一个任一类型的表达式
  2. Switch语句中case引导词后只能跟整型常量表达式,而match语句中case引导词后可以跟常量、变量、函数……
  3. 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语句的语法结构如下所示:

	int i = 1;//循环对象语句
	while (i != 100) {
		//while——语句引导词
		//i != 100——循环判断语句
		printf("%d\n", 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("%d\n", i);
	}

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

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

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

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

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

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

四、break与continue

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

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

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

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

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

五、死循环

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

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

下面我们通过一个最简单的死循环来认识什么是死循环:
死循环
可以看到此时程序已经运行到了i==1622878任然未停止运行,之所以无法停止,正是因为在该循环中判断条件一直成立,且循环体内没有转向语句break来结束循环,因此循环进入了死循环。

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

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

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

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

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

六、循环中的else语句

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

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

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

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

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

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

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

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

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

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

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

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

七、range()函数

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

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

结语

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1983997.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

《Advanced RAG》-04-深度研究RAG技术Re-ranking

摘要 文章首先介绍了重新排序在RAG中的重要性,它允许对检索到的文档进行重新排序和过滤,以确保最相关的文档能够被优先考虑,从而提高RAG的效率和准确性。 接着,文章详细描述了两种主流的重新排序方法: 一种是使用重新排…

使用Jetbrains.Rider反编译Unity的DLL文件看源码

直接将dll文件的打开方式用Rider打开即可,打开BattleSeqGenertor.dll文件的效果如下:

Redis 的6种回收策略(淘汰策略)详解

Redis 的6种回收策略(淘汰策略)详解 1、Redis的六种淘汰策略1. volatile-lru2. volatile-ttl3. volatile-random4. allkeys-lru5. allkeys-random6. no-eviction 2、使用策略规则 💖The Begin💖点点关注,收藏不迷路&am…

MyIP:强大且简单好用!

在这个数字化的时代,IP地址就像是我们的网络身份证。各位在日常的工作中,肯定会会遇到需要和 IP 地址相关的需求。 今天和大家聊一聊一个非常好用的开源 IP 工具项目 - MyIP。 简介 MyIP一个开源IP工具箱,提供了一系列的网络检测工具&…

适合双11入手的蓝牙耳机推荐?4款开放式耳机测评

2024年也确实快到大家购物疯狂买买买的双11日子了,我相信肯定也有人在购物车攒了一大堆商品就等着双11清空了。那肯定现在还有人在为双11的购物车放什么东西发愁吧,那对于我来说,双11的购物车应该也是要有蓝牙耳机的一席之地的。 因为毕竟在…

Python酷库之旅-第三方库Pandas(068)

目录 一、用法精讲 271、pandas.Series.dt.dayofyear属性 271-1、语法 271-2、参数 271-3、功能 271-4、返回值 271-5、说明 271-6、用法 271-6-1、数据准备 271-6-2、代码示例 271-6-3、结果输出 272、pandas.Series.dt.days_in_month属性 272-1、语法 272-2、参…

吴恩达老师机器学习作业-ex7(聚类)

导入库,读取数据,查看数据类型等进行分析,可视化数据 import matplotlib.pyplot as plt import numpy as np import scipy.io as sio#读取数据 path "./ex7data2.mat" data sio.loadmat(path) # print(type(data)) # print(data…

【LabVIEW学习篇 - 13】:队列

文章目录 队列 队列 队列通常情况下是一种先入先出(FIFO:First in First out)的数据结构,常用作数据缓存,通过队列结构可以保证数据有序的传递,避免竞争和冲突。 案例:利用队列,模…

WordPress--漏洞复现

1.搭建好环境进入后台登录界面登录管理员 2.进入后选择外观---编辑 3.将文件内容改为我们的一句话木马,点击更新文件 4.访问这个文件显示出phpinfo证明注入成功

PXE技术在操作系统批量安装中的应用与实现

PXE(Preboot Execution Environment)即预启动执行环境,它是一种可以使计算机通过网络启动的技术。 一、工作原理 客户端请求: 当支持 PXE 的计算机启动时,其网卡的固件会广播一个请求,寻找网络中的 PXE 服…

JavaScript Web API入门day2

目录 1.DOM事件基础 1.1 事件监听 1.2 事件监听案例 1.2.1 京东点击关闭顶部广告 1.2.2 随机点名案例 1.3 事件监听版本 2. 事件类型 2.1 事件类型案例 2.1.1 轮播图点击切换 2.1.2 评论字数统计 3.事件对象 3.1 获取事件对象 3.2 事件对象常用属性 3.3 事件对象…

【技术前沿】3.3KW高功率密度新突破!基于Infineon XMC1400搭配CoolSiC™ Mosfet 的PFC数字电源方案

随着社会经济发展、能源结构变革,近几年全球对家用储能系统的需求量一直保持相当程度的增长。2023年,全球家用储能系统市场销售额达到了87.4亿美元,预计2029年将达到498.6亿美元,年复合增长率(CAGR)为33.68…

定时任务-xxl-job

一. 为什么定时任务可以定时执行 定时任务可以定时执行的原理是通过操作系统提供的定时器实现的。 以下是定时任务能够准时执行的基本原理和相关技术: 操作系统的调度器: 操作系统(如Linux、Windows等)内部都有一个调度器&#x…

TortoiseGit小乌龟在gitlab配置ssh免密

1. 生成ssh密钥(默认在~/.ssh路径生产,id_rsa和id_rsa.pub) ssh-keygen -t rsa -b 4096 -C "xxxqq.com"2. 打开gitlab,在搜索栏搜索ssh,找到SSH Keys,然后添加id_rsa.pub公钥的内容到网页,保存。 3. 打开To…

如何将PostgreSQL的数据实时迁移到SelectDB?

PostgreSQL 作为一个开源且功能强大的关系型数据库管理系统,在 OLTP 系统中得到了广泛应用。很多企业利用其卓越的性能和灵活的架构,应对高并发事务、快速响应等需求。 然而对于 OLAP 场景,PostgreSQL 可能并不是最佳选择。 为了实现庞大规…

数据结构(其三)--栈与队列

目录 5.栈 5.1 栈的基本操作 5.2 各种栈 (1).顺序栈 i.普通顺序栈 ii.共享栈 iii.关于销毁 (2).链栈 6.队列 6.1 队列的基本操作 6.2 各种队列 (1).循环队列 i.代码 ii.另外一种写法 &#xff08…

[Latex美化]-表格加底色,添加灰色美化表格,便于阅读

1 导入库 \usepackage{xcolor} \usepackage{colortbl, booktabs} 2 插入指令(指定行前) \rowcolor{gray!30} 具体代码如下 效果如下

循环神经网络RNN介绍

文章目录 1、学习介绍2、RNN的基本结构2.1、图例2.2、公式2.3、公式计算示例2.3.1、给定参数2.3.2、时间步计算 3、序列依赖与梯度消失/爆炸3.1、序列依赖3.2、梯度消失与爆炸3.3、总结 4、传统的前馈神经网络4.1、结构4.2、工作原理4.3、特点4.4、局限性 5、CNN与RNN的关系5.1…

【建造者模式】全面解析与最佳实践:打造复杂对象的蓝图(构建复杂对象的艺术)

文章目录 Java中的建造者模式:全面解析与最佳实践1. 引言2. 建造者模式概念定义与用途适用场景解决的问题 3. 建造者模式原理主要角色解释工作流程UML图和时序图 4. 建造者模式在Java中的实现逐步构建示例程序1. 创建抽象建造者类2. 实现具体建造者类3. 设计产品类4…

如何在厂商软件不提供二次开发资源的情况下实现LabVIEW开发

在遇到厂商提供的软件不支持二次开发资源时,如果需要使用LabVIEW进行开发,通常面临以下几个挑战:设备通讯接口封闭、协议不公开、厂商技术支持有限等。这些问题需要综合考虑并制定解决方案,以下是详细的分析: 1. 了解原…