2

在将一些 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)

确实意味着。

谁能解释一下这句话的含义?

先感谢您!

4

3 回答 3

3

它将双参数next(从迭代器中提取下一个值,如果迭代器用尽,则返回第二个参数作为默认值)与生成器表达式相结合,这就像一个惰性list理解(它产生一个生成值的迭代器/生成器一经请求)。

所以:

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)
于 2017-11-03T01:32:21.743 回答
2

我的理解是

next(iterator, default) next() 函数从迭代器返回下一项。

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

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

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

于 2017-11-03T01:39:16.777 回答
0

这基本上是对next带有两个参数的函数的调用:

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

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

理解部分

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

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

nextNone

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

概括

整个事情是为了以下几点完成的:

  • 生成器是按需生成值的迭代器,因此所有列表都不会加载到内存中
  • next如果有新生成器,该调用将为您提供第一个元素,否则None

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

让我l满足config.equalsForConfigSet条件的第一个元素(如果有),否则返回None

于 2017-11-03T01:40:30.470 回答