控制流
在我们目前看到的程序中,语句总是按照从上到下的精确顺序被 Python 忠实地执行。如果你想改变程序的执行流程呢?例如,你希望程序根据不同的情况做出不同的决策,比如根据一天中的不同时间打印"早上好"或"晚上好"?
你可能已经猜到了,这可以通过控制流语句来实现。Python 中有三种控制流语句——if、for 和 while。
if 语句
if 语句用来检查一个条件:如果条件为真,我们就运行一个语句块(称为 if 块),否则我们处理另一个语句块(称为 else 块)。else 子句是可选的。
示例(保存为 if.py):
number = 23
guess = int(input('Enter an integer : '))
if guess == number:
# New block starts here
print('Congratulations, you guessed it.')
print('(but you do not win any prizes!)')
# New block ends here
elif guess < number:
# Another block
print('No, it is a little higher than that')
# You can do whatever you want in a block ...
else:
print('No, it is a little lower than that')
# you must have guessed > number to reach here
print('Done')
# This last statement is always executed,
# after the if statement is executed.
输出:
$ python if.py
Enter an integer : 50
No, it is a little lower than that
Done
$ python if.py
Enter an integer : 22
No, it is a little higher than that
Done
$ python if.py
Enter an integer : 23
Congratulations, you guessed it.
(but you do not win any prizes!)
Done
工作原理
在这个程序中,我们接收用户的猜测,并检查它是否是我们设定的数字。我们将变量 number 设置为我们想要的任何整数,比如 23。然后,我们使用 input() 函数获取用户的猜测。函数就是可重复使用的程序片段。我们将在下一章中了解更多关于函数的知识。
我们向内置的 input 函数提供一个字符串,它会将其打印到屏幕上并等待用户输入。一旦我们输入内容并按下 kbd:[Enter] 键,input() 函数就会以字符串的形式返回我们输入的内容。然后我们使用 int 将这个字符串转换为整数,并将其存储在变量 guess 中。实际上,int 是一个类,但你现在只需要知道可以用它来将字符串转换为整数(假设字符串中包含有效的整数值)。
接下来,我们将用户的猜测与我们选择的数字进行比较。如果它们相等,我们就打印一条成功消息。请注意,我们使用缩进层级来告诉 Python 哪些语句属于哪个块。这就是为什么缩进在 Python 中如此重要。希望你一直在遵守"一致的缩进"规则。是吗?
注意 if 语句的末尾包含一个冒号——我们在告诉 Python 后面跟着一个语句块。
然后,我们检查猜测是否小于那个数字,如果是,我们通知用户需要猜得更大一些。我们在这里使用的是 elif 子句,它实际上将两个相关的 if else-if else 语句组合成一个 if-elif-else 语句。这使得程序更简洁,也减少了所需的缩进量。
elif 和 else 语句也必须在逻辑行的末尾有一个冒号,后面跟着相应的语句块(当然要有正确的缩进)。
你可以在 if 语句的 if 块中再嵌套一个 if 语句,以此类推——这被称为嵌套 if 语句。
请记住,elif 和 else 部分是可选的。一个最小的有效 if 语句是:
if True:
print('Yes, it is true')
在 Python 执行完完整的 if 语句以及相关的 elif 和 else 子句后,它会继续执行包含该 if 语句的块中的下一条语句。在这个例子中,就是主块(程序开始执行的地方),下一条语句是 print('Done') 语句。之后,Python 看到程序结束,就完成了运行。
虽然这是一个非常简单的程序,但我一直在指出很多你应该注意的细节。所有这些都相当直观(对于有 C/C++ 背景的人来说,甚至简单得出奇)。你最初需要了解所有这些细节,但经过一些练习后,你会变得很习惯,一切对你来说都会变得"自然"。
给 C/C++ 程序员的提示
Python 中没有
switch语句。你可以使用if..elif..else语句来实现同样的功能(在某些情况下,可以使用字典来快速实现)。
while 语句
while 语句允许你只要条件为真就重复执行一个语句块。while 语句是所谓循环语句的一个例子。while 语句可以有一个可选的 else 子句。
示例(保存为 while.py):
number = 23
running = True
while running:
guess = int(input('Enter an integer : '))
if guess == number:
print('Congratulations, you guessed it.')
# this causes the while loop to stop
running = False
elif guess < number:
print('No, it is a little higher than that.')
else:
print('No, it is a little lower than that.')
else:
print('The while loop is over.')
# Do anything else you want to do here
print('Done')
输出:
$ python while.py
Enter an integer : 50
No, it is a little lower than that.
Enter an integer : 22
No, it is a little higher than that.
Enter an integer : 23
Congratulations, you guessed it.
The while loop is over.
Done
工作原理
在这个程序中,我们仍然在玩猜数字游戏,但好处是用户可以不断猜测,直到猜对为止——不需要像我们在上一节中那样为每次猜测反复运行程序。这很好地演示了 while 语句的用法。
我们将 input 和 if 语句移到 while 循环内部,并在 while 循环之前将变量 running 设置为 True。首先,我们检查变量 running 是否为 True,然后继续执行相应的 while 块。这个块执行完毕后,会再次检查条件,在这个例子中就是 running 变量。如果为真,我们再次执行 while 块,否则我们继续执行可选的 else 块,然后继续下一条语句。
当 while 循环条件变为 False 时,else 块会被执行——这甚至可能是第一次检查条件的时候。如果 while 循环有一个 else 子句,除非你用 break 语句跳出循环,否则它总是会被执行。
True 和 False 被称为布尔类型,你可以将它们分别视为等价于值 1 和 0。
给 C/C++ 程序员的提示
记住,
while循环也可以有一个else子句。
for 循环
for..in 语句是另一种循环语句,它对一个对象序列进行迭代(iterate),即遍历序列中的每个项目。我们将在后面的章节中详细了解序列。你现在只需要知道序列就是一个有序的项目集合。
示例(保存为 for.py):
for i in range(1, 5):
print(i)
else:
print('The for loop is over')
输出:
$ python for.py
1
2
3
4
The for loop is over
工作原理
在这个程序中,我们打印一个数字序列。我们使用内置的 range 函数来生成这个数字序列。
我们在这里做的是向它提供两个数字,range 返回一个从第一个数字开始到第二个数字结束的数字序列。例如,range(1,5) 给出序列 [1, 2, 3, 4]。默认情况下,range 的步长为 1。如果我们向 range 提供第三个数字,那么它就变成步长。例如,range(1,5,2) 给出 [1,3]。请记住,range 的范围延伸到第二个数字,即它不包含第二个数字。
请注意,range() 每次只生成一个数字,如果你想获得完整的数字列表,可以在 range() 上调用 list(),例如,list(range(5)) 将得到 [0, 1, 2, 3, 4]。列表将在数据结构章节中解释。
然后 for 循环对这个范围进行迭代——for i in range(1,5) 等同于 for i in [1, 2, 3, 4],就像将序列中的每个数字(或对象)依次赋值给 i,然后为 i 的每个值执行语句块。在这个例子中,我们只是在语句块中打印值。
请记住,else 部分是可选的。当包含它时,它总是在 for 循环结束后执行一次,除非遇到 break 语句。
请记住,for..in 循环适用于任何序列。在这里,我们有一个由内置 range 函数生成的数字列表,但一般来说,我们可以使用任何类型的对象序列!我们将在后面的章节中详细探讨这个概念。
给 C/C++/Java/C# 程序员的提示
Python 的
for循环与 C/C++ 的for循环截然不同。C# 程序员会注意到 Python 的for循环类似于 C# 中的foreach循环。Java 程序员会注意到它类似于 Java 1.5 中的for (int i : IntArray)。在 C/C++ 中,如果你想写
for (int i = 0; i < 5; i++),那么在 Python 中你只需写for i in range(0,5)。如你所见,Python 中的for循环更简单、更具表达力,也不容易出错。
break 语句
break 语句用来跳出循环语句,即停止循环语句的执行,即使循环条件还没有变为 False 或者序列中的项目还没有被完全遍历。
需要注意的是,如果你从 for 或 while 循环中 break 出来,任何相应的循环 else 块都不会被执行。
示例(保存为 break.py):
while True:
s = input('Enter something : ')
if s == 'quit':
break
print('Length of the string is', len(s))
print('Done')
输出:
$ python break.py
Enter something : Programming is fun
Length of the string is 18
Enter something : When the work is done
Length of the string is 21
Enter something : if you wanna make your work also fun:
Length of the string is 37
Enter something : use Python!
Length of the string is 11
Enter something : quit
Done
工作原理
在这个程序中,我们反复获取用户的输入,并每次打印输入的长度。我们通过检查用户输入是否为 'quit' 来提供一个特殊的停止条件。我们通过 break 跳出循环来停止程序,到达程序的末尾。
输入字符串的长度可以使用内置的 len 函数来获取。
请记住,break 语句也可以与 for 循环一起使用。
Swaroop 的诗意 Python
我在这里使用的输入是我写的一首小诗:
Programming is fun
When the work is done
if you wanna make your work also fun:
use Python!
continue 语句
continue 语句用来告诉 Python 跳过当前循环块中剩余的语句,继续到循环的下一次迭代。
示例(保存为 continue.py):
while True:
s = input('Enter something : ')
if s == 'quit':
break
if len(s) < 3:
print('Too small')
continue
print('Input is of sufficient length')
# Do other kinds of processing here...
输出:
$ python continue.py
Enter something : a
Too small
Enter something : 12
Too small
Enter something : abc
Input is of sufficient length
Enter something : quit
工作原理
在这个程序中,我们接受用户的输入,但只有当输入字符串长度至少为 3 个字符时才进行处理。因此,我们使用内置的 len 函数来获取长度,如果长度小于 3,我们使用 continue 语句跳过块中剩余的语句。否则,循环中剩余的语句会被执行,执行我们想要进行的任何处理。
请注意,continue 语句也可以与 for 循环一起使用。
小结
我们已经了解了如何使用三种控制流语句——if、while 和 for,以及它们相关的 break 和 continue 语句。这些是 Python 中最常用的部分之一,因此熟练掌握它们是至关重要的。
接下来,我们将学习如何创建和使用函数。