循环语句
介绍— “真正的平静,不是避开车马喧嚣,而是在心中修篱种菊”
循环语句是 Python 中一种重要的控制结构,它的作用是 让程序重复执行某段代码,直到满足特定的条件才会结束 ,这可以使程序能够有效地处理重复性任务和大量数据。
如果我希望计算从 1 一直加到 20 的最终结果,但是从 1 一直手写到 20 那肯定非常麻烦;又或者我想对一个列表中的里面的每一个元素都做相同的处理,对每个元素都写同样的代码效率又太低;又或者我希望通过程序反复获取用户的输入内容,但是又不可能用户每输入一次就再重新运行一遍程序。所以上面这些示例都需要用到循环语句来实现。
由循环语句控制的代码执行的顺序叫做 循环结构,在循环结构中,程序会根据条件的真假不断重复对应的代码块,直到不满足条件跳出循环。
在 Python 中循环语句共分为两种,一种是 条件循环 ,一种是 计数循环,让我们在下面的教程中深入学习。
条件循环
条件循环的关键词是 while ,也叫做 while 循环 ,它会允许程序根据指定的条件来判断是否重复执行一段代码,程序会一直循环到不再满足条件为止。来看下示意图:
在 Python 中 while 循环的结构如下:
while
<表达式>:# 内部代码块
# 如果表达式结果为 True 那么会不断重复运行内部代码块
同样可以在 while 语句后新增 else 语句,在表达式的结果为 False 时,进入到 else 语句下面的代码块,不过一般 else 都会被省略,语法结构如下:
while
<表达式>:# 内部代码块
# 如果表达式结果为 True 会不断重复运行内部代码块,如果结果为 False,进入 else语句
else
:# 代码块
【示例】来看一个计算 1 到 50 的总和的例子:
# 创建一个初始化变量,count 是总和,number 是每次要递增的数字
0
0
# 每次循环都对 number 变量值 +1 ,并将 +1 后的结果加给 count 变量
while
number < 50
:1
# 输出结果
print
('总和是 :'
, count)运行代码结果如下,此时输出的结果就是 1 到 50 的总和。
总和是 : 1275
让我们来分析一下这段代码,我们设定 number 是每次循环要相加的数字,我们的目的是从 1 一直加到 50,所以我们使用 while 循环函数,如果 number 没有达到 50,就让它进行 +1 操作,通过不断地 +1 我们就获得了 1 到 50 的所有数据,同时将每次循环后的 number 进行加法运算加到 count 中,这样就获得了 1 到 50 的所有 number 的总和。
上面的案例的逻辑思维方式在循环中非常常见,涉及到循环语句通常需要设定一个初始值。
让我们再来看一个示例:
【示例】通过循环提取列表中每个元素
# 定义一个列表
'苹果'
,'香蕉'
,'梨'
,'西瓜'
,'火龙果'
]# 创建一个初始化索引变量
0
# 每次循环都对 index 变量值+1,直到大小和列表长度相同
while
index < len
(fruits):print
(fruit + '是我最喜欢的水果'
)1
运行代码,结果如下:
苹果是我最喜欢的水果
香蕉是我最喜欢的水果
梨是我最喜欢的水果
西瓜是我最喜欢的水果
火龙果是我最喜欢的水果
在这个例子中,我们有一个水果列表 fruits。我们使用 while 循环来不断递增 index 索引。循环的条件是索引 index 小于列表的长度,然后对 fruits 列表按照索引提取相应的元素并输出。
当然,上面的循环列表使用我们即将学到的 for 循环可以更方便地表达。
在 Python 中 += 写法是递增的意思,写法是 x += n , n 是递增量。上面的示例中, number = number + 1 也可以写成 number += 1 。
另外,可以通过设定布尔值来实现 while 语句的无限循环,循环时使用 ctrl + c 来退出循环,这在后端的实时请求中非常有用。
【示例】 创建一个程序,不断询问用户的身高和体重,计算 BMI 指数。
# 定义一个布尔值
True
# 因为我们的布尔值是 True 所以程序会一直循环不退出
while
my_bool:float
(input
('请输入您的身高(米):'
))float
(input
('请输入您的体重(kg):'
))print
('您的BMI指数是:'
,BMI,'\n请下一位继续:'
)运行代码,输入指标测试:
请输入您的身高(米):>? 1.8
请输入您的体重(kg):>? 70
您的BMI指数是: 21.604938271604937
请下一位继续:
请输入您的身高(米):>? 1.85
请输入您的体重(kg):>? 75
您的BMI指数是: 21.913805697589478
请下一位继续:
请输入您的身高(米):
程序会一直询问用户的身高、体重信息,不断循环不停止,直到按下 ctrl + c 才会退出循环。
计数循环
计数循环的关键词是 for ,也叫做 for 循环,作用是 遍历一个可迭代对象,获取其中的每个元素依次进行操作,通常用于遍历字符串、列表、元组、字典、集合等数据结构。
for 循环会在可迭代对象中依次寻找元素,找到元素后就进行相应的代码处理,不断循环直到最后,示意图如下:
在 Python 中,for 的结构如下:
for
变量 in
可迭代对象:# 内部代码块
# 每次循环都执行一遍内部代码块
和 while 语句一样,for 后也可以新增 else 语句,在没有找到元素时,进入到 else 语句下面的代码块,不过一般 else 都会被省略,语法结构如下:
for
变量 in
可迭代对象:# 内部代码块
# 每次循环都执行一遍内部代码块
else
:# 代码块
【示例】使用 for 循环计算一个数据列表中的最大值和最小值
【思路】提前设定两个初始化的变量,一个设定为最大值,一个设定为最小值,然后循环列表中的每一个数字,一旦发现比最大值还大的数,那就用这个数更新这个最大值,同理,一旦发现比最小值还小的数,那就用这个数更新这个最小值。来看代码:
# 随意创建一个待计算的数据列表
5
,3
,10
,6
,12
,8
,22
,3
]# 创建一个初始化的最大值、最小值变量,使用 my_list[0] 的目的是确保这个元素在列表中
0
]0
]# 循环列表中的每一个数字,并进行判别赋值
for
number in
my_list:if
number > max_number :if
number < min_number :# 输出结果
print
('最大值是:'
,max_number)print
('最小值是:'
,min_number)运行代码结果如下:
最大值是: 22
最小值是: 3
我们在代码中通过 for 循环的方式不断比较初始值和列表中的元素的最大值和最小值,不断更新这个初始值,将列表中的全部元素都循环一遍后就会得出我们想要的结果。
循环相关的内置函数
在 Python 中,与循环有关的内置函数比较多,常用的一些函数如下:
名称 | 描述 |
---|---|
range 函数 | 用于生成一个数字序列便于循环提取。 |
zip 函数 | 用于将多个可迭代的对象逐个进行配对组合。 |
enumerate 函数 | 用于同时遍历集合中的元素及其对应的索引位置。 |
下面让我们结合一些案例,详细了解每个函数的用法:
-
range 函数
range 函数的目的是为了生成一串有规律的数字序列,用于在 for 循环中依次获得对应的数字,在循环结构中应用非常广泛。
range 函数的写法结构如下,除了 stop 参数外的剩下两个参数都可以省略:
range
(start, stop, step)其中,start 是开始的索引位置,stop 是结束的索引位置,step 是每几步选择一次,另外,和索引的性质一样,选择元素也是 左闭右开,也就是 start 位置的元素被选取,stop 位置的元素不会被选取。
让我们通过一个示例来理解这个函数的运作逻辑:
for
iin
range
(2
,6
):print
(i)运行上面的代码,结果如下,可见 range 函数构造了从 2 到 5 的数字 :
2
3
4
5上面的 for 循环调取数据序列的方法在 Python 中应用的非常广泛,让我们来看一个案例:
【案例】计算 1 到 20 的总和
# 创建一个初始变量,代表总和的值
total_number =0
# 使用 range 创建一个数字序列,并用 for 来循环提取,将每次提取到的数据都加给初始化变量
for
iin
range
(1
,11
):total_number += i# 输出结果
print
(total_number)运行上面的代码,就会输出最后的结果 55 ,这是 range 函数的常见应用之一。
使用 range 函数生成的可迭代对象不止可以用在字典中,可以使用其他数据结构来进行转化,比如使用 range 函数创建一个列表:
my_list =list
(range
(3
,7
))print
(my_list)运行代码结果如下:
[3, 4, 5, 6]
-
zip 函数
zip 函数是用来将两个或者多个数据结构组合成一个可迭代的对象,使用 for 循环可以方便提取组合后的内容,在 Python 中应用非常广泛。
zip 函数的语法结构是 zip(可迭代对象1,可迭代对象2,... ,可迭代对象n) , 将两个或者多个列表、元组等对象作为参数传入 zip 函数中,形成一个组合后的可迭代对象。
来看一个例子帮助理解:
# 创建两个列表
names = ['牧旗教程'
,'详细'
,'易理解'
]lens = [4
,2
,3
]# 使用 zip 函数组合两个列表生成可迭代对象
iter =zip
(names,lens)# 使用 for 循环提取这个可迭代对象
for
iin
iter:print
(i)运行上面的代码,结果如下,可以看出两个列表的元素已经按照对应得关系组合起来了。
('牧旗教程', 4)
('详细', 2)
('易理解', 3)另外,在 for 后面也可以传入多个参数,对应提取可迭代对象里的值,来看一个案例:
# 创建三个列表
names = ['牧旗教程'
,'小明'
,'小红'
]ages = [27
,25
,26
]schools = ['浙江大学'
,'南京大学'
,'复旦大学'
]# 使用 zip 函数组合三个列表生成可迭代对象
iter =zip
(names,ages,schools)# 使用 for 循环提取这个可迭代对象
for
name,age,schoolin
iter:print
(name,"的年龄是"
,age,",毕业于"
,school)运行上面的代码,结果如下:
牧旗教程 的年龄是 27 ,毕业于 浙江大学
小明 的年龄是 25 ,毕业于 南京大学
小红 的年龄是 26 ,毕业于 复旦大学这次我在 for 后面传入了三个变量,分别代表可迭代对象中的第一个、第二个、第三个元素,我分别给命名为 name 和 age 和 school,在 for 循环里面的语句中可以直接调用。
-
enumerate 函数
enumerate 函数会将可迭代对象处理成 索引+元素 的组合,可以使用 for 循环提取到对应的内容。
这个函数的写法是 enumerate(iterable, start=0) ,其中 start 参数可以用来指定索引的起始值,默认为 0。让我们通过示例来了解这个函数:
# 创建一个列表
names = ['牧旗教程'
,'小明'
,'小红'
,'小亮'
]# 使用 enumerate 函数组合三个列表生成可迭代对象
iter =enumerate
(names)# 使用 for 循环提取这个可迭代对象
for
index,namein
iter:print
(f"编号
{index}:
{name}"
)运行上面的代码,结果如下:
编号 0: 牧旗教程
编号 1: 小明
编号 2: 小红
编号 3: 小亮可见,使用 encumerate 函数的好处是可以方便找到元素在可迭代对象中的位置。
字典循环
另外,for 循环也可以直接循环字典对象,在循环时有以下几点注意事项:
名称 | 描述 |
---|---|
直接循环 | 直接循环读取字典的内容,输出的结果是 字典的键 。 |
循环字典的 values 方法 | 循环字典的 values 方法,输出的结果是 字典的值 。 |
循环字典的 items 方法 | 循环字典的 items 方法,输出的结果是 字典的键和值 的组合。 |
下面让我们结合一些案例,详细了解每个每一种方式:
-
直接循环
直接循环读取字典的内容,输出的结果是 字典的全部键 。
# 创建一个字典
my_dict = {'教程名称'
:'牧旗教程'
,'教学科目'
:'Python'
,'特点'
:'面向新手'
}# 使用 for 循环提取这个可迭代对象
for
iin
my_dict:print
(i)
运行上面的代码,结果如下,可见,字典中的全部键被输出了出来:
教程名称
教学科目
特点
循环字典的 values 方法
循环字典的 values 方法,输出的结果是 字典的全部值 。
# 创建一个字典
'教程名称'
:'牧旗教程'
,'教学科目'
:'Python'
,'特点'
:'面向新手'
}# 使用 for 循环提取这个可迭代对象
for
i in
my_dict.values():print
(i)运行上面的代码,结果如下,可见,字典中的全部键被输出了出来:
牧旗教程
Python
面向新手
循环字典的 items 方法
循环字典的 items 方法,输出的结果是字典的键和值的元组。
# 创建一个字典
'教程名称'
:'牧旗教程'
,'教学科目'
:'Python'
,'特点'
:'面向新手'
}# 使用 for 循环提取这个可迭代对象
for
key,value in
my_dict.items():print
(key,'-'
,value)运行上面的代码,结果如下,字典中的键和值分别被提取到了,可以进行后续的处理:
教程名称 - 牧旗教程
教学科目 - Python
特点 - 面向新手
循环语句关键字
在 Python 中,有一些关键字通常用在循环语句或者条件语句中来控制代码的执行流程,以下是一些常见的关键字:
名称 | 描述 |
---|---|
break 关键字 | 用于在循环中提前终止循环,跳出整个循环体。 |
continue 关键字 | 用于跳过当前循环中的剩余代码,并直接进入下一次循环迭代。 |
pass 关键字 | 在代码块中不执行任何操作,通常用作占位符。 |
下面让我们通过一些示例来深入了解这些关键字:
-
break 关键字
当 break 语句被执行时,它会立即 终止整个循环体,执行循环后面的代码。通常与条件结合使用,用于在满足某个条件时提前结束循环。
【示例】 循环输出 1-5 的值,并在循环到 3 之前停止。
for
iin
range
(1
,5
):if
i ==3
:break
print
(i)运行代码结果如下:
1
2可以看出,到 3 的时候循环程序就被终止了。
-
continue 关键字
当 continue 语句被执行时,它会 跳过本次循环中剩余的代码,直接进入下一次循环迭代。而不是跳出整个循环,通常与条件结合使用,用于在满足某个条件时跳过当前循环的执行。
【示例】 循环输出 1-5 的值,并在循环到 3 的时候跳过 3 ,继续输出后面的内容。
for
iin
range
(1
,5
):if
i ==3
:continue
print
(i)运行代码结果如下:
1
2
4可以看出,循环到 3 的时候直接跳过了后面的输出程序,没有输出任何内容,继续运行后面的循环,后面的循环不会停止。
-
pass 关键字
pass 语句不做任何事情,只起到占位的作用,通常用于在代码结构中保持语法的完整性,但暂时不需要执行任何操作的情况。
【示例】
for
iin
range
(1
,5
):if
i ==3
:pass
print
(i)运行代码结果如下,所有的元素都被输出出来,没有受到任何影响:
1
2
3
4
循环的推导式
循环推导式(Comprehensions)是一种简洁而强大的语法,这种语法可以在一行内完成需要多行完成的循环结构。可以用来快速创建列表、集合、字典等数据结构。
我们在前面的列表、字典的教程中接触到了一些推导式的知识,在这里再次进行巩固:
-
列表推导式
列表推导式可以快速创建新列表或者根据现有的数据结构计算生成列表,结构如下:
[表达式for
元素in
可迭代对象if
条件]【示例】根据需求生成一些列表
# 生成0-9的整数列表
my_list1 = [ifor
iin
range
(0
,10
)]print
('列表1的结果是:'
,my_list1)# 对1-5的整数取平方
my_list2 = [i ** 2for
iin
[1
,2
,3
,4
,5
]]print
('列表2的结果是:'
,my_list2)# 找出1-5的整数中的偶数
my_list3 = [ifor
iin
[1
,2
,3
,4
,5
]if
i %2
==0
]print
('列表3的结果是:'
,my_list3)运行代码结果如下:
列表1的结果是: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
列表2的结果是: [1, 4, 9, 16, 25]
列表3的结果是: [2, 4]要注意的是,如果当 if 语句后面需要接 else 时,列表的推导式的顺序会发生如下变化:
[表达式if
条件else
表达式for
元素in
可迭代对象 ] -
集合推导式
集合推导式语法基本上与列表推导式一致,结构如下:
{表达式for
元素in
可迭代对象if
条件}【示例】对列表进行去重
# 对列表去重
my_list = [1
,3
,5
,3
,6
,3
,5
,7
,8
,3
,2
]my_set = {ifor
iin
my_list}# 输出结果
print
(my_set)运行代码结果如下:
{1, 2, 3, 5, 6, 7, 8}
-
字典推导式
字典推导式可以快速创建新字典,结构如下:
{键:值for
元素in
可迭代对象if
条件}【示例】使用推导式组合两个列表并生成字典
# 使用两个列表生成字典,zip 函数是用来将两个数据结构压缩成一个可迭代对象
key_list = ['牧旗'
,'小红'
,'小明'
,'小亮'
]value_list = [27
,25
,26
,30
]my_dict = {key:valuefor
key,valuein
zip
(key_list,value_list)}print
(my_dict)运行代码结果如下,可见键列表和值列表被组合对应生成了新的字典:
{'牧旗': 27, '小红': 25, '小明': 26, '小亮': 30}
【示例】计算字符串中每个字母出现的次数,用字典归纳
# 创建字符串
my_string ='牧旗教程的教程教编程'
my_dict = {key:my_string.count(key)for
keyin
my_string}print
(my_dict)运行代码结果如下,可见每个字的出现次数都被程序进行了统计:
{'牧': 1, '旗': 1, '教': 3, '程': 3, '的': 1, '编': 1}
【示例】颠倒字典的键和值
# 创建字典
old_dict = {'姓名'
:'牧旗教程'
,'年龄'
:27
,'职业'
:'算法工程师'
,'身高'
:180
}new_dict = {value:keyfor
key ,valuein
old_dict.items()}print
(new_dict)运行代码结果如下,可见键和值的顺序进行了颠倒:
{'牧旗教程': '姓名', 27: '年龄', '算法工程师': '职业', 180: '身高'}
例题
【例题1】使用 Python 找出 100 以内的所有质数(质数是指大于1的自然数中,除了1和自身以外没有其他因数的数)
【分析】质数的概念是只能被1和自身整除,不能被其他任何数整除。所以我们可以使用循环的方式,让这个数依次除1、2、3、4递增一直到它本身,如果发现这个数除了1或者本身外的取余结果都不是0,那说明这个数就是质数。
我们通过代码来实现:
# 定义一个结果变量列表
# 遍历2到100的所有数,依次做判断(1不是质数)
for
number in
range
(2
,101
):# 默认这个数是质数
True
# 使用循环对这个数字依次除上2、3、4递增一直到它本身-1(不能除1和它本身)
for
i in
range
(2
,number):# 如果这个数除上某个数的余数等于0 ,说明这个数不是质数
if
number % i == 0
:# 将这个数的布尔值改成 False
False
# 一旦判定这个数不是质数,后面就不用再计算,跳出这次循环
break
# 根据变量的布尔值来判断是否是质数,并确定是否要加入到列表中
if
is_prime :# 输出包含所有质数的列表
print
(result)运行代码,结果如下:
[2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59,61, 67, 71, 73,
79, 83, 89, 97]
关注公众号【牧旗教程】,回复“更多例题”,获取更多题型进行训练~
您的打赏将帮助维护网站服务器的正常运营,并为作者的后续更新提供更多的动力。
Copyright © 2013-2023 Muqi Course. All Rights Reserved. 牧旗教程 版权所有 京ICP备2023029281号