将一些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)
意思是。
有人能解释一下这句话的意义吗?
提前谢谢!
答案 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提供评论中的提示。
next
和None
next
函数返回给定迭代器中的下一个项(在您的情况下为生成器表达式)。但是,当迭代器到达它的末尾,并且没有其他东西可以返回时,它会引发StopIteration
异常。但是,在这种情况下,当您将第二个参数作为默认值传递时,将返回该参数而不是引发异常。因此,在您的情况下,如果发生后一种情况,则返回None
。
以下内容完成了这一切:
next
电话会为您提供全新生成器中的第一个元素(如果有),否则None
因此,如果我们描述源函数,它听起来像这样:
获取满足
l
条件的config.equalsForConfigSet
中的第一个元素,否则返回None
。