python – 这两个实现之间有什么区别?

假设我有一个列表列表

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.是否值得构建一个应该在这里产生单个项目的生成器,它是否更具可读性?在我看来,我会说“可能不是”.

点赞