健壮的Python
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

1.3.2 迭代

迭代是另一个例子,你选择的抽象会指示你所传达的意图。

你见过多少次这样的代码?

这段简单的代码将每个字符打印在单独的行中。这对于第一次使用Python尝试解决这个问题来说是完美的,但是解决方案很快就演变成更具Python风格(代码旨在强调简单性,以惯用风格编写,大多数Python开发人员都能识别):

花点时间思考一下为什么这种选择更可取。for循环是一个更合适的选择,它能更清楚地传达意图。与集合类型一样,你选择的循环结构明确地传达了不同的概念。下面是一些常见的循环结构及其含义:

for循环

for循环用于遍历集合或范围中的每个元素并执行一个操作。

while循环

while循环用于迭代,直到某个条件为真为止。

推导

推导用来将一个集合转换成另一个集合(通常,这没有副作用)。

递归

当集合的子结构与集合的结构相同时(例如,树的每个子结构也是树),就使用递归。

你希望代码库的每一行都能交付价值。此外,你希望每一行代码都能清楚地向未来的开发人员传达该价值。这就需要最小化任何样板、脚手架和多余代码的数量。在上面的例子中,我遍历每个元素并执行一个操作(打印一个元素),这使for循环成为一个理想的循环结构。我不是在浪费代码。相反,while循环要求我们显式地跟踪循环,直到某个条件发生。换句话说,我需要跟踪一个特定的条件并在每次迭代时改变一个变量。这分散了对循环所提供的价值的关注,并带来了不必要的认知负担。