1. Python循环结构练习题精解:从入门到实战
作为一名有多年Python教学经验的开发者,我深知循环结构是编程基础中的重中之重。今天我将通过10个经典练习题,带大家深入掌握Python的循环应用技巧。这些题目覆盖了for循环和while循环的各种使用场景,每个题目我都将提供详细的解析思路和优化建议。
2. 基础循环练习题解析
2.1 数字序列求和
题目要求:计算1+2+3+...+100的和
这是最基础的循环练习题,主要考察对循环累加的理解。我们可以使用for循环配合range函数实现:
python复制total = 0
for i in range(1, 101):
total += i
print(total)
注意:range的结束值是不包含的,所以需要写到101才能包含100
优化技巧:
- 使用内置sum函数可以更简洁:
sum(range(1, 101)) - 数学公式法:(首项+末项)*项数/2,即
(1+100)*100//2
2.2 偶数求和
题目要求:计算1到100之间所有偶数的和
这个题目在基础求和之上增加了条件判断,有两种典型解法:
python复制# 方法1:使用if判断
sum_even = 0
for num in range(1, 101):
if num % 2 == 0:
sum_even += num
# 方法2:调整range步长
sum_even = sum(range(2, 101, 2))
性能对比:
- 方法1需要进行100次循环和条件判断
- 方法2只需50次循环,效率更高
2.3 九九乘法表
题目要求:打印标准的九九乘法表
这个题目需要用到嵌套循环,是理解循环层次结构的经典案例:
python复制for i in range(1, 10):
for j in range(1, i+1):
print(f"{j}x{i}={i*j}", end="\t")
print()
输出格式说明:
end="\t"保证每列对齐- 外层循环控制行,内层循环控制每行的列数
- 使用f-string格式化输出更清晰
3. 中级循环练习题精讲
3.1 水仙花数查找
题目要求:找出100-999之间的水仙花数(各位数字立方和等于该数本身)
python复制for num in range(100, 1000):
# 分离各位数字
hundreds = num // 100
tens = (num % 100) // 10
ones = num % 10
if hundreds**3 + tens**3 + ones**3 == num:
print(num)
算法优化:
- 预计算立方值减少重复计算
- 使用divmod函数同时获取商和余数:
python复制hundreds, remainder = divmod(num, 100) tens, ones = divmod(remainder, 10)
3.2 质数判断
题目要求:输入一个正整数,判断是否是质数
质数判断是经典的算法问题,有多种优化思路:
python复制def is_prime(n):
if n < 2:
return False
for i in range(2, int(n**0.5)+1):
if n % i == 0:
return False
return True
优化点:
- 只需检查到√n即可
- 可以跳过偶数检查
- 使用埃拉托斯特尼筛法预处理质数表
3.3 数列求和
题目要求:计算数列1/2 + 2/3 + ... + n/(n+1)的前n项和
这个题目考察浮点数累加和公式推导:
python复制n = int(input("请输入n:"))
total = 0.0
for i in range(1, n+1):
total += i / (i + 1)
print(total)
注意事项:
- 使用浮点数避免整数除法问题
- 大数相加可能存在精度损失
- 数学推导可以表示为n - H_{n+1} + 1(H为调和数)
4. 高级循环应用实战
4.1 图形打印(三角形)
题目要求:打印指定层数的星号三角形
python复制rows = 5
for i in range(1, rows+1):
print(" "*(rows-i) + "*"*(2*i-1))
扩展思考:
- 如何打印空心三角形?
- 如何打印菱形?
- 使用递归实现图形打印
4.2 数字反转
题目要求:输入正整数,输出其各位数字反转后的数
python复制num = int(input("请输入正整数:"))
reversed_num = 0
while num > 0:
reversed_num = reversed_num * 10 + num % 10
num = num // 10
print(reversed_num)
边界情况:
- 处理末尾有0的数字
- 处理超大整数
- 字符串反转法(非数学方法)
4.3 最大公约数
题目要求:求两个正整数的最大公约数
欧几里得算法是最优解:
python复制def gcd(a, b):
while b:
a, b = b, a % b
return a
算法分析:
- 时间复杂度O(log min(a,b))
- 可以递归实现
- 与最小公倍数的关系:lcm(a,b) = a*b//gcd(a,b)
4.4 猜数字游戏
题目要求:实现一个猜数字游戏,最多7次机会
python复制import random
target = random.randint(1, 100)
attempts = 0
while attempts < 7:
guess = int(input("请输入你的猜测:"))
attempts += 1
if guess == target:
print(f"恭喜!你在{attempts}次内猜对了!")
break
elif guess < target:
print("猜小了")
else:
print("猜大了")
else:
print(f"很遗憾,正确答案是{target}")
游戏设计技巧:
- 添加难度级别(调整数字范围)
- 记录最佳成绩
- 添加输入验证
- 实现GUI版本
5. 综合提升练习
5.1 斐波那契数列
进阶题目:生成斐波那契数列前n项
python复制def fibonacci(n):
a, b = 0, 1
for _ in range(n):
print(a, end=" ")
a, b = b, a + b
优化方向:
- 使用生成器节省内存
- 矩阵快速幂算法(O(logn)时间复杂度)
- 闭包实现无限序列
5.2 字符统计
进阶题目:统计字符串中各字符出现次数
python复制text = "hello world"
count = {}
for char in text:
count[char] = count.get(char, 0) + 1
Pythonic写法:
- 使用collections.Counter
- 字典推导式
- 处理unicode字符
6. 学习建议与经验分享
根据我多年的教学经验,掌握循环结构需要注意以下几点:
- 理解循环三要素:初始化、终止条件、迭代步骤
- 多画流程图:复杂循环建议先画流程图理清逻辑
- 调试技巧:在循环内打印关键变量值,观察执行过程
- 避免常见陷阱:
- 无限循环(确保终止条件可达)
- 修改迭代中的集合(创建副本)
- 不必要的嵌套循环(考虑算法优化)
对于想进一步提升的同学,我建议尝试:
- 用循环实现各种排序算法
- 解决Project Euler上的数学问题
- 参与编程竞赛(如LeetCode周赛)
最后分享一个实用技巧:在Jupyter Notebook中使用%%timeit魔法命令测试不同循环实现的性能差异,这对理解算法效率很有帮助。