内置函数 any() 有什么作用?

What does the builtin function any() do?

我做了一些 google 搜索如何检查字符串中是否包含列表的任何元素,我发现这段代码有效:

if any(i in string for i in list):

我知道这行得通,但我真的不知道为什么。你能分享一些见解吗?

i in string for i in list

这会生成一个布尔值迭代器,指示 list 中的每个项目是否在 string 中。然后你检查这个 bools 的可迭代对象中的任何项目是否为真。

实际上,您正在检查列表中的任何项目是否是 string.

的子字符串

这是怎么回事:

if any(i in string for i in list):    

最好用插图来解释:

>>> xs = ["Goodbye", "Foo", "Balloon"]
>>> s = "Goodbye World"
>>> [i in s for i in xs]
[True, False, False]
>>> any([i in s for i in xs])
True

如果您阅读 any 文档,您会注意到:

any(iterable) Return True if any element of the iterable is true. If the iterable is empty, return False. Equivalent to:

列表理解应该更明显,因为它为 xs 的每个元素构造了一个 i in s 的列表。

基本上(英文)您将返回每个子字符串都存在于搜索字符串中的任何匹配项(haystack)。

同样重要的是要注意 any() 将短路并在它找到的第一个 True(ish) 值处结束。 any() 可以像这样在纯 Python 中实现:

def any(iterable):
    for x in iterable:
        if x:
            return True
    return False

正如 any 的文档所说:

Return True if any element of the iterable is true. If the iterable is empty, return False. Equivalent to:

def any(iterable):
    for element in iterable:
        if element:
            return True
    return False

所以,这相当于:

for element in (i in string for i in list):
    if element:
        return True
return False

… 这本身实际上等同于:

for i in list:
    element = i in string
    if element:
        return True
return False

如果您不理解最后一部分,请先阅读有关 list comprehensions, then skip ahead to iterators、生成器和生成器表达式的教程部分。

如果你想真正分解它,你可以这样做:

elements = []
for i in list:
    elements.append(i in string)
for element in elements:
    if element:
        return True
return False

这仍然不完全相同,因为生成器表达式构建了一个生成器,而不是一个列表,但在您阅读教程部分之前,它应该足以让您继续学习。


但与此同时,拥有 any 和理解等的意义在于您几乎可以将它们阅读为简单的英语:

if any(i in string for i in list): # Python

if any of the i's is in the string, for each i in the list: # pseudo-English