为了账号安全,请及时绑定邮箱和手机立即绑定

Python的任意函数和所有函数是如何工作的?

Python的任意函数和所有函数是如何工作的?

明月笑刀无情 2019-06-29 17:41:45
Python的任意函数和所有函数是如何工作的?我想弄清楚any()和all()Python内置函数可以工作。我正在尝试比较元组,以便如果任何值不同,它就会返回True如果它们都是一样的,它就会回来False..在这种情况下,他们如何返回[假,假]?d是defaultdict(list).print d['Drd2']# [[1, 5, 0], [1, 6, 0]]print list(zip(*d['Drd2']))# [(1, 1), (5, 6), (0, 0)]print [any(x) and not all(x) for x in zip(*d['Drd2'])]# [False, False, False]据我所知,这应该是# [False, True, False]因为(1,1)是相同的,(5,6)是不同的,而(0,0)是相同的。为什么对所有的元组都要评估为false?
查看完整描述

5 回答

?
Helenr

TA贡献1780条经验 获得超4个赞

你可以粗略地想到anyall作为一系列逻辑orand分别为操作符。

任何

any会回来True什么时候至少有一个元素是特鲁西。读到真值检验

all会回来True只有当所有元素是真心实意的。

真值表

+-----------------------------------------+---------+---------+
|                                         |   any   |   all   |
+-----------------------------------------+---------+---------+
| All Truthy values                       |  True   |  True   |
+-----------------------------------------+---------+---------+
| All Falsy values                        |  False  |  False  |
+-----------------------------------------+---------+---------+
| One Truthy value (all others are Falsy) |  True   |  False  |
+-----------------------------------------+---------+---------+
| One Falsy value (all others are Truthy) |  True   |  False  |
+-----------------------------------------+---------+---------+
| Empty Iterable                          |  False  |  True   |
+-----------------------------------------+---------+---------+

附注1:在正式文档中解释了空的迭代情况,如下所示

any

回归True如果可迭代的任何元素为真。如果可迭代为空,则返回False

因为没有一个元素是真的,所以它返回False在这种情况下。

all

回归True如果可迭代的所有元素都是真的(或者如果可迭代是空的).

因为没有一个元素是false,所以它返回True在这种情况下。


附注2:

还有一件重要的事要知道anyall是,它会短路的执行,瞬间他们知道结果。优点是,不需要消耗整个可迭代性。例如,

>>> multiples_of_6 = (not (i % 6) for i in range(1, 10))>>> any(multiples_of_6)True>>> list(multiples_of_6)[False, False, False]

这里,(not (i % 6) for i in range(1, 10))是一个生成器表达式,它返回True如果当前数字在1和9内是6的倍数。any迭代multiples_of_6当它相遇的时候6,它找到一个Truthy值,因此它立即返回。True的其他部分multiples_of_6不会被迭代。这就是我们印刷时所看到的。list(multiples_of_6)的结果789.

这个极好的东西非常巧妙地运用在这个答案.


有了这个基本的理解,如果我们看一下您的代码,您就知道了。

any(x) and not all(x)

这就确保了,至少有一个价值观是真实的,但不是所有的。所以它才会回来[False, False, False]..如果你真的想看看这两个数字是不是不一样的话,

print [x[0] != x[1] for x in zip(*d['Drd2'])]


查看完整回答
反对 回复 2019-06-29
?
呼唤远方

TA贡献1856条经验 获得超11个赞

我知道这很古老,但我认为在代码中展示这些函数的样子可能会有所帮助。这确实说明了逻辑,比文字或表格海事组织更好。实际上,它们是用C实现的,而不是纯Python,但它们是等价的。

def any(iterable):
    for item in iterable:
        if item:
            return True
    return Falsedef all(iterable):
    for item in iterable:
        if not item:
            return False
    return True

特别是,您可以看到,空迭代的结果只是自然结果,而不是特例。你也可以看到短路的行为,这实际上是更多的工作。短路。

当Guido van Rossum(Python的创建者)第一次提议增加any()all(),他只是简单地发布了上面的代码片段来解释这些问题。


查看完整回答
反对 回复 2019-06-29
  • 5 回答
  • 0 关注
  • 1298 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信