控制流

在程序中,到现在为止,我们看到,一直有一系列的语句被Python以由上而下的顺序如实地执行。如果你想改变它的流程,它会如何工作呢?例如,你想让程序作出一些决定,而且不同的情况做不同的事情,例如,根据一天的时间不同,打印早上好或晚上好?

正如你可能已经猜到的,这要通过使用控制流语句。在Python中有三个控制流语句-- if, for 和 while。

if 语句

if 语句是用来检查一个条件:如果条件为真,我们运行一个语句块(你为if块),否则我们执行另一个语句块(称为else块)。else语句是可选的。

例如 (保存为 if.py):

number = 23

guess = int(input('请输入一个整数: '))

if guess == number:

# 新块从这里开始

print('恭喜,你猜对了。')

print('(但你没有获得任何奖品!)')

# 新块在这里结束

elif guess < number:

# 另一个块

print('不对,你猜的有点儿小')

# 在一个块中你可以做你想做的任何事...

else:

print('不对,你猜的有点大')

# 你猜的数比number大时才能到这里

print('完成')

# if语句执行完后,最后的语句总是被执行

输出:

$ python if.py

请输入一个整数: 50

不对,你猜的有点儿大

完成

$ python if.py

请输入一个整数: 22

不对,你猜的有点儿小

完成

$ python if.py

请输入一个整数: 23

恭喜,你猜对了。

(但你没有获得任何奖品!)

完成

它是如何工作的:

在这个程序中,我们获取来自用户的猜测,并检查这个数是否是我们设定的数。我们给变量number设置我们想要的任何整数,比如 23。然后,我们使用input() 函数获取用户的猜的数。函数是可重用的程序块。我们在下一章中会阅读关于它们的更多东西。

我们给内置的input 函数提供一个字符串,该函数将其打印到屏幕上并等待用户输入。一旦我们输入一些东西并按下回车键,input()函数把我们的输入作为一个字符串返回。然后,我们使用int将这个字符串转换为整数,然后将其存储在变量guess中。实际上,int 是一个类,但现在所有你需要知道的是,您可以使用它来将一个字符串转变为一个整数(假设文本中的字符串包含一个有效的整数)。

接下来,我们比较用户猜的数和我们选择的数,如果他们相等,我们打印一条成功的消息。注意,我们使用缩进级别告诉Python语句属于哪个块。这就是为什么缩进P在ython中是如此重要。我希望你坚持"一致的缩进"的规则,好吗?

注意,if语句在最后有一个冒号——我们指示Python一个语句块将跟随其后。

然后,我们检查猜的数是否小于这个数字,如果是,我们通知用户,他们猜的数必须比那个数稍高。我们这里使用的是elif子句,实际上将两个相关的 if else-if else语句组合为一个语句if-elif-else,这使程序更简单且减少所需要的缩进。

elif和else语句也必须在逻辑行结束时有一个冒号,后跟相应的语句块(当然要通过适当的缩进)

你可以在if语句的if块中有另一个if语句——这称为if语句嵌套。

记住,elif 和else部分是可选的。一个最小的有效的if语句是:

if True:

print('是的,它为真')

在Python执行完成完整的if语句以及相关的elif和else子句,它移动到if包含语句的块中下一个语句块。在本例中,它是主要的块(程序开始执行的地方),接下来的语句是 print('完成')。在这之后,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('输入一个整数 : '))

if guess == number:

print('恭喜,你猜对了。')

# 这使while循环停止

running = False

elif guess < number:

print('不对,你猜的有点儿小。')

else:

print('不对,你猜的有点儿大。')

else:

print('while循环结束。')

# 在这做你想做的任何事

print('完成')

输出:

$ python while.py

输入一个整数 : 50

不对,你猜的有点儿大。

输入一个整数 : 22

不对,你猜的的点儿小。

输入一个整数 : 23

恭喜,你猜对了。

while循环结束。

完成

它是如何工作的:

在这个程序中,我们还是玩猜谜游戏,但优点在于,允许用户一直猜直到他猜对——每次猜测不需要重复运行该程序,正如我们在前一节中所做的。这演示了如何恰当的使用while语句。

