如何使用python的任何

chy*_*ENG 6 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
Run Code Online (Sandbox Code Playgroud)

version必须是一个数字.当[func1(), func2()][1, None],应该返回1,当是[None, 2],应该返回图2,当[1, 2],应该返回1.

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

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

Ana*_*mar 12

你可以or在这里使用.

version = func1() or func2()
Run Code Online (Sandbox Code Playgroud)

在尝试调用函数之前,请确保已定义函数.

这是有效的,因为or返回第一个类似True的值或最后一个值(如果没有值类似True).并且'None'在布尔上下文中被认为是假的.


idj*_*jaw 5

@ AnandSKumar的答案是最佳的.但是,如果您感兴趣,只是为您提供一些信息:

举个例子:

>>> def foo():
...  return 2
...
>>> def boo():
...  return 3
...
>>> def doo():
...  return 4
...
>>> f = [foo, boo, doo]
Run Code Online (Sandbox Code Playgroud)
>>> any(i() < 3 for i in f)
True
Run Code Online (Sandbox Code Playgroud)

最终在any中发生的是迭代方法j的数组,并指出每个项是否小于3,在这种情况下"any"将做什么返回匹配的"ANY"条件.所以即使你发现一个是假的,它仍然会返回True.

还有另一种类似的方法称为"全部",它将确保根据您检查的条件满足所有条件.这是一个例子:

>>> all(i() < 3 for i in f)
False
Run Code Online (Sandbox Code Playgroud)

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