我正在看这篇文章:
Python BeautifulSoup: wildcard attribute/id search
其中答案给出了解决方案:
dates = soup.findAll("div", {"id": lambda L: L and L.startswith('date')})
我以为我理解了 python 中的 lambda 函数。然而,当我看到这个 lambda L:L 和 L.startswith('date'),我知道它最终会返回一个 id,该 id 的值包含“date”。但是为什么写成 L and L.startswith('date') 呢?这看起来 lambda 函数正在返回一个字符串和一个 bool 语句。
有人可以解释一下这背后的逻辑吗?
请您参考如下方法:
and 实际上并不返回 bool 值,即它并不总是返回 True 或 False。
它所做的是检查第一个值的真实性。有些东西是假的,比如 None,或者 0,或者 False,或者 []。其他都是真实的。
如果第一个值是假的,它被返回。如果为真,则返回第二个值。如果只考虑结果的真值,那就是和逻辑运算符的短路实现。
在 lambda L: L 和 L.startswith('date') 中使用它的原因是为了确保此函数在 L 的情况下不会抛出异常> 是 无。如果是,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)
