python基础之循环控制

Python中循环的介绍

什么是循环

现实生活中,也有很多循环的应用场景:

(1)老师批改作业:拿起作业本→查看答案→批改打分→放回作业本,重复以上过程,直到所有学生的作业都批改完了

(2)收银员收款:接过顾客商品→扫码计价→收取钱款→打印小票,重复以上过程,直到所有排队顾客都完成付款。

(3)环卫工人扫地:拿起扫帚→清扫路面→收集垃圾→移动到下一段路面,重复以上过程,直到负责区域清扫完毕。

(4)学生晨读:打开课本→朗读段落→标记重点→继续朗读,重复以上过程,直到晨读时间结束。

以上场景都有一个共同的特点:有条件重复地做一件事,每一次做的事情不同但类似。

程序是为了解决实际问题的,实际问题中存在着重复动作,那么程序中也应该有相应的描述,这就是循环

循环的作用

循环的作用是什么?

答:让代码高效的重复执行,避免重复编写大量相同或相似的代码,提升编程效率。

循环的种类

在Python中,循环一共分为两大类:while循环与for循环

思考问题:while循环和for循环如何选择呢?

①:对于循环次数固定的(已知)情况下,建议使用for循环, 例如: 打印1~10的数字

②:对于循环次数未知(不确定)的情况下,建议使用while循环, 例如: 猜数字游戏

while循环语法及其应用

while循环的基本语法

1
2
3
4
5
6
7
8
9
# Step1: 定义一个计数器(初始化一个计数器)
i = 01
# Step2: 编写while循环结构
while 循环条件(判断 计数器 是否达到了目标位置):
循环体1
循环体2
...
# Step3: 在循环内部更新计数器
i = i + 1 或 i += 1

普及小知识:在计算机程序中,计数器大部分都是从0开始的,少数场景会从1开始,根据需求灵活选择。

总结:while循环三步走

① 初始化计数器

② 编写循环条件(判断计数器是否达到了目标位置)

③ 在循环内部更新计数器

while循环入门案例:使用while循环,循环输出5遍“Python真有趣”

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
# 演示 while循环
"""
while 判断条件:
# 当条件满足 需要执行的内容

说明:
while: 实现循环操作的关键字
条件判断: 是否进入循环的依据
当条件成立, 就执行循环里面的内容, 条件一直成立 就一直循环执行内部的代码 直到条件不成立
"""

# 需求: 请循环 打印 5次 Python真有趣
# 1- 定义计数器
num = 1

# 2- 编写循环操作
while num <= 5:
# 2.1 执行循环的主体代码
print("Python真有趣")

# 2.2 更新计数器 +1
# num = num + 1
num += 1

while循环流程图:

image-20260405165806644

while循环案例

案例1:使用while循环求1..50的和

分析:定义一个while循环,让其可以帮助我们计算 1 + 2 + 3 + 4 + 5 … + 50,结果:1275

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# 需求: 求 1~50的和
# 思路: 1- 需要对 1~50进行遍历(循环) 2- 每循环一个 就要对其进行累加计算(在while循环外部定义一个初试累加变量)

# 如何进行 1 ~ 50 循环呢
# 第一步: 定义计数器
i = 1

# 第二步: 编写循环操作
# 2.1 定义一个累加求和的变量
sum_total = 0

while i <= 50:
# 2.2 循环的代码块
sum_total = sum_total + i
# 第三步: 更新计数器
i += 1

print(sum_total)

案例2:求1~50之间,所有奇数的和

什么是奇数:所谓的奇数,就是不能被2整除的数字,数学中可以使用2n+1来表示奇数。(Python代码 => if 数值 % 2 != 0 代表它是一个奇数)

知识点:在while循环中,我们还可以结合if进行判断,筛选出符合条件的数据。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
# 需求2: 求1~50之间,所有奇数的和  不能被2 整除的 就是奇数(余数不为0)
# 思路: 1- 需要对 1~50进行遍历(循环) 2- 每循环一个 先判断是否为奇数, 如果是对其进行累加计算(在while循环外部定义一个初试累加变量)

# 1- 定义计数器
i = 1

# 2- 编写循环操作
# 2.2.1 先定义一个累加的初始变量
sum_odd = 0
while i <= 50:
# 循环的主体要执行的代码块
# 2.1 判断是否为奇数
if i % 2 != 0:
# 2.2 如果是奇数, 进行累加
# 2.2.2 执行累加
sum_odd += i

# 3- 更新计数器
i += 1

print(sum_odd)

循环中的两大关键词

两大关键词

在Python循环中,经常会遇到两个常见的关键词:break 与 continue

