内置函数 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
我做了一些 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, returnFalse
. 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