![健壮的Python](https://wfqqreader-1252317822.image.myqcloud.com/cover/690/48593690/b_48593690.jpg)
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人
1.3.2 迭代
迭代是另一个例子,你选择的抽象会指示你所传达的意图。
你见过多少次这样的代码?
![](https://epubservercos.yuewen.com/8C693A/28235069304793306/epubprivate/OEBPS/Images/42_02.jpg?sign=1739425269-2VDkp4IjhzVIn7VBgJm7sMpEAXh2Lua8-0-5d28b0432cf2115eef30e266acb1f730)
这段简单的代码将每个字符打印在单独的行中。这对于第一次使用Python尝试解决这个问题来说是完美的,但是解决方案很快就演变成更具Python风格(代码旨在强调简单性,以惯用风格编写,大多数Python开发人员都能识别):
![](https://epubservercos.yuewen.com/8C693A/28235069304793306/epubprivate/OEBPS/Images/42_03.jpg?sign=1739425269-xrkpNlIZTF0TiqCSJkNu5leclHuPgacX-0-72ed2c6a65f1b03d8d1568c4cb6b86a0)
花点时间思考一下为什么这种选择更可取。for循环是一个更合适的选择,它能更清楚地传达意图。与集合类型一样,你选择的循环结构明确地传达了不同的概念。下面是一些常见的循环结构及其含义:
for循环
for循环用于遍历集合或范围中的每个元素并执行一个操作。
![](https://epubservercos.yuewen.com/8C693A/28235069304793306/epubprivate/OEBPS/Images/42_04.jpg?sign=1739425269-Cpcw0LT5lFcJJcgb5ut1FTPCQwIjNasr-0-9d4713449e701be694b9c427f54ed2f8)
while循环
while循环用于迭代,直到某个条件为真为止。
![](https://epubservercos.yuewen.com/8C693A/28235069304793306/epubprivate/OEBPS/Images/43_01.jpg?sign=1739425269-ir5aQuTpbfjQuFP7nzyUmj5HhczPmJq0-0-c9a648e3bf78b6b639c8d9ac7d03e6d9)
推导
推导用来将一个集合转换成另一个集合(通常,这没有副作用)。
![](https://epubservercos.yuewen.com/8C693A/28235069304793306/epubprivate/OEBPS/Images/43_02.jpg?sign=1739425269-iVwVkEIxxFgubV8zM3KsENPd0f2icmVC-0-cb00b3f1a92365a4b783ea997748ff79)
递归
当集合的子结构与集合的结构相同时(例如,树的每个子结构也是树),就使用递归。
![](https://epubservercos.yuewen.com/8C693A/28235069304793306/epubprivate/OEBPS/Images/43_03.jpg?sign=1739425269-Im58HUWjWayC91vraoAHsI9AKVxtSEui-0-2dec0006f25f6f7873da58d7467abd63)
你希望代码库的每一行都能交付价值。此外,你希望每一行代码都能清楚地向未来的开发人员传达该价值。这就需要最小化任何样板、脚手架和多余代码的数量。在上面的例子中,我遍历每个元素并执行一个操作(打印一个元素),这使for循环成为一个理想的循环结构。我不是在浪费代码。相反,while循环要求我们显式地跟踪循环,直到某个条件发生。换句话说,我需要跟踪一个特定的条件并在每次迭代时改变一个变量。这分散了对循环所提供的价值的关注,并带来了不必要的认知负担。