break:代表终止整个循环结构,一旦执行,直接退出循环,不再执行后续循环体内容。

continue:代表中止当前本次循环,跳过本次循环剩余内容,继续执行下一次循环。

  • 举个栗子
1
2
3
4
5
举例:老师检查6本作业,检查完第一本,检查第二本…,这里"检查作业"的动作是不是重复执行?

场景一:如果检查过程中,发现第三本作业空白未写,无需再检查后续作业,直接停止检查,这里就是break控制循环流程,即终止此循环。

场景二:如果检查过程中,发现第三本作业有少量错误,标注错误后跳过这本,继续检查第四本作业,这里就是continue控制循环流程,即退出当前一次循环继而执行下一次循环代码。

6.1.1 break关键字

场景一:如果检查过程中,发现第三本作业空白未写,无需再检查后续作业,直接停止检查,这里就是break控制循环流程,即终止此循环。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
# 演示 break:  实现中断循环 直接退出循环操作
# 需求: 遍历从 1 ~ 50 , 要求 一旦值能够被15整除(除 15 余数为 0) 立即退出循环
# 1- 定义计数器
i = 1

# 2- 编写循环
while i <= 50:
# 循环的主体内容
# 如果值能够被15整除, 退出循环
if i % 15 == 0:
break

print(i)

# 3- 更新计数器
i += 1

# 退出循环后, 执行后续的代码
print("循环已终止,退出程序")

6.1.2 continue关键字

场景二:如果检查过程中,发现第三本作业有少量错误,标注错误后跳过这本,继续检查第四本作业,这里就是continue控制循环流程,即退出当前一次循环继而执行下一次循环代码。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
# 演示 continue:  跳过本次循环, 进入下一次循环

# 需求: 遍历从 1 ~ 50 , 要求 如果遍历的值能够被 6 整除 将该值直接跳过不打印
# 1- 定义计数器
i = 1

# 2- 编写循环
while i <= 50:
# 循环的主体内容
# 如果能够被6整除, 将该值跳过 不打印
if i % 6 == 0:
# 更新计数器: 必须在continue前更新,否则会出现死循环
i += 1
continue

print(i)

# 3- 更新计数器
i += 1

# 退出循环后, 执行后续的代码
print("循环执行完毕")

如果在使用continue的时候,不手工更新计数器会有什么后果呢?

答:会出现死循环(计数器一直停留在满足continue条件的数值上,永远无法满足循环结束条件),建议使用Debug调试工具观看执行过程。

死循环概念

在编程中一个靠自身控制无法终止的程序称为“死循环”,死循环会一直占用计算机资源,开发中应尽量避免。

在Python中,我们也可以使用while True来模拟死循环:

1
2
3
# 注意 如果条件永久成立, 那么这个循环也被成为 死循环
while True:
print("这是一个死循环,按Ctrl+C可强制终止")

while循环案例:猜数字

案例需求

编写一个Python程序,系统提前设定一个1到20之间的固定整数(如12),让用户反复输入数字猜测,每次输入后提示“猜大了”“猜小了”或“猜对了”,直到用户猜对为止,猜对后提示游戏结束,不使用任何异常相关知识。

实现思路

① 编写死循环,满足“猜对”条件后终止循环。

② 提前设定一个固定整数(如12)作为答案,无需随机生成(避开未学的random模块)。

③ 让用户输入数字,通过if判断输入数字与答案的大小关系,给出对应提示,猜对则终止循环。

代码实现

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# 演示 猜数字游戏(无random、无异常,适合未学相关知识的学生)
# 1- 提前设定固定答案(1~20之间),无需随机生成
answer = 12
# 2- 让用户反复猜测,写死循环方式
print("欢迎来到猜数字游戏!")
print("规则:系统已设定1~20之间的一个整数,猜对即可结束游戏,每次猜测会提示猜大或猜小~")
while True:
# 2.1 让用户输入猜测的数字(直接转为整数,提示用户输入整数)
user_guess = int(input("请输入你猜测的1~20之间的整数:"))
# 2.2 判断猜测结果,给出对应提示
if user_guess == answer:
print("恭喜你,猜对了!游戏结束~")
# 猜对后终止循环
break
elif user_guess > answer:
print("猜大了,再试试小一点的数字!")
else:
print("猜小了,再试试大一点的数字!")

