Python:为循环或“嵌套”;“下一步”;陈述

Python:为循环或“嵌套”;“下一步”;陈述,python,optimization,for-loop,Python,Optimization,For Loop,我是一个新手爱好者,在编写python时会嵌套循环,如下所示: dict = { key1: {subkey/value1: value2} ... keyn: {subkeyn/valuen: valuen+1} } for key in dict: for subkey/value in key: do it to it 我知道一个“next”关键字可以在一行中实现相同的目标(我问了一个关于如何使用它的问题,但我不太明白) 所以对

我是一个新手爱好者,在编写python时会嵌套循环,如下所示:

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循环更具可读性。为什么,人们会用“下一步”?我在某个地方读到Python是一种动态类型和解释语言,因为+同时包含字符串和和数字,它必须检查每个循环迭代的变量类型,以便知道运算符是什么,等等。使用“next”是否以某种方式防止了这种情况,加快执行速度,还是仅仅是风格/偏好的问题?

下一步
在必要时推进迭代器是很重要的,而不需要控制显式的
for
循环。例如,如果您想要“S中大于100的第一个项目”,则
下一步(如果x>100,则x代表S中的x)
将为您提供该项目,无需混乱、无需大惊小怪、无需做任何不必要的工作(当找到合适的
x
后,一切都会立即终止)——并且您会得到一个异常(
StopIteration
)如果意外,则没有符合条件的
x
。如果不需要匹配,并且您希望
None
在这种情况下,
next(如果x>100,则x代表S中的x),None)
将提供该功能。出于这一特定目的,如果
next
实际上被命名为
first
,您可能会更清楚,但这会暴露出它更广泛的用途

例如,考虑合并多个序列的任务(例如,排序序列的并集或交集——例如,排序文件,其中项目是行)。同样,
next
正是医生所要求的,因为没有一个序列可以通过控制“main
for
循环”来控制其他序列。因此,为了简单起见,假设不存在重复项(如果需要,这种情况不难缓解),您将对
(currentitem,ITS文件)
保留在由
heapq
控制的列表中,合并变得很容易。。。但这要归功于
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

+1的最重要用途。我刚刚意识到我有用的any-aka-first可以用next和iter来定义(任何序列中的第一个非False或序列中的最后一个值,如果全部为False)。@Tony,你的“有用的any-aka-first”对于空序列返回什么?与
[False]
[None]
或其他类似的代码相同?顺便说一句,我认为
next(itertools.ifilter(None,seq),None)
可能更实用(返回
None
对于没有任何真实项的任何序列,包括空项和非空项…似乎更统一!)。我提出了相同的版本,但我认为我的需求与
next(itertools.ifilter(None,seq)最匹配,键入(seq)()
。一致性很重要,我一直在考虑Pythonála Lisp的shortcircuit
(或…)的一致性。由于Python有单独的[]、()等,因此需要考虑空序列的问题。在这种情况下,最具python风格的答案可能是留下next来引发异常(下一个参数)。另外,正常的函数非常干净,在这种情况下,next的好处值得怀疑,因为
for
在函数中做得很好。好的,谢谢。实际上,Next现在似乎很容易使用。我猜是添加了“None”,这让我很恼火。@aquateenfan,很好的观点——如果您希望在迭代器耗尽时避免异常,那么您只需要
、None
(或
、''
,就像我在上面的一个示例中所做的那样,等等)(有时这种疲惫是意外的,最好转化为例外,有时是完全预料到的,最好通过其他方式处理)。