我正在看这篇文章:
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函数返回一个字符串和一个布尔语句。
有人可以解释这背后的逻辑吗?
答案 0 :(得分:6)
and
实际上并不返回布尔值,也就是说它不会总是返回True或False。
它的作用是检查真实性的第一个值。有些事情是假的,例如None
,0
,False
或[]
。其他事情很简单。
如果第一个值是假的,则返回。如果它真实,则返回第二个值。如果您只考虑结果的真值,那么这就是and
逻辑运算符的短路实现。
lambda L: L and L.startswith('date')
中使用它的原因是为了确保此函数在L
为None
的情况下不会抛出异常。如果是,则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'
。