一般的に言えば:
all
とany
は、 iterable を取り、 を返す関数True
です。
- の場合、
all()
イテラブルのどの値も偽ではありません。
- の場合、
any()
少なくとも 1 つの値が true です。
値x
が偽の iffbool(x) == False
です。値x
は Truthy iffbool(x) == True
です。
iterable 内の非ブール値は問題ありません —は、次のルールに従ってマップbool(x)
(または、必要に応じて強制)します: の docstringは、「真実」/「偽」に対して「真」/「偽」という用語を使用し、具体的なブール値に対しては/を使用します。x
0
0.0
None
[]
()
[]
set()
False
True
bool
True
False
特定のコード サンプルでは:
これらの関数がどのように機能するかを少し誤解しました。したがって、以下はあなたが思っていたこととはまったく違うことをします:
if any(foobars) == big_foobar:
...最初にまたはのいずれかany(foobars)
に評価され、次にそのブール値が と比較されるため、通常は常に得られます(偶然に同じブール値でない限り)。True
False
big_foobar
False
big_foobar
注: iterable はリストにすることができますが、ジェネレータ/ジェネレータ式 (≈ 遅延評価/生成リスト) またはその他のイテレータにすることもできます。
代わりに必要なのは次のとおりです。
if any(x == big_foobar for x in foobars):
これは基本的に最初にブール値のシーケンスを生成する iterable を構築します — の各アイテムに対してfoobars
、アイテムを比較しbig_foobar
、結果のブール値を結果のシーケンスに出力します。
tmp = (x == big_foobar for x in foobars)
次にany
、すべてのアイテムを調べて、最初の真の要素を見つけるとすぐにtmp
戻ります。True
次のことを行ったかのようです。
In [1]: foobars = ['big', 'small', 'medium', 'nice', 'ugly']
In [2]: big_foobar = 'big'
In [3]: any(['big' == big_foobar, 'small' == big_foobar, 'medium' == big_foobar, 'nice' == big_foobar, 'ugly' == big_foobar])
Out[3]: True
注: DSM が指摘したように、any(x == y for x in xs)
は同等ですy in xs
が、後者の方が読みやすく、書き込みが速く、実行も高速です。
いくつかの例:
In [1]: any(x > 5 for x in range(4))
Out[1]: False
In [2]: all(isinstance(x, int) for x in range(10))
Out[2]: True
In [3]: any(x == 'Erik' for x in ['Erik', 'John', 'Jane', 'Jim'])
Out[3]: True
In [4]: all([True, True, True, False, True])
Out[4]: False
参照: http://docs.python.org/2/library/functions.html#all