Python Day 4 循环控制与应用详解 例题分析
·
在 Python 中,循环结构是实现重复任务的核心机制。本文将详细介绍循环控制的关键知识点,包括控制循环的关键字、循环结构中的 else 分支、for 循环与 range 对象,以及循环的实际应用案例。
一、控制循环的关键字
在循环中,break 和 continue 是两个常用的控制关键字,用于改变循环的执行流程。
1. break 关键字
- 作用:强制结束当前循环,直接跳出循环体,不再执行后续循环任务。
- 示例:
for i in range(5): if i == 3: break # 当i=3时,强制结束循环 print(i) # 输出:0 1 2
2. continue 关键字
- 作用:结束本次循环,跳过当前循环中剩余的代码,直接进入下一次循环。
- 示例:
for i in range(5): if i == 3: continue # 当i=3时,跳过本次循环剩余内容 print(i) # 输出:0 1 2 4
二、循环结构中的 else 分支
Python 的循环(while 和 for)支持与 else 搭配使用,其逻辑与条件判断中的 else 不同。
1. 语法结构
while 条件:
循环体
else:
else分支代码
# 或
for 变量 in 可迭代对象:
循环体
else:
else分支代码
2. 核心特点
- 执行条件:
else分支仅在循环条件正常不成立时执行(即循环自然结束,而非被break强制终止)。 - 与 break 的关系:
else和break是互斥的:- 若循环中执行了
break,则else分支一定不执行; - 若
else分支执行了,则循环中一定没有执行break。
- 若循环中执行了
3. 应用案例:判断素数(质数)
素数是指只能被 1 和自身整除的大于 1 的整数(最小素数是 2)。利用 while + else 可简洁实现判断:
num = int(input('输入一个数字:'))
if num < 2:
print('不是素数')
else:
i = 2
while i <= num **0.5: # 优化:只需判断到平方根
if num % i == 0:
print('不是素数')
break
i += 1
else:
print('是素数')
三、for 循环详解
for 循环更适合处理循环次数确定的场景,其核心是遍历可迭代对象。
1. 语法结构
for 变量 in 可迭代对象:
循环体
else:
else分支代码 # 可选,同while的else逻辑
-** 变量 :存储可迭代对象中每次取出的数据;
- 可迭代对象 **:指可逐个获取元素的对象,如字符串、列表、元组、集合、字典、range 对象等。
2. range 对象
range 用于生成一个数字序列,是 for 循环中控制次数的常用工具,有三种语法形式:
| 语法格式 | 说明 | 示例 | 生成的序列 |
|---|---|---|---|
range(stop) |
生成从 0 到 stop-1 的整数 | range(5) |
0, 1, 2, 3, 4 |
range(start, stop) |
生成从 start 到 stop-1 的整数(要求 start < stop) | range(2, 6) |
2, 3, 4, 5 |
range(start, stop, step) |
生成从 start 到 stop-1、步长为 step 的整数(step 为正整数时 start <stop;为负整数时 start> stop) | range(1, 10, 2)range(10, 1, -3) |
1, 3, 5, 7, 910, 7, 4 |
3. for 循环的应用场景
(1)遍历序列
# 遍历字符串
for char in "Python":
print(char, end=" ") # 输出:P y t h o n
# 遍历列表
fruits = ["apple", "banana", "cherry"]
for fruit in fruits:
print(fruit)
(2)控制循环次数
# 计算 1~100 的和
total = 0
for i in range(1, 101):
total += i
print(total) # 输出:5050
(3)嵌套循环:打印九九乘法表
外层循环控制行数,内层循环控制列数:
for i in range(1, 10): # 外层:9行
for j in range(1, i + 1): # 内层:第i行有i列
print(f"{i}*{j}={i*j}", end="\t")
print() # 换行
四、循环的嵌套应用
多层循环(如双层循环)常用于处理二维结构(如行列图形、矩阵等)。核心原则:
- 外层循环:控制行数,负责换行;
- 内层循环:控制列数,负责输出每行的内容。
示例:打印俄罗斯方块图形
# 用十六进制表示图形(0x0464 对应二进制 0000 0100 0110 0100)
shape = 0x0464
n = 15 # 从最高位开始判断(共16位,索引0~15)
# 外层循环:输出4行
for _ in range(4):
# 内层循环:输出4列
for _ in range(4):
# 判断当前位是否为1,为1则打印*
if (shape >> n) & 1:
print('*', end='\t')
else:
print('', end='\t')
n -= 1
print() # 换行
总结
break和continue是控制循环流程的核心关键字,分别用于终止循环和跳过本次循环;- 循环中的
else分支仅在循环自然结束时执行,与break互斥; for循环适合遍历可迭代对象,range是生成数字序列的高效工具;- 嵌套循环可处理二维结构,外层控行、内层控列是常见模式。
掌握这些知识点,能帮助你更灵活地处理 Python 中的重复任务,提升代码效率与可读性。
一、数字累加与自复制计算
# 从键盘接收一个数,生成形如 num + numnum + numnumnum + ... 的累加和
num = int(input('请输入一个数字:'))
num_ = 0 # 用于生成每一项,如 num, numnum, numnumnum...
count = 0 # 累加和
i = 0
while i < 5:
num_ = num_ * 10 + num # 生成下一项
count += num_
i += 1
print(count)
二、寻找完全数
# 寻找10000以内的所有完全数(真因数之和等于自身的数)
i = 10000 # 从10000开始倒序查找
while i >= 1:
a = 1
sum_ = 0
while a <= (i ** 0.5): # 优化:只需检查到平方根
if i % a == 0:
sum_ += a
# 避免重复添加平方根对应的因数
if a != i // a and a != 1:
sum_ += i // a
a += 1
if sum_ == i:
print(i)
i -= 1
三、计算阶乘
# 计算输入数字的阶乘(n! = 1×2×3×...×n)
num = int(input("请输入一个数字:"))
result = 1
for i in range(num, 0, -1): # 从n倒序到1
result *= i
print(f"{num}的阶乘是:{result}")
四、遍历中文字符集
# 遍历Unicode中的汉字范围(0x4e00~0x9fa5)并统计数量
count = 0
chinese_chars = ''
for i in range(0x4e00, 0x9fa5 + 1):
chinese_chars += chr(i)
count += 1
print(f"共有{count}个中文字符")
# 注意:完整输出会很长,实际使用时建议分批次处理
五、打印三角形图案
# 打印倒三角形(上宽下窄)
for i in range(1, 6):
for j in range(6 - i, 0, -1):
print('*', end='')
print() # 换行
六、逆序打印乘法表
# 逆序打印9×9乘法表(从9×9到1×1)
for i in range(9, 0, -1):
for j in range(1, i + 1):
print(f"{i}*{j}={i*j}", end='\t')
print()
七、猴子吃桃问题
# 猴子吃桃问题:每天吃掉一半加1个,第10天只剩1个,求最初数量
num = 1 # 第10天剩余1个
for day in range(9, 0, -1): # 从第9天倒推到第1天
num = (num + 1) * 2 # 前一天的桃子数是当天的(数量+1)*2
print(f"最初有{num}个桃子")
八、阶乘和计算
# 计算1! + 2! + 3! + 4! + 5!
sum_ = 0
for i in range(1, 6):
factorial = 1
for j in range(1, i + 1): # 计算i的阶乘
factorial *= j
sum_ += factorial
print(f"1!+2!+3!+4!+5! = {sum_}")
九、十进制转十六进制
# 将十进制数转换为十六进制字符串(手动实现,不使用内置函数)
num = int(input('请输入一个数字:'))
hex_chars = "0123456789ABCDEF"
result = ''
if num == 0:
print("0")
else:
while num > 0:
remainder = num % 16
result = hex_chars[remainder] + result
num = num // 16
print(f"十六进制表示:{result}")
十、最大公约数与最小公倍数
# 计算两个正整数的最大公约数(GCD)和最小公倍数(LCM)
m, n = int(input('请输入第一个正整数:')), int(input('请输入第二个正整数:'))
a, b = m, n
# 使用辗转相除法求GCD
while b != 0:
c = a % b
a, b = b, c
gcd = a
lcm = m * n // gcd # LCM = (m*n)/GCD
print(f"最大公约数为{gcd}")
print(f"最小公倍数为{lcm}")
十一、位运算绘制图形
# 使用位运算绘制4x4图形(根据输入数字的二进制位)
n = 15 # 从最高位开始检查
num = int(input('请输入一个数字:'))
for _ in range(4): # 4行
for _ in range(4): # 4列
if (num >> n) & 1: # 检查第n位是否为1
print('*', end='\t')
else:
print(' ', end='\t')
n -= 1
print() # 换行
十二、筛选数字
# 找出1~10000中能被3整除或包含数字3的数
for i in range(1, 10001):
if i % 3 == 0 or '3' in str(i):
print(i)
十三、账号密码验证
# 模拟登录验证(最多3次尝试)
valid_username = 'admin'
valid_password = 'admin123'
for attempt in range(1, 4):
username = input('输入账号:')
password = input('输入密码:')
if username == valid_username and password == valid_password:
print('登陆成功')
break
else:
print(f'登录失败,剩余尝试次数:{3 - attempt}次')
else: # 三次尝试都失败
print('登录失败,账号已锁定')
十四、数字组合与判断
# 找出1~1000中各位数字之和为10的数
for i in range(1, 1001):
sum_digits = 0
temp = i
while temp > 0:
sum_digits += temp % 10
temp //= 10
if sum_digits == 10:
print(i)
十五、绘制特定图案
# 绘制特定的5行图形(类似沙漏)
for i in range(1, 6):
match i:
case 1 | 5:
print('*' * 5)
case 2 | 4:
print(' ' + '*' * 3)
case 3:
print(' ' + '*')
十六、寻找回文数
# 找出10000~99999中的回文数(例如12321,个位与万位相同,十位与千位相同)
for i in range(10000, 100000):
digit_list = [int(d) for d in str(i)]
if digit_list[0] == digit_list[4] and digit_list[1] == digit_list[3]:
print(i)
十七、斐波那契数列变形
# 计算数列:a₁=1, a₂=1, aₙ=aₙ₋₁+aₙ₋₂(n≥3)的第20项
a, b, c = 1, 0, 0 # 初始值:a₁=1
for i in range(1, 21):
if i >= 2:
c = b # 保存前一项的值
b = a # 更新前一项为当前项
a = a + c # 计算当前项
print(f"数列第20项为:{a}")
十八、公倍数筛选与格式化输出
# 找出1~999中同时被3、5、7整除的数,并每行输出6个
count = 0
for i in range(1, 1000):
if i % 3 == 0 and i % 5 == 0 and i % 7 == 0:
print(i, end='\t')
count += 1
if count % 6 == 0:
print() # 每6个数换行
十九、数学问题求解
# 求解满足条件的最小正整数:加100后是完全平方数,再加168仍是完全平方数
i = 1
while True:
if (int((i + 100) ** 0.5) ** 2 == i + 100 and
int((i + 268) ** 0.5) ** 2 == i + 268):
print(f"满足条件的最小数是:{i}")
break
i += 1
二十、数字组合排列
# 输入三个数字,生成所有可能的三位数排列(不重复使用数字)
a = int(input('请输入第一个数字:'))
b = int(input('请输入第二个数字:'))
c = int(input('请输入第三个数字:'))
digits = [a, b, c]
for i in digits:
for j in digits:
for k in digits:
if i != j and i != k and j != k: # 确保三个数字不同
print(f"{i}{j}{k}")
总结
这些练习题涵盖了 Python 循环结构、条件判断、位运算、数学计算等基础知识点。通过实践,可以加深对以下概念的理解:
- 循环控制:
for和while的使用场景,break和continue的作用; - 数学运算:阶乘、约数、完全平方数等计算方法;
- 字符串处理:数字与字符串的转换,字符编码;
- 位运算:通过二进制位操作实现图形绘制;
- 算法思想:递归、倒推、筛选等基础算法思路。
掌握这些基础操作后,可以进一步学习函数封装、模块化编程和更复杂的算法设计。
更多推荐
所有评论(0)