2

誰かがPythonでこの場合に組み込みのbuinctionallが戻る理由を説明できますか?Trueall([])

In [33]: all([])
Out[33]: True

In [34]: all([0])
Out[34]: False

In [35]: __builtins__.all([])
Out[35]: True
4

5 に答える 5

6

私は、他の答えのどれもが、なぜこれが当てはまるのかという問題に本当に対処しているとは確信していません。

Pythonの定義all()は、ブール論理に基づいています。たとえば、「すべての白鳥は白い」と言うと、1つの黒い白鳥がその発言を反証します。ただし、「すべてのユニコーンはピンクである」と言えば、ピンク以外のユニコーンがいないという理由だけで、論理学者はそれを真のステートメントと見なします。言い換えれば、「すべて」は空虚な真です。

実際には、それは私たちに有用な不変量を与えます。all(A)とが両方とも真の場合all(B)、の組み合わせall(A + B)も真です。falseの場合、一方all({})がfalseである2つの式を組み合わせると、予期しないtrueの結果が突然得られるため、あまり役に立たない状況になるはずです。

したがって、Pythonはall([]) == Trueブール論理を使用し、同様の構造を持つ他の言語との一貫性を保ちます。

それをPythonに戻すと、多くの場合、空虚な真理によってアルゴリズムが単純になります。たとえば、ツリーがあり、すべてのノードを検証する場合、ノードがいくつかの条件を満たす場合にノードが有効であり、そのすべての子が有効であると言えます。all()条件を満たし、子がないか、すべての子が有効である場合に有効であると言わなければならないため、これの代替定義はより複雑になります。

class Node:
    def isValid(self):
        return some_condition(self) and all(child.isValid for child in self.children)
于 2012-12-06T08:56:32.337 に答える
2

ドキュメントから:

iterableのすべての要素がtrueの場合(またはiterableが空の場合)はTrueを返します。

したがって、大まかに言うと、このように定義されているだけです。

あなたはそれを回避することができます

list = []
if list and all(list):
    pass
于 2012-12-06T07:40:00.497 に答える
2

ドキュメントが言うように、allは次と同等です:

def all(iterable):
    for element in iterable:
        if not element:
            return False
    return True

iterableの場合、ループ本体は実行されないため、Trueすぐに返されます。

于 2012-12-06T07:40:10.457 に答える
0

これについてのもう1つの説明は、allanyは二項演算子の一般化でありandor任意に長いパラメーターの数であるということです。したがって、allおよびanyは次のように定義できます。

def all(xs):
  return reduce(lambda x,y: x and y, xs, True)

def any(xs):
  return reduce(lambda x,y: x or y, xs, False)

TrueFalseパラメータは、とを示していall([]) == Trueますany([]) == False

于 2012-12-06T13:30:29.790 に答える
0

を使用した式は、allによって書き換えることができany、その逆も可能です。

not all(iterable)
# is the same as:
any(not x for x in iterable)

対称的に

not any(iterable)
# is the same as:
all(not x for x in iterable)

これらのルールはそれを要求しall([]) == Trueます。


この関数allは、読み取り可能なアサートに非常に役立ちます。

assert all(required_condition(x) for x in some_results_being_verified)

(タスクに結果がない場合はそれほど悪くはありませんが、結果が正しくない場合は何かが非常に壊れます。)

于 2012-12-06T15:09:26.983 に答える