Control Flow 控制流
在我们到目前为止看到的程序中,总是有一系列语句由 Python 以精确的自上而下的顺序忠实地执行。如果您想改变其工作流程,该怎么办?例如,您希望程序根据不同的情况做出一些决定并执行不同的操作,例如根据一天中的时间打印“Good Morning”或“Good Evening”?
您可能已经猜到了,这是使用 Control Flow 语句实现的。Python 中有三个控制流语句 - if、for 和 while。
if 语句用于检查条件:如果条件为 true,则运行一个语句块(称为 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.
Output: 输出:
$ 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() 函数获取用户的猜测。函数只是可重用的程序片段。我们将在下一章中阅读更多关于它们的信息。
我们向内置输入函数提供一个字符串,该函数将其打印到屏幕上并等待用户的输入。一旦我们输入了一些东西并按下 kbd:[enter] 键,input() 函数就会以字符串的形式返回我们输入的内容。然后我们使用 int 将此字符串转换为整数,然后将其存储在变量 guess 中。实际上,int 是一个类,但你现在需要知道的是,你可以用它来将字符串转换为整数(假设字符串在文本中包含有效的整数)。
接下来,我们将用户的猜测与我们选择的数字进行比较。如果它们相等,我们将打印一条成功消息。请注意,我们使用缩进级别来告诉 Python 哪些语句属于哪个块。这就是为什么缩进在 Python 中如此重要的原因。我希望你坚持 “consistent indentation” 规则。你是?
请注意 if 语句的末尾如何包含一个冒号 - 我们向 Python 指示后面跟着一个语句块。
然后,我们检查猜测值是否小于数字,如果小于,则通知用户他们必须猜测的值略高于该数字。我们在这里使用的是 elif 子句,它实际上将两个相关的 if else-if else 语句组合成一个组合的 if-elif-else 语句。这使得程序更容易,并减少了所需的缩进量。
elif 和 else 语句还必须在逻辑行的末尾有一个冒号,后跟它们相应的语句块(当然,要有适当的缩进)
您可以在 if 语句的 if 块中拥有另一个 if 语句,依此类推 - 这称为嵌套的 if 语句。
在 Python 执行完完整的 if 语句以及关联的 elif 和 else 子句后,它会继续执行包含 if 语句的块中的下一条语句。在这种情况下,它是主块(程序执行开始的地方),下一个语句是 print(‘Done’) 语句。在此之后,Python 会看到程序的结束并简单地完成。
尽管这是一个非常简单的程序,但我一直在指出您应该注意的许多事项。所有这些都非常简单(对于具有 C/C++ 背景的人来说,这非常简单)。你最初需要意识到所有这些事情,但经过一些练习后,你会适应它们,这对你来说都是 “自然 ”的。
Python 中没有 switch 语句。你可以使用 if…ELIF…else 语句来做同样的事情(在某些情况下,使用字典来快速完成它)
while 语句允许您重复执行语句块,只要条件为 true。while 语句是所谓的循环语句的一个示例。while 语句可以具有可选的 else 子句。
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')
Output: 输出:
$ 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
我们将 input 和 if 语句移动到 while 循环内部,并在 while 循环之前将变量 running 设置为 True。首先,我们检查 running 的变量是否为 True,然后继续执行相应的 while 块。执行此块后,将再次检查条件,在本例中为 running 变量。如果为 true,则再次执行 while-block,否则继续执行可选的 else-block,然后继续执行下一条语句。
当 while 循环条件变为 False 时,将执行 else 块 - 这甚至可能是第一次检查条件。如果 while 循环有 else 子句,则始终执行该子句,除非使用 break 语句跳出循环。
True 和 False 称为布尔类型,您可以将它们分别视为等效于值 1 和 0。
C/C++ 程序员注意事项
请记住,while 循环可以使用 else 子句。
for…in 语句是另一个循环语句,它遍历一系列对象,即遍历序列中的每个项目。我们将在后面的章节中详细介绍序列。您现在需要知道的是,序列只是项目的有序集合。
for i in range(1, 5):
print(i)
else:
print('The for loop is over')
Output: 输出:
$ 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() 上调用 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++ 中,如果要编写 (int i = 0; i < 5; i++) ,那么在 Python 中,只需编写 range(0,5) 中的 i。如你所见,for 循环在 Python 中更简单、更具表现力且不易出错。
break 语句用于跳出循环语句,即停止执行循环语句,即使循环条件尚未变为 False 或项目序列尚未完全迭代。
需要注意的是,如果跳出 for 或 while 循环,则不会执行任何相应的循环 else 块。
while True:
s = input('Enter something : ')
if s == 'quit':
break
print('Length of the string is', len(s))
print('Done')
Output: 输出:
$ 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
continue 语句用于告诉 Python 跳过当前循环块中的其余语句,并继续循环的下一次迭代。
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...
Output: 输出:
$ 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 语句跳过块中的其余语句。否则,将执行循环中的其余语句,执行我们想要在此处执行的任何类型的处理。
Note that the continue statement works with the for loop as well.
请注意,continue 语句也适用于 for 循环。
我们已经了解了如何使用三个控制流语句 - if、while 和 for 以及它们相关的 break 和 continue 语句。这些是 Python 中最常用的部分,因此,熟悉它们是必不可少的。