Python: 嵌套循环还是“下一步”语句

6 投票
1 回答
11450 浏览
提问于 2025-04-16 03:45

我还是个编程新手,写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 个回答

25

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 最重要的用途。

撰写回答