带有" next的cthon语句的含义(c代表l中的c)"

时间:2017-11-03 01:25:12

标签: python generator next generator-expression

将一些python代码移植到PHP中时,我遇到了以下代码问题:

def getOrAdd(self, config):
    h = config.hashCodeForConfigSet()
    l = self.configLookup.get(h, None)
    if l is not None:
        r = next((c for c in l if config.equalsForConfigSet(c)), None)
        if r is not None:
            return r
    if l is None:
        l = [config]
        self.configLookup[h] = l
    else:
        l.append(config)
    return config

我无法弄清楚,行是什么

r = next((c for c in l if config.equalsForConfigSet(c)), None)

意思是。

有人能解释一下这句话的意义吗?

提前谢谢!

3 个答案:

答案 0 :(得分:3)

它将two-arg next(从迭代器中提取下一个值,如果迭代器耗尽,则返回第二个参数作为默认值)与generator expression组合,这就像一个lazy list comprehension(它生成一个按需生成值的迭代器/生成器)。

所以:

r = next((c for c in l if config.equalsForConfigSet(c)), None)

英文,表示"获取l的第一个元素,该元素的config.equalsForConfigSet是真实的;如果找不到这样的元素,则返回None"。并且它是懒惰地,或者如果你愿意,它是短路的,所以只要一个c值通过,它就不需要继续; l的其余部分甚至无法加载,更不用说进行测试了(与列表理解不同)。

在代码中,您可以使用如下函数表达相同的行为:

def firstEqualsConfigSet(l, config):
    for c in l:
        if config.equalsForConfigSet(c):
            # Short-circuit: got one hit, return it
            return c
    # Didn't find anything
    return None  # Redundant to explicitly return None, but illustrating
                 # that two-arg next could use non-None default

然后使用该函数执行:

r = firstEqualsConfigSet(l, config)

答案 1 :(得分:2)

我的理解是

next(迭代器,默认) next()函数返回迭代器中的下一个项目。

从for循环中获取'c',它从列表l(前面填充)中提取c,其中for循环正在使用config.equalsForConfigSet(C)应该返回true的条件进行评估。

如果next()的第一个参数中没有'c'值,则返回None

https://www.programiz.com/python-programming/methods/built-in/next

答案 2 :(得分:0)

这基本上是用next函数调用两个参数:

  • 生成器理解 - (c for c in l if config.equalsForConfigSet(c))
  • None

所以让我们把它撕成碎片。

理解部分

括号()中包含的内容是generator expression。就像列表推导(与[]一起使用时),但结果是生成器对象。

感谢@ShadowRanger提供评论中的提示。

nextNone

next函数返回给定迭代器中的下一个项(在您的情况下为生成器表达式)。但是,当迭代器到达它的末尾,并且没有其他东西可以返回时,它会引发StopIteration异常。但是,在这种情况下,当您将第二个参数作为默认值传递时,将返回该参数而不是引发异常。因此,在您的情况下,如果发生后一种情况,则返回None

摘要

以下内容完成了这一切:

  • 生成器是一个按需生成值的迭代器,因此所有列表都没有加载到内存中
  • next电话会为您提供全新生成器中的第一个元素(如果有),否则None

因此,如果我们描述源函数,它听起来像这样:

  

获取满足l条件的config.equalsForConfigSet中的第一个元素,否则返回None