誰かがPythonでこの場合に組み込みのbuinctionall
が戻る理由を説明できますか?True
all([])
In [33]: all([])
Out[33]: True
In [34]: all([0])
Out[34]: False
In [35]: __builtins__.all([])
Out[35]: True
誰かがPythonでこの場合に組み込みのbuinctionall
が戻る理由を説明できますか?True
all([])
In [33]: all([])
Out[33]: True
In [34]: all([0])
Out[34]: False
In [35]: __builtins__.all([])
Out[35]: True
私は、他の答えのどれもが、なぜこれが当てはまるのかという問題に本当に対処しているとは確信していません。
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)
ドキュメントから:
iterableのすべての要素がtrueの場合(またはiterableが空の場合)はTrueを返します。
したがって、大まかに言うと、このように定義されているだけです。
あなたはそれを回避することができます
list = []
if list and all(list):
pass
ドキュメントが言うように、all
は次と同等です:
def all(iterable):
for element in iterable:
if not element:
return False
return True
空iterable
の場合、ループ本体は実行されないため、True
すぐに返されます。
これについてのもう1つの説明は、all
とany
は二項演算子の一般化でありand
、or
任意に長いパラメーターの数であるということです。したがって、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)
True
とFalse
パラメータは、とを示していall([]) == True
ますany([]) == False
。
を使用した式は、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)
(タスクに結果がない場合はそれほど悪くはありませんが、結果が正しくない場合は何かが非常に壊れます。)