流量控制

“请告诉我,从这里我应该走哪条路?”
“这在很大程度上取决于你想去哪里,”猫说。
“我不在乎在哪里-”爱丽丝说。
“那么你走哪条路都无关紧要,”猫说。
“-只要我能 某处 “爱丽丝补充道,作为一种解释。
“哦,只要你走得够远,”猫说,“你一定会那样做的。”

Alice's Adventures in Wonderland

到目前为止,代码战相当于..。平淡无奇。您每次只执行一系列命令。但是,随着程序控制流的引入,一个全新的程序世界展现了出来。是否使用控制流工具以一种可以处理复杂任务的方式来构建代码结构取决于您的经验和创造力。

布尔表达式

了解布尔表达式对于程序的控制流至关重要。Python相当直观地处理了这一点。最重要的布尔运算有

==

等于

!=

不等于

<

少于

<=

小于或等于

>

大于

>=

大于或等于

>>> 1 == 1
True
>>> 1 + 1 != 2
False
>>> 5*2 >= 11
False

警告

当心 float 比较,因为计算机在内部表示浮点数的方式可能会导致一些看似奇怪的行为。

>>> 0.1 + 0.2 == 0.3
False

这当然是意想不到的行为。为了解决这一缺陷,Python3.5版引入了 isclose 在ITS中的功能 math 模块。

>>> import math
>>> math.isclose(0.1 + 0.2, 0.3)  
True

如果您使用的是旧版本,仍然有一些方便的解决方案。这个 numpy 本教程稍后介绍的软件包还提供了实现以下功能的方法 float 比较。

在许多情况下,简单的布尔表达式不足以正确指定程序的控制流。有时,代码挡路应该仅在不满足某个条件、同时满足多个条件或至少满足其中一个条件时才执行。对于此Python,具有关键字 notand ,以及 or ,分别为。下表概述了它们的行为。

的真值表 not

A

非A

真的

错误

错误

真的

的真值表 and

A

B

A和B

真的

真的

真的

真的

错误

错误

错误

真的

错误

错误

错误

错误

的真值表 or

A

B

A或B

真的

真的

真的

真的

错误

真的

错误

真的

真的

错误

错误

错误

使用这些关键字组合布尔表达式是编程的基本技能。

>>> i = 3
>>> i < 4 and i >= 0
True
>>> i < 4 and i > 3
False
>>> i < 4 and not i > 3
True
>>> i >= 0 or i > 3
True

您还可以像在公式中一样,使用方括号指定子表达式的计算顺序。

注解

在Python中 False 并不是Python中唯一“假”的东西。 FalseNone 、所有类型的数字零以及空字符串和容器都被解释为false。

下面介绍使用布尔表达式的最重要的构造。

这个 if 声明

每种编程语言都提供的一个构造是 if statement 。基本结构如下:

if <expression>:
    <code block>

结果是, 代号挡路 仅在以下情况下才执行 表达式True

注解

测试

>>> x = 0
>>> y = 1
>>> if x > 0:
...     print('Larger than 0')
...
>>> if y > 0:
...     print('Larger than 0')
...
Larger than 0

这个 表达式 还可以使用 Boolean operations

>>> x = 0
>>> y = 1
>>> if not x > 0:
...     print('Not larger than 0')
...
Not larger than 0
>>> if not y > 0:
...     print('Not larger than 0')
...

如果您想涵盖这两种情况,还可以使用 else 关键词:

>>> x = 1
>>> if x < 0:
...     print('Negative')
... else:
...     print('Positive')
...
Positive

但正如您所看到的,这并不涵盖所有情况。如果 x 是0吗?为此,我们必须使用 elif

>>> x = 0
>>> if x < 0:
...     print('Negative')
... elif x == 0:
...     print('Zero')
... else:
...     print('Positive')
...
Zero

你可以添加尽可能多的 elifs 如你所愿。

这个 while 循环

有时需要执行例程,直到满足特定条件。这是通过使用 while loop

>>> x = 0
>>> while x < 5:
...     print(x)
...     x += 1
...
0
1
2
3
4

假设您想要退出 while loop 当满足特定条件时。这是可以通过以下方式实现的 the break statement

>>> x = 0
>>> while x < 5:
...     if x == 3:
...         break
...     print(x)
...     x += 1
...
0
1
2

注意

虽然 while loops 是每种编程语言的共同基石,我建议您尽可能避免使用它们。很容易发生这样的情况,即永远不会达到退出循环的标准,并且您的程序会比您预期的更频繁地执行相同的任务。在许多情况下, while loop 可以替换为 for loop

这个 for 循环

在很多情况下,您只想一次处理一个容器的所有元素。这很容易通过以下方式实现 for loops

>>> x = [1, 2, 3]
>>> for i in x:
...     print(i)
...
1
2
3

这里 i 具有以下元素的值: x 一个接一个。这使您可以使用 i 在这里面 for loop 。访问完所有元素后,您将自动退出循环。一个更复杂的示例可能是将另一个列表的平方值存储在新列表中。

>>> x = [1, 2, 3]
>>> x_squared = []
>>> for value in x:
...     x_squared.append(value**2)
...
>>> print(x_squared)
[1, 4, 9]

range

循环整数的快捷方式如下所示 range() 功能。

>>> for i in range(3):
...     print(i)
...
0
1
2
>>> for i in range(3, 6):
...     print(i)
...
3
4
5
>>> for i in range(3, 12, 3):
...     print(i)
...
3
6
9

enumerate

有时,您还希望跟踪您在迭代中的当前位置。例如,您想知道程序的当前状态,但是打印每次操作的值有点太麻烦了。那么你就可以用 enumerate() 如下所示:

>>> results = []
>>> for i, value in enumerate(range(100,900)):
...     if i % 200 == 0:
...         print('Current step:', i, '-- Value:', value)
...     results.append(i**2 % 19)
...
Current step: 0 -- Value: 100
Current step: 200 -- Value: 300
Current step: 400 -- Value: 500
Current step: 600 -- Value: 700

如您所见,我们现在使用逗号分隔的变量 ivaluei 获取我们所在的当前索引,而 value 保存容器的实际对象。

zip

另一个常见的任务是您必须同时循环几个列表。使用 :func:``zip` `此函数:

>>> fruits = ['banana', 'orange', 'cherry']
>>> colors = ['yellow', 'orange', 'red']
>>> for fruit, color in zip(fruits, colors):
...     print('The color of', fruit, 'is', color)
...
The color of banana is yellow
The color of orange is orange
The color of cherry is red

注解

zip() 停止 for 一次循环即可 list 为空:

>>> fruits = ['banana', 'orange', 'cherry', 'apple', 'lemon']
>>> colors = ['yellow', 'orange', 'red']
>>> for fruit, color in zip(fruits, colors):
...     print('The color of', fruit, 'is', color)
...
The color of banana is yellow
The color of orange is orange
The color of cherry is red

错误

因为Python是一种动态语言,所以永远不能保证函数的输入是您想要的。以一个函数为例,它的目的是计算数字中数字的和。如果有人不小心将字符串作为参数传递给此函数,该怎么办?因此,在某些情况下,检查函数的输入是否正常是一个好主意。如果输入不支持此测试,您可以 raise 错误如下:

>>> raise ValueError('The input was wrong')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: The input was wrong

摘要