Python:为循环或“嵌套”;“下一步”;陈述
我是一个新手爱好者,在编写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”关键字可以在一行中实现相同的目标(我问了一个关于如何使用它的问题,但我不太明白) 所以对
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
正是医生所要求的,因为没有一个序列可以通过控制“mainfor
循环”来控制其他序列。因此,为了简单起见,假设不存在重复项(如果需要,这种情况不难缓解),您将对(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
(或、''
,就像我在上面的一个示例中所做的那样,等等)(有时这种疲惫是意外的,最好转化为例外,有时是完全预料到的,最好通过其他方式处理)。