扩展: 要求增加限制次数(3次), 并且要提示用户还剩余几次猜测机会: 仅做了解即可, 可以尝试写一写(对理解 while 和 if 很有作用)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
# 演示 猜数字游戏(限制次数版,无random、无异常)
# 1- 提前设定固定答案(1~20之间),无需随机生成
answer = 12
# 2- 定义猜测次数(限制3次)
guess_count = 1
# 3- 写死循环,控制猜测次数
print("欢迎来到猜数字游戏!")
print("规则:系统已设定1~20之间的一个整数,你有3次猜测机会,猜对即可获胜~")
while True:
# 3.1 让用户输入猜测的数字,提示剩余次数
user_guess = int(input(f"请输入你猜测的1~20之间的整数(剩余{3 - guess_count + 1}次机会):"))
# 3.2 判断猜测结果,给出对应提示
if user_guess == answer:
print(f"恭喜你,猜对了!你在第{guess_count}次就猜对了,游戏结束~")
break
elif user_guess > answer:
print("猜大了,再试试小一点的数字!")
else:
print("猜小了,再试试大一点的数字!")
# 3.3 判断次数是否用完
if guess_count >= 3:
print(f"猜测次数已用完!正确答案是{answer},游戏结束~")
break
# 计数器+1
guess_count += 1

for循环基本语法及其应用

for循环基本语法

for循环结构主要用于(序列 => 字符串、列表、元组、集合以及字典)类型数据的遍历(循环)操作,无需手动定义和更新计数器,使用起来更简洁。

for循环主要用于序列类型数据的循环操作(遍历操作)

另外当循环次数已知的情况,建议使用for循环(比while循环更简洁)。

1
2
3
for 临时变量 in 序列:
重复执行的代码1
重复执行的代码2

案例:使用for循环遍历字符串”python”

1
2
3
4
5
6
7
8
9
10
11
12
# 演示: for基本使用
"""
语法格式:
for 临时变量 in 序列:
循环执行的代码块

注意:
临时变量的值 其实 就是 序列中每一个元素,循环次数等于序列的长度
"""
# 需求: 遍历一个字符串 : python
for char in "python":
print(char)

使用Debug调试以上代码可知:for循环功能非常强大,可以自动判断序列的长度,长度为多少,则for循环就循环多少次。每次循环时,系统会自动将序列中的每个元素赋值给临时变量,赋值完成后,for循环内部会自动更新计数器,向后移动一位,继续循环,直至元素全部循环结束。

range方法(函数)

在Python3中 range() 函数返回的是一个可迭代对象(类型是对象)(由于我们还未学习面向对象,为了方便大家理解,你可以简单的将其理解为一个序列结构)

主要作用:用于生成一段连续的整数序列,方便配合for循环使用。

基本语法:

1
2
3
4
5
6
range(stop)
range(start, stop, step)

start: 计数从 start 开始。默认是从 0 开始。例如range4)等价于range04);
stop: 计数到 stop 结束,但不包括 stop。例如:range04) 是 [0, 1, 2, 3] 没有 4
step:步长,默认为1。例如:range04) 等价于 range(0, 4, 1)

案例:for循环与range方法,使用for循环,循环4次

1
2
3
4
5
6
7
# 演示 range函数
# 作用: 帮我们生成一个连续的数字, 例如 0~3
# 语法: range(起始值,结束值,步长)
# 起始值: 默认为 0 结束值: 必填的 在生成序列的时候, 不含结束值 步长: 默认为1 表示 数字与数字之间的间隔
# 需求: 生成 4以内的序列, 并且将每一个值打印出来
for num in range(0,4):
print(num)

for循环案例

案例: 使用for循环,求1 ~ 50之间所有奇数的和

1
2
3
4
5
6
# 需求: 求 1~50 之间 所有的奇数之和
sum_odd = 0
for num in range(1,51):
if num % 2 != 0:
sum_odd += num
print(sum_odd)

综合案例:使用for循环实现用户名+密码认证-作业

案例:用for循环实现用户登录

① 输入用户名和密码

② 判断用户名和密码是否正确(username=’student’,password=’python123’)

③ 登录仅有2次机会,超过2次会提示“登录失败,次数已用完”

分析:用户登陆情况有3种:

① 用户名错误(此时便无需判断密码是否正确) – 登陆失败

② 用户名正确 密码错误 –登陆失败

③ 用户名正确 密码正确 –登陆成功

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
# 用户登录案例(for循环版)

# 1- 构建循环, 并且循环只能有 2次
for i in range(0,2):
# 2: 让用户输入 用户名 和 密码
user_name = input("请输入用户名:")
user_pwd = input("请输入密码:")

# 3: 判断 用户名和密码是否正确
if user_name == 'student':
if user_pwd == 'python123':
print("恭喜您, 登录成功!")
# 登录成功后, 直接退出循环
break
else:
print(f"您输入的密码不正确, 您还剩余{1-i}次机会")
else:
print(f"您输入的用户名不正确, 您还剩余{1-i}次机会")
else:
# 循环正常结束(未break),说明次数用完
print("登录失败,次数已用完!")

