Python 流程控制综合练习
前面我们已经学了:
if条件判断while循环for循环break和continue
本节不引入新语法,重点练习如何把需求拆成“判断 + 循环”的代码步骤。
解题时先不要急着写代码,按下面的顺序分析:
- 找出需要重复执行的任务
- 确定循环范围或结束条件
- 判断循环中是否需要分支
- 准备保存结果的变量
- 运行代码,检查边界值
练习一:偶数求和
需求:计算 0~100 之间所有偶数的和,包含 0 和 100。
先把任务拆成四步:
- 准备变量
total保存累加结果 - 使用循环依次取得需要计算的数字
- 把偶数累加到
total - 循环结束后输出结果
这道题可以使用多种写法。先独立完成,再对照三种实现。
参考代码
python
number = 0
total = 0
while number <= 100:
if number % 2 == 0:
total += number
number += 1
print(total)python
number = 0
total = 0
while number <= 100:
total += number
number += 2
print(total)python
total = 0
for number in range(0, 101, 2):
total += number
print(total)三种方法都会得到:
text
2550- 方法一依次检查
0到100,适合练习循环与判断 - 方法二只处理偶数,减少了不必要的判断
- 方法三直接使用
range()确定范围和步长,代码更紧凑
练习二:打印三角形和菱形
本题练习嵌套循环:外层循环控制行,内层循环控制每一行的空格和星号。
本题要求依次打印以下五种图形。
正左角形
text
*
**
***
****
*****倒左角形
text
*****
****
***
**
*正右角形
text
*
**
***
****
*****倒右角形
text
*****
****
***
**
*菱形
text
*
***
*****
*******
*********
*******
*****
***
*写代码前,先分析每行的组成:
- 当前行需要多少个空格
- 当前行需要多少颗星
- 行号增加后,空格和星号怎样变化
例如,正右角形的第 row 行需要 5 - row 个空格和 row 颗星。
参考代码
python
print("-------正左角形--------")
for row in range(1, 6):
# 行号是多少,就打印多少颗星
for _ in range(row):
print("*", end="")
print()
print("-------倒左角形--------")
for row in range(5, 0, -1):
for _ in range(row):
print("*", end="")
print()
print("-------正右角形--------")
for row in range(1, 6):
# 先打印左侧空格
for _ in range(5 - row):
print(" ", end="")
# 再打印当前行的星号
for _ in range(row):
print("*", end="")
print()
print("-------倒右角形--------")
for row in range(5, 0, -1):
for _ in range(5 - row):
print(" ", end="")
for _ in range(row):
print("*", end="")
print()
print("-------菱形--------")
half_height = 5
# 打印菱形上半部分,包含中间最宽的一行
for row in range(1, half_height + 1):
for _ in range(half_height - row):
print(" ", end="")
for _ in range(2 * row - 1):
print("*", end="")
print()
# 打印菱形下半部分,不再重复中间行
for row in range(half_height - 1, 0, -1):
for _ in range(half_height - row):
print(" ", end="")
for _ in range(2 * row - 1):
print("*", end="")
print()菱形要分成上下两部分。上半部分包含最宽的一行,下半部分从倒数第二宽的行开始,避免重复打印中间行。
练习三:打印素数
需求:打印 100 以内的所有素数。
素数可以先简单理解为:
大于 1,并且只能被 1 和它本身整除的整数。
判断一个数字是不是素数,需要两层循环:
- 外层循环依次取得
2到100 - 内层循环检查当前数字能否被其他整数整除
- 如果找到其他因数,当前数字就不是素数
下面给出三种写法。它们的判断思路不同,但运行结果相同。
参考代码
python
for number in range(2, 101):
factor_count = 0
for divisor in range(1, number + 1):
if number % divisor == 0:
factor_count += 1
if factor_count == 2:
print(number)python
for number in range(2, 101):
is_prime = True
for divisor in range(2, number):
if number % divisor == 0:
is_prime = False
break
if is_prime:
print(number)python
for number in range(2, 101):
for divisor in range(2, number):
if number % divisor == 0:
break
else:
print(number):::
三种方法的区别:
- 方法一统计所有因数,判断过程最直观
- 方法二找到其他因数后立即
break,并使用is_prime保存结果 - 方法三省去布尔变量:内层循环没有被
break打断时,才执行else
运行结果:
text
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代码中的 print(number) 默认每次换行。这里为了节省篇幅,把结果排成了两行,数字本身相同。
小结
这三道练习主要训练四个方面:
- 先把需求拆成循环范围、判断条件和结果变量
- 根据任务选择
while或for - 用嵌套循环控制行列或逐个检查候选数字
- 看懂
break和循环else怎样配合
如果不知道如何开始,先用自然语言写出每一步,再逐步转换为代码。代码运行后,还要检查起始值、结束值和最后一次循环是否符合需求。