控制流

Python 的条件语句与循环:if/elif/else 分支、while 循环、for 循环与 range 函数的使用方法。

If、Elif、Else

条件语句由 if、elif 和 else 构成。if 语句由一个谓词和一个过程体组成,谓词满足时执行过程体。elif 是 “else if” 的缩写,用于第一个 if 之后的附加条件,结构和 if 类似。else 语句跟在所有 if 和 elif 之后,当前面的条件都不满足时触发。

if、elif 和 else 用缩进和冒号把代码恰当地分块。直接往解释器里输入时,结束时需要输入一个缩进与首行相同的空行来结束条件语句。

>>> if False:
...    3
... elif True:
...    4
... else:
...    5
... 
4
  • 第 1 行:(0 空格缩进)if 条件
  • 第 2 行:(3 空格缩进)if 过程体
  • 第 3 行:(0 空格缩进)else if 条件
  • 第 4 行:(3 空格缩进)else if 过程体
  • 第 5 行:(0 空格缩进)else
  • 第 6 行:(3 空格缩进)else 过程体
  • 第 7 行:(0 空格缩进)空行,结束 if 块并触发求值
  • 第 8 行:返回 4(if 分支被跳过,触发了 elif 分支,永远走不到 else 分支)

注意这里没有用 return 语句,因为条件语句在过程定义之外。如果在函数体内,且你希望返回某个值,这里写的就会是 return 3 而不是 3,以此类推。

笔记

作业题 3:Fizz Buzz

写一个程序,打印从 1 到 n 的整数(n 是过程的参数)。但遇到 3 的倍数时,不打印数字,改打印 “Fizz”;遇到 5 的倍数时打印 “Buzz”;3 和 5 的公倍数则打印 “FizzBuzz”。

循环与 Range

Python 支持循环(loop)。循环把一段代码重复执行多次。当你需要遍历一个序列,或者重复某个操作时,循环很有用——用循环来迭代,别用递归。for 循环通过控制迭代次数来对应要遍历的序列元素;while 循环则用谓词来控制迭代次数。

循环中还可以用一些控制语句来中断循环或跳到下一次迭代:break 负责前者,continue 负责后者。需要示例的话,请查阅在线资料。

while 循环

while 循环包含一个谓词,每一轮迭代开始前都会检查它。谓词不满足时,while 循环就停止。while 块用冒号和缩进来标示哪些是头部、哪些是过程体:

>>> x = 0
>>> while x < 3:
...    print("repeat")
...    x += 1
... 
hello
hello
hello
>>> x        # 看看 x 现在是多少
3
  • 第 1 行:定义变量 x,值为 0
  • 第 2 行:(0 空格)while 头部,条件为 x 小于 3
  • 第 3 行:(3 空格)while 过程体,调用 print
  • 第 4 行:(3 空格)while 过程体,把 x 加 1(x += 1 等同于 x = x + 1)
  • 第 5 行:(0 空格)空行,结束 while 块并对块求值
  • 第 6 行:打印 hello(此时 x = 0)
  • 第 7 行:打印 hello(此时 x = 1)
  • 第 8 行:打印 hello(此时 x = 2)
  • 第 9 行:查看 x 的值
  • 第 10 行:x 的值为 3(此时已不小于 3)

笔记

作业题 4:白雪公主和七个小矮人

写一个名为 snow_white 的程序,接受两个数字参数:第一个是 num_chants,第二个是 max_sing。

程序功能:

  1. 交替打印 “heigh” 和 “ho”
  2. 每喊完 num_chants 次 “heigh” 或 “ho”,打印一次 “its off to work we go”
  3. “it’s off to work we go” 打印满 max_sing 次后就停止

示例:每 5 次交替的 “hi” 和 “ho” 之间打印一次 “it’s off to work we go”,最多打印 2 次。

>>> snow_white(5, 2)
heigh
ho
heigh
ho
heigh
it's off to work we go
ho
heigh
ho
heigh
ho
it's off to work we go

请用 while 循环(可能还要用到控制语句)实现这个行为。

笔记

作业题 5:把第一个奇数挪到队尾(改编自 CS10)

写一个名为 push_first_odd_back 的函数,接受一个列表作为参数。这个函数要把输入列表中的第一个奇数放到列表末尾。不要返回新列表——事实上这个函数不该返回任何东西,它只应该修改输入列表。(提示:用 while 循环)

for 循环

for 循环包含一个变量和一个序列(后面细讲)。每迭代一次,变量的值就变成序列中的下一个值。和其他多行块一样,for 循环用冒号和缩进分块,用空行结束。在 for 循环的过程体中,你可以访问正在迭代的变量。

range 函数生成一个数字序列,可以在 for 循环中用作控制。range 接受起始值、结束值和步长,生成一个从起始值开始、包含中间各步、但不包含结束值的序列。不提供时,起始值默认为 0,步长默认为 1。目前,请只在 for 循环里用 range,本课后面会深入讲解 range 的工作原理。

提示

如果你只想要 x 次迭代,并不打算使用迭代变量,那就用 range(x)

>>> for i in range(2):     # 等同于做两次
...    print "hello"
... 
hello
hello
>>> for i in range(3):     # i 依次是 0、1、2
...    print i
... 
0
1
2
>>> for i in range(2, 6, 2):  # 从 2 开始,到 6 之前停止,步长 2
...    print(i)
... 
2
4

除了 range,你也可以用字符串或列表来迭代:

>>> sum = 0
>>> for number in [1,5,8]:    # 遍历列表
...    sum += number
... 
>>> sum
14
>>> longer_string = ""
>>> for letter in "apple":    # 遍历字符串
...    longer_string += letter * 3
... 
>>> longer_string
'aaappppppllleee'

笔记

作业题 6:猫和狗

写一个程序,如果给定字符串中 “cat” 和 “dog” 出现的次数相同,就返回 True。

cat_dog('catdog') → True
cat_dog('catcat') → False
cat_dog('1cat1cadodog') → True