我对这样的代码感到非常困惑[不是我写的]:
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()
只返回True
或False
。如果我用另一种方式重写这个逻辑,我找不到一个优雅的方式作为pythoner。
我想知道any()
是否可以实现逻辑,如果没有,如何优雅地实现它?
答案 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;结果是最后一个值,而不是像False
或None
这样的具体值:
result = next(filter(None, sequence_to_check), sequence_to_check[-1])
使用最终元素(&#34; truthy&#34;或&#34; falsy&#34;)作为结果,当所有元素都是&#34; falsy&#34;。
要明确的是,如果要测试的一组内容是固定的并且很小,那么根据Anand的回答明确or
是更好的方法。