Skip to content

Python 流程控制综合练习 ​

前面我们已经学了:

  1. if 条件判断
  2. while 循环
  3. for 循环
  4. break 和 continue

本节不引入新语法,重点练习如何把需求拆成“判断 + 循环”的代码步骤。

解题时先不要急着写代码,按下面的顺序分析:

  1. 找出需要重复执行的任务
  2. 确定循环范围或结束条件
  3. 判断循环中是否需要分支
  4. 准备保存结果的变量
  5. 运行代码,检查边界值

流程控制解题心智模型与五步拆解流

练习一:偶数求和 ​

需求:计算 0~100 之间所有偶数的和,包含 0 和 100。

先把任务拆成四步:

  1. 准备变量 total 保存累加结果
  2. 使用循环依次取得需要计算的数字
  3. 把偶数累加到 total
  4. 循环结束后输出结果

这道题可以使用多种写法。先独立完成,再对照三种实现。

参考代码
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
    *
   ***
  *****
 *******
*********
 *******
  *****
   ***
    *

写代码前,先分析每行的组成:

  1. 当前行需要多少个空格
  2. 当前行需要多少颗星
  3. 行号增加后,空格和星号怎样变化

例如,正右角形的第 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 和它本身整除的整数。

判断一个数字是不是素数,需要两层循环:

  1. 外层循环依次取得 2 到 100
  2. 内层循环检查当前数字能否被其他整数整除
  3. 如果找到其他因数,当前数字就不是素数

素数因数探测全景流与 for-else 守卫分支拓扑图

下面给出三种写法。它们的判断思路不同,但运行结果相同。

参考代码
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) 默认每次换行。这里为了节省篇幅,把结果排成了两行,数字本身相同。

小结 ​

这三道练习主要训练四个方面:

  1. 先把需求拆成循环范围、判断条件和结果变量
  2. 根据任务选择 while 或 for
  3. 用嵌套循环控制行列或逐个检查候选数字
  4. 看懂 break 和循环 else 怎样配合

如果不知道如何开始,先用自然语言写出每一步,再逐步转换为代码。代码运行后,还要检查起始值、结束值和最后一次循环是否符合需求。