今回は小ネタです。
この前ソースを眺めていたら、見慣れない関数があった。例えば次のようなコードである。
1 2 | if not filename.startswith( '/' ) or \ any (filename.endswith(x) for x in ignore_concat): |
この中で any が使われているが、なんだこれは?。・・・ということで調べてみました。
組み込み関数
any はPython組み込み関数である。似た関数として all というものもあるそうだ。
参考: Python 2.6ja2 documentation - 組み込み関数
- any(iterable)
- iterable のいずれかの要素が真ならば True を返します。 iterable が空なら False を返します。以下のコードと等価です。
バージョン 2.5 で追加
12345def
any
(iterable):
for
element
in
iterable:
if
element:
return
True
return
False
- all(iterable)
- iterable の全ての要素が真ならば (もしくは iterable が空ならば) True を返します。以下のコードと等価です。
バージョン 2.5 で追加
12345def
all
(iterable):
for
element
in
iterable:
if
not
element:
return
False
return
True
イテレータを渡してあげれば、anyだったら要素が一個でも真ならTrueを返すのか、なるほど。Python2.5 から実装されたので、結構前からあるんだな。
any と all を使ってみる
せっかくなので使ってみる。
1 2 3 4 5 | >>> test1 = [ True , False , True ] >>> any (test1) True >>> all (test1) False |
True と False の値をもったリストオブジェクトを any と all に渡してみると、any は True になって all は False になった。
1 2 3 4 5 6 | >>> a = 5 >>> test2 = [a> 3 , a = = 6 , a< 9 ] >>> any (test2) True >>> all (test2) False |
次に変数の条件式をリストオブジェクトに入れて、 any と all に渡してみる。any は True になって all は False になった。
1 2 3 4 5 | >>> test3 = { 'satou' : 7 , 'suzuki' : 6 , 'takahashi' : 8 , 'tanaka' : 5 } >>> any (v> = 6 for v in test3.values()) True >>> all (v> = 6 for v in test3.values()) False |
更に辞書型オブジェクトの値部分をFor文で回して条件式にする構文を、any と all に渡してみる。any は True になって all は False になった。
例3の関数に渡すパラメータはジェネレータ式となっている。
参考: Python 2.6ja2 documentation - ジェネレータ式
リスト内包表記で記述することも可能だ。
1 2 3 4 5 | >>> test3 = { 'satou' : 7 , 'suzuki' : 6 , 'takahashi' : 8 , 'tanaka' : 5 } >>> any ([v> = 6 for v in test3.values()]) True >>> all ([v> = 6 for v in test3.values()]) False |
参考: Python 2.6ja2 documentation - ジェネレータ式とリスト内包表記
しかし特にany関数では、ジェネレータ式を使用した方がパフォーマンスが良いと思う。
特に例3の構文は、いろいろと応用できる。
any と all は頻繁ではないかもしれませんが、よく使用するロジックです。このため、これらの組み込み関数を利用すれば、かなり便利になるでしょう。
( 2011/12/8 - 微妙に間違っている気がしたので、内容を若干変更しました。 )