循环结构

对应教学日历:讲次 3-4


一、while 循环

while 条件表达式:
    语句组

注意事项

  • 条件表达式可以是任意类型
  • 循环体中语句组有可能一次也不执行
  • 程序中需要包含使循环结束的语句

死循环

while True:
    print("我喜欢Python")  # 永远执行

计算1-100之和

total = 0
t = 1
while t <= 100:
    total = total + t
    t = t + 1
print(total)

二、for 循环

for 循环变量 in 对象:
    语句块

可以迭代的对象:字符串、列表、元组、字典、range()

计算1-100之和

total = 0
for t in range(1, 101):
    total = total + t
print(total)

range() 函数

range(start, end, step)    # 半开区间,不包括end
示例结果
range(5)0, 1, 2, 3, 4
range(4, 10, 2)4, 6, 8
range(1, 101)1, 2, ..., 100
range(100, 1, -2)100, 98, ..., 2

三、循环中断语句

break

中断循环的执行,跳出循环体

i = 0
while i <= 5:
    i = i + 1
    if i % 2 == 0:
        break          # i=2时跳出循环
    print("我喜欢Python")
# 输出:我喜欢Python(只打印1次)

continue

中断本次循环,进入下一次循环判断

i = 0
while i <= 5:
    i = i + 1
    if i % 2 == 0:
        continue       # i为偶数时跳过print
    print("我喜欢Python")
# 输出:我喜欢Python ×3(i=1,3,5时打印)

四、九九乘法表

for i in range(1, 10):
    for j in range(1, 10):
        print("%d*%d=%2d" % (i, j, i * j), end=" ")
    print()

五、图形打印

菱形

# 上半部分
for i in range(1, 5):
    print(" " * (4 - i), end="")
    print("*" * (2 * i - 1))
# 下半部分
for i in range(1, 4):
    print(" " * i, end="")
    print("*" * (7 - 2 * i))

字符菱形(输入行数)

fh = input("请输入一个字符:")
n = int(input("请输入上三角行数:"))
for i in range(n):
    print(" " * (n - i - 1), end="")
    print(fh * (2 * i + 1))
for i in range(n - 1):
    print(" " * (i + 1), end="")
    print(fh * (2 * (n - i - 1) - 1))

奇数字母菱形

line = int(input("请输入行数:"))
while line % 2 == 0:
    line = int(input("请输入奇数:"))
n = (line + 1) // 2
for i in range(n):
    print(" " * (n - i - 1), end='')
    print(chr(65 + i) * (2 * i + 1))
for i in range(n - 1):
    print(" " * (i + 1), end='')
    print(chr(65 + n - i - 2) * (2 * (n - i - 1) - 1))

作业示例

百钱买百鸡

for x in range(21):
    for y in range(34):
        z = 100 - x - y
        if 5 * x + 3 * y + z / 3 == 100:
            print("%3d\t%3d\t%3d" % (x, y, z))

要点

  • 穷举法:公鸡最多20只,母鸡最多33只
  • 5*x + 3*y + z/3 == 100 满足总价100文

好人好事问题(逻辑推理)

for p in "ABCD":
    if (p != 'A') + (p == 'C') + (p == 'D') + (p != 'D') == 3:
        print(p)

要点

  • 利用布尔值为1/0的特性,4个条件中恰好3个为真
  • 遍历4种可能,找到满足条件的答案

作业重点

  • while 先判断后执行,for 用于遍历序列
  • range(start, end, step) 半开区间,不包括end
  • break 终止整个循环,continue 跳过本次循环
  • 九九乘法表:双重 for 循环,内层 range(1, 10)
  • 图形打印:用 " " * n 控制缩进,"*" * n 控制图形
  • 穷举法:遍历所有可能,用条件筛选满足要求的解
  • chr(65) = ‘A’,chr(65+i) 可生成连续字母