![健壮的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=1739276281-nUAAizh1iSpvuZcd62Mh6BLgtotN64jn-0-495123bc98d02d19fa0d24e1b60eb26a)
这段简单的代码将每个字符打印在单独的行中。这对于第一次使用Python尝试解决这个问题来说是完美的,但是解决方案很快就演变成更具Python风格(代码旨在强调简单性,以惯用风格编写,大多数Python开发人员都能识别):
![](https://epubservercos.yuewen.com/8C693A/28235069304793306/epubprivate/OEBPS/Images/42_03.jpg?sign=1739276281-CgOx3JBLpkrIVPIQpdikYOjv0oTmPn6h-0-e01458530db8eb56535335c7749379fb)
花点时间思考一下为什么这种选择更可取。for循环是一个更合适的选择,它能更清楚地传达意图。与集合类型一样,你选择的循环结构明确地传达了不同的概念。下面是一些常见的循环结构及其含义:
for循环
for循环用于遍历集合或范围中的每个元素并执行一个操作。
![](https://epubservercos.yuewen.com/8C693A/28235069304793306/epubprivate/OEBPS/Images/42_04.jpg?sign=1739276281-G7Mvo8ViwrcMe51jOU08CCHyBbn48eMY-0-6a51ea8256c95bcb6f36057a82f4cee4)
while循环
while循环用于迭代,直到某个条件为真为止。
![](https://epubservercos.yuewen.com/8C693A/28235069304793306/epubprivate/OEBPS/Images/43_01.jpg?sign=1739276281-expYPzqxNrBQag4vmqSadjwK8qjWDJyv-0-baa61b7c2a9780e6155afbd5b7079cf2)
推导
推导用来将一个集合转换成另一个集合(通常,这没有副作用)。
![](https://epubservercos.yuewen.com/8C693A/28235069304793306/epubprivate/OEBPS/Images/43_02.jpg?sign=1739276281-IMJIPQbo5TWvDBMNJtJbuY8W8nDp5w3n-0-6c3deefa5429e0024ba51e24eff4f293)
递归
当集合的子结构与集合的结构相同时(例如,树的每个子结构也是树),就使用递归。
![](https://epubservercos.yuewen.com/8C693A/28235069304793306/epubprivate/OEBPS/Images/43_03.jpg?sign=1739276281-2Wxib4WkUIP62vOikhfU0LMU8HmD3ylB-0-ce95975a26db4c31c1a2c52a6f60ed12)
你希望代码库的每一行都能交付价值。此外,你希望每一行代码都能清楚地向未来的开发人员传达该价值。这就需要最小化任何样板、脚手架和多余代码的数量。在上面的例子中,我遍历每个元素并执行一个操作(打印一个元素),这使for循环成为一个理想的循环结构。我不是在浪费代码。相反,while循环要求我们显式地跟踪循环,直到某个条件发生。换句话说,我需要跟踪一个特定的条件并在每次迭代时改变一个变量。这分散了对循环所提供的价值的关注,并带来了不必要的认知负担。