如何使用 python 的任何

how to use python's any

我对这样的代码感到很困惑[不是我写的]:

version = any(func1(), func2()) # wrong, should be any([func1(), func2()])

def func1():
   if something:
       return 1
   else:
       return None

def func2():
    if something:
       return 2
    else:
       return 3

version 必须是一个数字。当[func1(), func2()][1, None]时,应return 1,当为[None, 2]时,应return 2,当[1, 2]时,应return 1.

所以我认为在这段代码中使用any()是错误的,因为any()只是returnTrueFalse。如果我用另一种方式重写这个逻辑,我找不到作为 pythoner 的优雅方式。

我想知道any()是否可以实现逻辑,如果不能,如何优雅地实现?

你可以在这里简单地使用or

version = func1() or func2()

确保函数在尝试调用之前已定义。

这是有效的,因为 or returns 第一个类真值或最后一个值(如果没有值是类真值)。并且 'None' 在布尔上下文中被认为是 False-like。

@AnandSKumar 的回答是最佳的。但是,如果您有兴趣,只是为了给您提供一些信息:

举个例子:

>>> def foo():
...  return 2
...
>>> def boo():
...  return 3
...
>>> def doo():
...  return 4
...
>>> f = [foo, boo, doo]

>>> any(i() < 3 for i in f)
True

最终any内部发生的是,遍历方法j的数组,并指示每个项目是否小于3,"any"在这种情况下将做的是return "ANY" 匹配的条件。所以即使你发现一个是 False,它仍然会 return True。

还有另一种与此类似的方法,称为 "all",它将确保根据您正在检查的条件满足所有条件。这是示例:

>>> all(i() < 3 for i in f)
False

因此,如您所见,因为一个条件失败,它将 return False。

对于任意长度的情况(显式链接 or 没有意义),您可以制作 any 的一个版本,returns 第一个真实值或给定的当所有结果都是假的时的值:

# If on Py2, you'll want to do this to get shortcircuiting behavior
from future_builtins import filter

result = next(filter(None, iterable_to_check), False)  # False can be replaced with a chosen default

filter只产生"truthy"值,两个argnext取第一个"truthy"值,如果filter找到则取默认值没有 "truthy" 个值。

如果 iterable_to_check 是一个非空的 Sequence (rather than merely Iterable),你可以精确匹配链式 or 的行为("falsy" 结果是最后一个值,而不是像 FalseNone) 这样的特定值,其中:

result = next(filter(None, sequence_to_check), sequence_to_check[-1])

当所有元素都是 "falsy".

时,使用最后一个元素("truthy" 或 "falsy")作为结果

需要明确的是,如果要测试的事物集是固定的并且很小,根据 Anand 的回答明确 or 是更好的方法。