内置函数any()做什么?

时间:2015-05-17 22:50:44

标签: python if-statement syntax any

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

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

我知道这有效,但我不知道为什么。你能分享一些见解吗?

3 个答案:

答案 0 :(得分:6)

正如any的文档所说:

  

如果 iterable 的任何元素为true,则返回class NotifClass { public: NotifClass(const std::shared_ptr<MyEvent>& event): _event(event), _notif_handle(register_for_notif(my_notif_callback, (void*)new std::weak_ptr<MyEvent>(event))) // initialize some other stuff { // Initialize some more stuff } ~NotifClass() { unregister_for_notif(_notif_handle); } static void my_notif_callback(void* context) { auto ptr = ((std::weak_ptr<MyEvent>*)context)->lock(); // If destructed, do not set the event. if (!ptr) { return; } ptr->set_event(); } private: std::shared_ptr<MyEvent> _event; NOTIF_HANDLE _notif_handle; }; 。如果 iterable 为空,则返回True。相当于:

False

所以,这相当于:

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

如果您不理解最后一部分,请先阅读list comprehensions上的教程部分,然后跳到iterators,生成器和生成器表达式。

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

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

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

但与此同时,拥有elements = [] for i in list: elements.append(i in string) for element in elements: if element: return True return False 和理解等等的观点是,你几乎可以用简单的英语阅读它们:

any

答案 1 :(得分:2)

public class NaturalNumber {

    private Integer n;

    public NaturalNumber(Integer n)  { this.n = n; }

    public boolean isEven() {
        return n.intValue() % 2 == 0;
    }

    // ...
}

这会生成一个可迭代的布尔值,表明i in string for i in list 中的每个项目是否都在list中。然后检查此可迭代bools中的任何项是否为真。

实际上,您需要检查列表中的任何项目是否为string的子字符串。

答案 2 :(得分:1)

这里发生了什么:

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)如果iterable的任何元素为true,则返回True。   如果iterable为空,则返回False。相当于:

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

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

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

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