【问题标题】:How exactly does the python any() function work?python any() 函数究竟是如何工作的?
【发布时间】:2013-05-06 12:10:33
【问题描述】:

any 的python 文档页面中,any() 函数的等效代码如下:

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

如果以这种形式调用它,这个函数如何知道我想测试什么元素?

any(x > 0 for x in list)

从函数定义中,我只能看到我正在传递一个可迭代对象。 for 循环如何知道我在寻找 > 0 的东西?

【问题讨论】:

    标签: python


    【解决方案1】:

    这是因为iterable是

    (x > 0 for x in list)
    

    请注意,x > 0 返回 TrueFalse,因此您有一个可迭代的布尔值。

    【讨论】:

      【解决方案2】:

      (x > 0 for x in list) 在该函数调用中创建一个生成器表达式,例如。

      >>> nums = [1, 2, -1, 9, -5]
      >>> genexp = (x > 0 for x in nums)
      >>> for x in genexp:
              print x
      
      
      True
      True
      False
      True
      False
      

      any 使用哪个,并在遇到第一个评估 True 的对象时短路

      【讨论】:

        【解决方案3】:

        如果您使用any(lst),您会看到lst 是可迭代的,它是一些项目的列表。如果它包含[0, False, '', 0.0, [], {}, None](它们都具有False 的布尔值),那么any(lst) 将是False。如果lst 还包含以下任何[-1, True, "X", 0.00001](所有这些都评估为True),那么any(lst) 将是True

        在您发布的代码x > 0 for x in lst 中,这是一种不同的可迭代对象,称为生成器表达式。在将生成器表达式添加到 Python 之前,您将创建一个 列表理解,它看起来非常相似,但周围有 [] 的:[x > 0 for x in lst]。从包含[-1, -2, 10, -4, 20]lst 中,您会得到这个综合列表[False, False, True, False, True]。然后这个内部值将被传递给any 函数,该函数将返回True,因为至少有一个True 值。

        但是使用 生成器表达式,Python 不再需要创建 True(s)False(s) 的内部列表,这些值将在 any 函数迭代生成的值时生成一次由生成器表达式。 而且,由于any 短路,它会在看到第一个True 值时立即停止迭代。如果您使用类似lst = range(-1,int(1e9))(或xrange,如果您使用Python2.x)创建lst,这将特别方便。即使这个表达式将生成超过十亿个条目,any 只需要到达1 时的第三个条目,它会将True 计算为x>0,因此any 可以返回@ 987654354@。

        如果您创建了一个列表推导式,Python 必须首先在内存中创建十亿个元素的列表,然后将其传递给any。但是通过使用生成器表达式,您可以让 Python 的内置函数(如 anyall)在看到 TrueFalse 值时尽早爆发。

        【讨论】:

        • 还值得一提的是any(x > 0 for x in list) 只是any((x > 0 for x in list)) 的语法糖。
        • 你应该将None添加到布尔值为False的元素列表中
        • 添加到@georg,语法糖对any 并不特殊。 def b(x): return x; print b(x > 1 for x in xs) # prints <generator object ..
        • @georg 感谢您的澄清。这是一个非常重要的点,让我在使用任何括号测试代码时感到困惑。
        【解决方案4】:

        简单地说,any() 就是这样做的:根据条件,即使遇到列表中的一个满足值,它也会返回 true,否则返回 false。

        list = [2,-3,-4,5,6]
        
        a = any(x>0 for x in lst)
        
        print a:
        True
        
        
        list = [2,3,4,5,6,7]
        
        a = any(x<0 for x in lst)
        
        print a:
        False
        

        【讨论】:

          【解决方案5】:
          >>> names = ['King', 'Queen', 'Joker']
          >>> any(n in 'King and john' for n in names)
          True
          
          >>> all(n in 'King and Queen' for n in names)
          False
          

          它只是将几行代码简化为一行。 您不必编写冗长的代码,例如:

          for n in names:
              if n in 'King and john':
                 print True
              else:
                 print False
          

          【讨论】:

            猜你喜欢
            • 2020-10-17
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2011-06-26
            • 2021-08-15
            • 2012-06-08
            • 2011-10-11
            相关资源
            最近更新 更多