如何使用python的任何

时间:2015-10-15 02:58:38

标签: 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

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

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

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

3 个答案:

答案 0 :(得分:12)

您可以在这里使用VAGRANTFILE_API_VERSION = "2" Vagrant.configure(VAGRANTFILE_API_VERSION) do |config| config.vm.box = "ubuntu/trusty64" config.vm.network "private_network", ip: "192.168.33.10" config.vm.provider "virtualbox" do |vb| vb.customize ["modifyvm", :id, "--memory", "1024"] end

or

确保在尝试调用它们之前定义了这些函数。

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

答案 1 :(得分:5)

@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,&#34; any&#34;在这种情况下会做的是返回&#34; ANY&#34;符合条件的条件。所以即使你发现一个是假的,它仍然会返回True。

还有另一种类似的方法叫做#34; all&#34;,它将确保根据您检查的条件满足所有条件。这是一个例子:

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

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

答案 2 :(得分:4)

对于任意长度的情况(明确地链接or没有意义),你可以制作any的版本,当所有结果都返回第一个真值或给定值是假的:

# 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仅产生&#34; truthy&#34;值,并且两个arg next获得第一个&#34; truthy&#34;值,或filter找不到&#34; truthy&#34;的默认值值。

如果iterable_to_check是非空的Sequence(而不仅仅是Iterable),则可以完全匹配链式or的行为(&#34) ; falsy&#34;结果是最后一个值,而不是像FalseNone这样的具体值:

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

使用最终元素(&#34; truthy&#34;或&#34; falsy&#34;)作为结果,当所有元素都是&#34; falsy&#34;。

要明确的是,如果要测试的一组内容是固定的并且很小,那么根据Anand的回答明确or是更好的方法。