for循环中的else结构

为什么需要在for循环中添加else结构

循环可以和else配合使用,else下方缩进的代码指的是当循环正常结束之后要执行的代码(即没有被break终止,完整执行完所有循环次数)。

强调:’正常结束’,非正常结束(如遇到break、程序异常),其else中的代码是不会执行的。

for循环结构中的else结构

基本语法:

1
2
3
4
for 临时变量 in 序列:
循环体
else:
for循环正常结束后,执行的代码

break关键字对for…else结构的影响

1
2
3
4
5
6
7
8
str1 = 'python'
for i in str1:
if i == 'h':
print('遇h强制结束循环')
break
print(i)
else:
print('循环正常结束之后执行的代码')

运行结果:只会打印p、y、t,然后打印“遇h强制结束循环”,else中的代码不会执行(因为循环被break终止,属于非正常结束)。

continue关键字对for…else结构的影响

1
2
3
4
5
6
7
8
str1 = 'python'
for i in str1:
if i == 'h':
print('遇h不打印')
continue
print(i)
else:
print('循环正常结束之后执行的代码')

运行结果:打印p、y、t、遇h不打印、o、n,最后打印“循环正常结束之后执行的代码”(continue只是跳过本次循环,循环整体正常结束)。

else结构整体演示

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
# 演示: for循环结合else情况
"""
语法:
for 临时变量 in 序列:
循环体
else:
当循环正常结束后, 需要执行的代码

如果for循环中,
通过break退出的循环, 那么就不会执行else语句的内容
通过continue跳过当前循环, 对于else 不会有影响的
在循环过程中程序出现异常(程序异常结束), else也不会执行
"""
# 需求: 循环输出从 1~6, 当循环正常结束后, 打印 循环完成
for i in range(1,7):
# 当循环到3的时候, 强制退出循环(注释后可测试正常情况)
# if i == 3:
# break

# 当循环到3的时候, 跳过当前循环 进入下一次循环
# if i == 3:
# continue
# 异常情况(注释后可测试正常情况)
# 1/0
print(i)
else:
print("循环结束了.....")

循环要求

  • 1- 能够分别使用 for和while 实现 1~50 循环操作
  • 2- 能够分别使用 for 和 while 完成 求 奇数之和的案例

双层循环

for循环里可以嵌套for循环以及while循环,while循环中也可以嵌套for循环和while循环

for循环嵌套for循环

1
2
3
4
for 临时变量1 in 序列1:
for 临时变量2 in 序列2:
内层循环体

for循环嵌套while循环

1
2
3
4
for 临时变量1 in 序列1:
index = 初始值
while index的判断条件:
内层循环体

while循环嵌套while循环

1
2
3
4
5
index = 初始值
while index的判断条件:
index2 = 初始值
while index2的判断条件:
内层循环体

while循环嵌套for循环

1
2
3
4
index = 初始值
while index的判断条件:
for 临时变量 in 序列:
内层循环体

双层循环经常用来控制双层遍历的情况,比如打印九九乘法表

1
2
>双层循环,如果内层循环使用了break,break只能跳出
>它所在的循环,也就是内层循环

免费可打印九九乘法表 - Multiplication Chart

image-20260406214559454

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
'''
演示双层循环实现九九乘法表
'''

'''
双层循环,如果内层循环使用了break,break只能跳出
它所在的循环,也就是内层循环
'''

'''
需求:
实现九九乘法表
思路:
1. 变量row控制行号,row从1到9结束,[1,9]
2. 变量col控制列号,col从1开始回到当前行号结束,[1,row]
3. 用外层循环控制行号的变化,内层循环控制列号的变化
for row in range(1,10):
for col in range(1,row+1):
pass
'''
for row in range(1,10):
for col in range(1,row+1):
# print(f'当前行号{row},当前列号{col}')
print(f'{col} * {row} = {row * col}',end='\t')
# print()默认输出换行符
print()

print('#'*100)
'''
要求九九乘法表最多只输出到第3列
思路:
col为4的时候结束内层循环即可,外层循环继续
'''
for row in range(1,10):
for col in range(1,row+1):
# print(f'当前行号{row},当前列号{col}')
print(f'{col} * {row} = {row * col}',end='\t')
# 当col为4的时候结束内层循环,跳转到外层循环
if col == 4:
# break只能跳出它所在的循环(离他最近的循环)
break
# print()默认输出换行符
print()
print('#'*100)

源码连接:

https://gitee.com/secondtonone1/python_-ai