如何使用 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()
只是returnTrue
或False
。如果我用另一种方式重写这个逻辑,我找不到作为 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" 结果是最后一个值,而不是像 False
或 None
) 这样的特定值,其中:
result = next(filter(None, sequence_to_check), sequence_to_check[-1])
当所有元素都是 "falsy".
时,使用最后一个元素("truthy" 或 "falsy")作为结果
需要明确的是,如果要测试的事物集是固定的并且很小,根据 Anand 的回答明确 or
是更好的方法。
我对这样的代码感到很困惑[不是我写的]:
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()
只是returnTrue
或False
。如果我用另一种方式重写这个逻辑,我找不到作为 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" 结果是最后一个值,而不是像 False
或 None
) 这样的特定值,其中:
result = next(filter(None, sequence_to_check), sequence_to_check[-1])
当所有元素都是 "falsy".
时,使用最后一个元素("truthy" 或 "falsy")作为结果需要明确的是,如果要测试的事物集是固定的并且很小,根据 Anand 的回答明确 or
是更好的方法。