理解python中的lambda函数

时间:2014-07-02 11:57:23

标签: python lambda beautifulsoup

我正在看这篇文章:

Python BeautifulSoup: wildcard attribute/id search

其中答案给出了解决方案:

dates = soup.findAll("div", {"id" : lambda L: L and L.startswith('date')})

我以为我理解了python中的lambda函数。但是,当我看到这个 lambda L: L and L.startswith('date'),我了解到它最终会返回一个ID,其值包含' date'。但为什么写成L and L.startswith('date')?这看起来lambda函数返回一个字符串和一个布尔语句。

有人可以解释这背后的逻辑吗?

2 个答案:

答案 0 :(得分:6)

and实际上并不返回布尔值,也就是说它不会总是返回True或False。

它的作用是检查真实性的第一个值。有些事情是假的,例如None0False[]。其他事情很简单。

如果第一个值是假的,则返回。如果它真实,则返回第二个值。如果您只考虑结果的真值,那么这就是and逻辑运算符的短路实现。

lambda L: L and L.startswith('date')中使用它的原因是为了确保此函数在LNone的情况下不会抛出异常。如果是,则lambda立即返回None因为它是假的。如果没有检查,则startswith()调用将抛出异常,因为None没有该方法。

在Python提示符下尝试以下内容:

l = lambda L: L and L.startswith('date')

l(None)
l('')
l('does not start with date')
l('date this one does')
l(0)
l(1)

答案 1 :(得分:1)

正如您的关联帖子所述,lambda充当过滤器。它不会找到div的返回值ID的所有lambda;这不会有用,因为ID必须是唯一的。

相反,soup.findall只会找到div,其ID由lambda验证,即ID为非空的任何div并以字符串'date'