Skip to content

Latest commit

 

History

History
146 lines (76 loc) · 9.42 KB

control_flow.md

File metadata and controls

146 lines (76 loc) · 9.42 KB

控制流 control flow {#control-flow}

迄今,我们所看到的程序中,基本都是一系列的语句,由 python 准确的按照从上至下的顺序执行。如果你想改变这个执行顺序,该怎么做?例如,你想要程序能够做出选择,根据不同的情况采取不同的行为,例如,根据当前时间打印“早上好”或“晚上好”?

也行正如你猜想的那样,这可正是控制流语句的用武之地。python 中有三种控制流语句——ifforwhile

if else

if 语句能检查某条件:如果这条件是真的,我们运行被称为 if-block 的语句块,else 否则我们执行被称为 else-block 的语句块。else 语句是可选的。

请看示例 if.py

{% include "./programs/if.py" %}

输出为:

{% include "./programs/if.txt" %}

它是怎样做的

本程序中,我们得到用户的猜测的数字并且检查是否是我们已选的数字。我们将变量 number 设为任意整数,如 23 。然后,我们使用 input() 函数得到用户输入的猜测数字。函数是可复用的程序段。我们将在下一章中更多的了解它们。

我们为内置的 input 函数提供一个字符串。input 会将这个字符串打印到屏幕上,并且等待用户的输入。当我们输入完,并且按下 [enter] 键,input 函数将返回保存我们输入的字符串。之后,我们使用 int 将此字符串转换为整数再将之储存在变量 guess 中。实际上,int 是一个类 (class) 但现在你所要知道的就是你可以用它将字符串转换为整数(前提是这个字符串是某个有效整数的文本形式)。

下面,我们比较用户猜测的数字以及我们所选的数字。如果它们相等,就打印成功的信息。请注意,我们使用缩进层次来告知 python 哪个语句归属于哪个块。这也是为何缩进在 pyuthon 中如此重要。我希望你能坚持“一致缩进”的准则。你会的,对吧?

然后,我们检查猜测的数字是否小于已选数字,如果是,我们通知用户他们必须往大点猜。这里的 elif 语句实际上是将 if else if else 合并成 if elif else 的简写。这使得程序更简化并且能适度减少所需要的缩进量。

elifelse 语句必须在逻辑行的末尾使用分号,并在之后接相应的语句块(当然,要有正确的缩进)。

你也可以在某个 if 的 if-block 中使用另一个 if 语句甚至依此循环——这叫做嵌套 if 语句。

请记好, elifelse 都是可选的。if 语句的最简短形式类似这样的:

if True:
    print('Yes, it is true')

python 执行完 if 语句以及它相关联的 elifelse 语句之后,它会接着执行包含了 if 语句的块之后的语句。前例中,也就是主块(程序的起始之处),之后的语句是 print('Done') 语句。这之后,python 看到了程序的结尾,就结束了。

尽管这是个非常简单的程序,我还是要指出很多你需要注意的地方。所有这些都是很通俗易懂的(对那些有 c 或 c++ 背景的出奇的容易)。初期,你需要了解这许多东西,但经过一系列练习之后,你就会熟悉它们,那时你会感觉很舒适,很自然。

python 中没有 switch 语句。你可以通过 ifelse 语句的重复使用来完成同样的事情。(某些情形之下,使用 字典 dictionary 会更快)

while

while 语句,只要条件是真,那么你可以重复执行某语句块。while循环 (looping) 语句中的一种。while 语句也可以有可选的 else 语句。

请看示例 while.py

{% include "./programs/while.py" %}

输出为:

{% include "./programs/while.txt" %}

它是怎样做的

在这个程序中,我们接着玩猜数字的游戏,但是我们将它稍稍改进了一些,用户可以保留猜过的数字直到他猜对——我们不必像上一节中那样每次猜数都重新运行程序。这巧妙的阐释了 while 语句的作用。

我们将 inputif 语句放入 while 循环并在循环开始前将变量 running 设为 True 。我们先检测running 是否为 True ,然后执行相应的 while-block 。这个块执行之后,在此检测循环条件,本例中是 running 变量。如果它是真,那么我们再次执行 while-block ,不然我们接着执行可选的 else-block ,之后再顺次执行下面的语句。

while 的循环条件变为 False 时,else 块将会被执行——甚至初次检测循环条件时也如此。如果 while 循环有 else 语句,那么如果你不用 break 跳出循环的话,它总能得到执行。

TrueFalse 被称为布尔 (Boolean) 类型,你可以把它们想象成值 10

请记住,你的 while 循环也有 else ,到后面你会发现,try..except 也有 else 。 Guido van Rossum 有点意思,看来他偏爱 else

for

for..in 语句是另一种循环语句,它能在对象序列中进行迭代 (iterate) ,即遍历序列中的每个项 (item) 。我们会从后面的章节 序列 sequences 做更多的了解。你现在仅需要知道序列是一些项的有序集合。

请看示例 for.py

{% include "./programs/for.py" %}

输出为:

{% include "./programs/for.txt" %}

它是怎样做的

本示例中,我们打印出一个序列数字。我们使用内置的 range 函数来生成这个数字序列。

我们提供两个数,range 就能返回一个始于第一个数止于第二个数的数字序列。例如,range(1,5) 会得到 1 , 2 , 3 , 4 。默认的,range 取 1 作为步长 (step) 。如果我们给了 range 第三个数,那它就会使补偿。例如,range(1,5,2) 得出 1 ,3 。一定要记好,range 的这个范围止于第二个数,也就是说不包含第二个数。

请注意 range() 每次只返回一个数,如果你想要所有数的列表,你可以在 range() 上调用 list() ,例如,list(range(5)) 将会得到 [0, 1, 2, 3, 4] 。列表在 数据结构 data structures 一章中会有更详细的解释。

for 循环会迭代指定的范围——for i in range(1,5) 等同于 for i in [1, 2, 3, 4] ,这好像是依次将序列中的数或者对象赋值给 i ,每次都执行一次语句块。本例中,我们仅将语句块中的值打印出来。

请记住 else 是可选的。当它存在时,如果没有 break 语句,它始终都会执行一次。

还有一点值得注意 for..in 循环能用于任何序列。在这里,我们是来生成数字列表,一般来说,我们可以使用各种对象的各样数列!这个观点我们会在之后章节里进行更多探索。

python中 for 循环与 c 或 c++ 的 for 循环较大差异。c# 编程者会感到 与他们的 foreach 很相似。java 程序员也能发现其与 for (int i : IntArray) 的相似之处。

在 c 或 c++ 你需要这样写 for (int i = 0; i < 5; i++) ,而在 python 中,你仅需要 for i in range(0,5) 。如你所见,python 中的 for 循环更简单,更易理解,更健壮。

break {#break-statement}

break 语句是用来打破循环的,即停止循环语句的执行,就算循环条件为真或者序列未迭代完也会停止。

非常重要一点是如果你打破forwhile ,任何相应的循环的 else 块都不会执行的。

请看示例 break.py

{% include "./programs/break.py" %}

输出为:

{% include "./programs/break.txt" %}

它是怎样做的

此程序中,我们重复的获取用户的输入并且将其长度打印出来。我们提供了一个特定的条件来检测用户输入是否为 'quit' 来停止程序。我们打破循环,到达程序末尾来停止程序。

输入字符串的长度能够通过内置的 len 函数获得。

是的,break 语句也能在 for 循环中使用。

continue {#continue-statement}

continue 语句用来告诉 python 跳过当前循环中的余下语句并且继续下一次循环的迭代。

请看示例 continue.py

{% include "./programs/continue.py" %}

输出为:

{% include "./programs/continue.txt" %}

它是怎样做的

本程序中,我们仅处理含有至少三个字符的用户输入字符串。所以,我们使用内置的 len 函数来获取长度,如果长度小于3, 我们使用 continue 略过余下语句,不然,循环中的余下语句就会执行。

当然,continue 语句也能在 for 循环中使用。

总结

我们已经看到如何使用 ifwhilefor 三种控制流语句以及相关的 breakcontinue 语句。这些都是 python 中特别常用的。因此熟悉它们是必要的。

下面,我们来看看怎样创建和使用函数。