2014-07-02 71 views
1

我看这个帖子:了解lambda函数

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'),我明白它最终会返回一个包含'date'的值。但为什么它写为L and L.startswith('date')?这看起来lambda函数正在返回一个字符串和一个布尔语句。

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

+2

认为它是一个过滤器,你发现的“格”的所有实例在具有与启动属性“ID”汤字符串“日期”。在这种情况下,lambda是一个谓词函数。 “L和L.startswith('date')”在L为None的情况下是必要的,在这种情况下它会抛出异常。 –

+0

@Marcin我明白你的意思,我错了。删除了我的评论,对不起我引起了混淆 –

+0

@Chinegro如你所见,你之前被误导了。 – Marcin

回答

6

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

它做的是检查真实性的第一个值。有些东西是虚假的,如None0False[]。其他的事情是真的。

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

它在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) 
+0

很好的答案。令人沮丧的是,在其中一个人真正了解像布尔运算符这样的核心语言功能之前,需要三个人前来。 – Marcin

1

正如您的链接帖子所述,lambda充当过滤器。它不会找到所有div s的lambda的返回值的ID;那样做不会有用,因为ID需要是唯一的。

相反,soup.findall只会找到div(胡)的ID是由lambda验证,这是任何div其ID不为空,并以字符串'date'开始。

+0

-1 Lambda不作为过滤器。这是一个可以调用的表达。 – Marcin

+1

@Marcin我明白这一点。但是'lambda'函数可以用来过滤信息。 – BeetDemGuise