流量控制¶
“请告诉我,从这里我应该走哪条路?”“这在很大程度上取决于你想去哪里,”猫说。“我不在乎在哪里-”爱丽丝说。“那么你走哪条路都无关紧要,”猫说。“-只要我能 某处 “爱丽丝补充道,作为一种解释。“哦,只要你走得够远,”猫说,“你一定会那样做的。”—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,具有关键字 not
, and
,以及 or
,分别为。下表概述了它们的行为。
A |
非A |
---|---|
真的 |
错误 |
错误 |
真的 |
A |
B |
A和B |
---|---|---|
真的 |
真的 |
真的 |
真的 |
错误 |
错误 |
错误 |
真的 |
错误 |
错误 |
错误 |
错误 |
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
您还可以像在公式中一样,使用方括号指定子表达式的计算顺序。
下面介绍使用布尔表达式的最重要的构造。
这个 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
如您所见,我们现在使用逗号分隔的变量 i
和 value
。 i
获取我们所在的当前索引,而 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
注解
>>> 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
摘要¶
if statements 是将分支添加到代码中的一种方式。
while loops 只要有可能就应该避免。
for loops 用于处理容器中的项目。
range()
用于即席生成包含整数的容器。
enumerate()
用于跟踪 for loop 。
zip()
用于一次循环遍历多个容器。raise 用于在出现问题时引发错误。