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

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

我想弄清楚any()all()Python内置函数可以工作。

我正在尝试比较元组,以便如果任何值不同,它就会返回True如果它们都是一样的,它就会回来False..在这种情况下,他们如何返回[假,假]?

ddefaultdict(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?


明月笑刀无情
浏览 1299回答 5
5回答

Helenr

你可以粗略地想到any和all作为一系列逻辑or和and分别为操作符。任何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:还有一件重要的事要知道any和all是,它会短路的执行,瞬间他们知道结果。优点是,不需要消耗整个可迭代性。例如,>>> 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)的结果7, 8和9.这个极好的东西非常巧妙地运用在这个答案.有了这个基本的理解,如果我们看一下您的代码,您就知道了。any(x) and not all(x)这就确保了,至少有一个价值观是真实的,但不是所有的。所以它才会回来[False, False, False]..如果你真的想看看这两个数字是不是不一样的话,print [x[0] != x[1] for x in zip(*d['Drd2'])]

呼唤远方

我知道这很古老,但我认为在代码中展示这些函数的样子可能会有所帮助。这确实说明了逻辑,比文字或表格海事组织更好。实际上,它们是用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(),他只是简单地发布了上面的代码片段来解释这些问题。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python