Python: 嵌套循环还是“下一步”语句
我还是个编程新手,写Python的时候喜欢把for循环嵌套在一起,像这样:
dict = {
key1: {subkey/value1: value2}
...
keyn: {subkeyn/valuen: valuen+1}
}
for key in dict:
for subkey/value in key:
do it to it
我知道有一个“next”关键字,可以用一行代码达到同样的效果(我问过怎么用它,但没完全理解)。
对我来说,嵌套的for循环看起来更容易理解。那么,为什么还有人用“next”呢?我看到过说Python是一种动态类型和解释型的语言,而且因为“+”既可以连接字符串又可以加数字,所以每次循环的时候它都得检查变量的类型,以便知道该用什么操作符等等。使用“next”能在某种程度上避免这个问题,让执行速度更快吗?还是说这只是个人风格或偏好的问题?
1 个回答
next
是一个很重要的工具,用来在需要的时候推进一个迭代器,而不需要通过一个明确的 for
循环来控制它。比如说,如果你想找出“集合 S 中第一个大于 100 的元素”,你可以用 next(x for x in S if x > 100)
这样写,它会直接给你结果,简单明了,不会做多余的工作(因为一旦找到合适的 x
,就会立刻停止查找)——如果没有找到符合条件的 x
,你会得到一个异常 StopIteration
。如果你预期没有匹配的情况,并且想要返回 None
,那么可以用 next((x for x in S if x > 100), None)
来实现。为了这个特定的目的,如果 next
被叫做 first
,可能会更容易理解,但这就忽略了它更广泛的用途。
再比如,假设你要合并多个序列(比如,合并或交集多个已排序的序列——比如,已排序的文件,其中的内容是行)。在这种情况下,next
就非常合适,因为没有一个序列可以通过控制一个“主 for
循环”来主导其他序列。因此,假设为了简单起见没有重复项(这个条件如果需要可以很容易放宽),你可以在一个由 heapq
控制的列表中保持 (currentitem, itsfile)
这样的配对,合并过程就变得简单了……但这全靠 next
的魔力,能够在使用完某个文件的元素后,推进到正确的文件,而不是其他文件。
import heapq
def merge(*theopentextfiles):
theheap = []
for afile in theopentextfiles:
theitem = next(afile, '')
if theitem: theheap.append((theitem, afile))
heapq.heapify(theheap)
while theheap:
theitem, afile = heapq.heappop(theheap)
yielf theitem
theitem = next(afile, '')
if theitem: heapq.heappush(theheap, (theitem, afile))
试试看,如果没有 next
,你能做到多优雅的操作……!-)
可以继续说很久,但这两个使用场景:“将迭代器推进一位(而不让它控制整个 for
循环)”和“从迭代器中获取第一个元素”涵盖了 next
最重要的用途。