如何使用python';有吗

如何使用python';有吗,python,any,Python,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 ver

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

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
必须是一个num。当
[func1(),func2()]
[1,无]
时,应返回1,当是
[None,2]
时,应返回2,当
[1,2]
时,应返回1

所以我认为在这段代码中使用
any()
是错误的,因为
any()
只返回
True
False
。如果我用另一种方式重新编排这个逻辑,我就找不到一个优雅的方式来做蟒蛇


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

您可以在这里简单地使用

version = func1() or func2()
在尝试调用函数之前,请确保已定义这些函数


这是因为
返回第一个类真值或最后一个值(如果没有类真值)。“无”被认为是错误的,就像在布尔上下文中一样。

@AnandSKumar的答案是最优的。但是,如果您感兴趣,只想给您提供一些关于以下方面的信息:

举个例子:

>>> def foo():
...  return 2
...
>>> def boo():
...  return 3
...
>>> def doo():
...  return 4
...
>>> f = [foo, boo, doo]
>>> all(i() < 3 for i in f)
False

>>任意(i()<3表示f中的i)
真的
最终,在any中发生的是,迭代方法j的数组,并指示每个项是否小于3,在这种情况下,“any”将执行的操作是返回与之匹配的“any”条件。所以,即使你发现一个是假的,它仍然会返回真的

还有另一种类似的方法称为“all”,它将确保根据您正在检查的条件满足所有条件。以下是一个例子:

>>> def foo():
...  return 2
...
>>> def boo():
...  return 3
...
>>> def doo():
...  return 4
...
>>> f = [foo, boo, doo]
>>> all(i() < 3 for i in f)
False
>>全部(i()<3表示f中的i)
假的

因此,正如您所看到的,由于一个条件失败,它将返回False。

对于任意长度的情况(其中显式链接
没有意义),您可以创建一个版本的
any
,当所有结果都不正确时,返回第一个truthy值或给定值:

# 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”值,两个参数
next
获取第一个“truthy”值,如果
filter
未找到“truthy”值,则获取默认值

如果
iterable\u to\u check
是非空的(而不仅仅是空的),您可以将chained
s的行为(falsy”结果是最后一个值,而不是像
False
None
这样的特定值)与以下内容精确匹配:

当所有元素都是“falsy”时,使用最后一个元素(“truthy”或“falsy”)


要明确的是,如果要测试的东西集是固定的和小的,那么根据Anand的回答,显式的
是更好的方法。

你是在问使用
any()
,或者如何简化这段代码吗?@NayukiMinase我想知道
any()
是否可以实现逻辑,如果不能,如何优雅地实现它?