假设我有一个列表列表
S = [list1, list2, ...]
我想写一个函数find,这样对于一个输入x,该函数将查找x是否在S的某个子列表中,然后输出该列表或返回没有找到id x.
(注意:任何两个子列表的交集都是空的,因此最多只能找到一个列表.)
我的代码非常简单:
def find(x):
for L in S:
if x in L:
return L
return None
但是我看到有人这样写:
def find(x):
try:
return next( L for L in S if x in L)
except StopIteration:
return None
我想知道两个代码之间有什么区别?第二个比第一个更受欢迎吗? (例如,从软件项目的角度来看)
最佳答案 区别在于,如果您可以在该项中找到x,则第二个版本构造一个生成项列表S中的项的生成器.
然后它尝试通过调用next来从该生成器返回第一个对象.
从概念上讲,这两个片段之间确实没有太大区别,请注意它们如何在S中使用L – >如果x在L中,第一个作为传统的for循环,在其体内有if语句,第二个是理解形式.两个版本都是懒惰的,即当找到匹配时它们会立即返回.
我认为你的代码非常好.第二个可以使用默认值来避免手动异常处理,即
return next((L for L in S if x in L), None)
它试图返回由生成器产生的第一个项目,如果没有这样的项目,则返回None.是否值得构建一个应该在这里产生单个项目的生成器,它是否更具可读性?在我看来,我会说“可能不是”.