我们移动input和if语句到while循环中,在while循环前,设置变量running为True。首先,我们检测变量running是否为True,然后往下执行相应的while块。在这个块执行完后,再检测条件,在这里是变量running为真,我们再次执行while块,否则,我们执行可选的else块,然后执行下面的语句。

当while循环的条件变为False时--这也可能发生在条件检测时的第一次,执行else块。如果你使用break语句退出循环的话,那么else子句就不会被执行,否则当while循环的条件变为False时就会执行。

在这里True和False被称为布尔类型,你可以认为它们分别相当于值1和0。

C/C++程序员注意: 记住, while循环可以有else子句。

for循环

for..in语句是另一个循环语句,它迭代一个对象的序列,例如经历序列中的第一项。在后面的章节,我们将会看到更多关于序列的细节。现在,你需要知道的是一个序列只是一个有序的项目的集合。

例如 (保存为 for.py):

for i in range(1, 5):

print(i)

else:

print('for循环结束')

输出:

$ python for.py

1

2

3

4

for循环结束

它是如何工作的:

打印一个数字序列。我们使用内置的range函数生成这个数字序列。

我们在这里所做的是提供两个数字,range返回一个从第一个数字到第二个数字的一个数字序列。例如, range(1,5)给出序列[1, 2, 3, 4]。默认情况下,range 步长值为1。如果我们为range函数提供第三个参数,那么它这个参数就是新的步长值。例如range(1,5,2)得到[1, 3]。请记住,数字的范围不超过第二个参数的值,即它不包括第二个数字。

注意,range()生成一个数字序列,在for循环中它一次只生成一个数字。如果你想立刻看到完整的数字序列,使用list(range())。例如, for example, list(range(5)) 会输出 [0, 1, 2, 3, 4]。list(列表)将在数据结构中解释。

for循环然后遍历这个范围,for i in range(1,5)相当于 for i in [1, 2, 3, 4],这就像把序列中的每一个数(或对象)分配给i,一次一个,然后为每个i值执行该语句块。在本例中,在语句块中我们只是打印它的值。

记住,else部分是可选的。当包括它时,除非遇到break语句,当for循环结束时,它执行一次。

记住,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循环,任何相应的循环else块是不执行的。

例子 (保存为break.py):

while True:

s = input('输入一些东西 : ')

if s == 'quit':

break

print('字符串的长度是', len(s))

print('完成')

输出:

$ python break.py

输入一些东西: Programming is fun

字符串的长度是 18

输入一些东西: When the work is done

字符串的长度是 21

输入一些东西 : if you wanna make your work also fun:

字符串的长度是 37

输入一些东西 : use Python!

字符串的长度是 12

输入一些东西 : quit

完成

它是如何工作的:

在这个程序中,我们重复获取用户输入的东西并打印每次输入字符串的长度。我们提供一个特殊的条件--通过检查用户输入是否是quit来结束程序。我们通过跳出循环停止程序,达到该程序的结束位置。

输入字符串的长度可以使用内建的len函数。

记住, break语句同样适用于for循环。

Swaroop 的诗意的Python

在这里输入一个我写的迷你诗:

编程自有颜如玉

每当工作完成时

如你也想颜如玉:

使用Python!

continue语句

continue语句是用来告诉Python跳过当前循环块中其余的语句,继续循环的下一次迭代。

例子 (保存为continue.py):

while True:

s = input('输入一些东西: ')

if s == 'quit':

break

if len(s) < 3:

print('太小')

continue

print('输入的东西有足够的长度')

# 在这做其它各种处理...

输出:

$ python continue.py

输入一些东西: a

太小

输入一些东西: 12

太小

输入一些东西: abc

输入的东西有足够的长度

输入一些东西: quit

它是如何工作的:

在这个程序中,我们接受来自用户的输入,但是只有在输入的字符串至少有3个字符时才处理。因此,我们使用内建的len函数来获得长度,如果长度小于3,通过使用continue句,我们跳过块中的其余语句。否则,在循环中的其余语句将被执行--在这做其它各种处理。

注意,continue语句同样适用于for循环。

小结

我们已经看到了如何使用三个控制流语句--if、while和for以及与它们相关的 break和continue语句。由于这些都是Python最常用的部分,你需要尽快和他们混得熟一点。

接下来,我们将学习如何创建和使用函数。