ifで複数条件を判定する場合、「and」や「or」を使いますよね?
このことは、Pythonに限ったことではありません。
PHP・javaScriptなら「&&」や「||」です。
プログラミングにおいては、常識と言っても差し支えないでしょう。
でも、Pythonではこの常識が崩されました・・・
やっぱり、「Pythonスゲー」と思わされました。
本記事の内容
- Pythonには「all」と「any」という組み込み関数がある
- 「and」は「all」でOK
- 「or」は「any」でOK
それでは、上記に沿って解説していきます。
Pythonには「all」と「any」という組み込み関数がある
Python(バージョン3.7.8以上)には、69個の組み込み関数が用意されています。
このうち、「all」と「any」という関数が存在しています。
これらの関数が、if文における複数条件をスマートにしてくれます。
コーディングの内容次第ですが、if文において「and」や「or」を不要にします。
個人的には、「all」と「any」を知ってから、「and」や「or」は使っていません。
やはり、横に長くなるコードは見にくいです。
その意味では、コードの可読性・保守性(メンテナンス性)も向上していると言えます。
ここで、改めて整理しておきましょう。
- 「and」は「all」でOK
- 「or」は「any」でOK
このことを以下で説明していきます。
「and」は「all」でOK
「条件がすべて正の場合にある処理を行なう」
このことをif文でプログラミングすることは、ごくごく普通にあることです。
例えば、変数5個がすべて正の場合の条件判断を行う場合を考えましょう。
Pythonでコーディングすると、次のようなモノになると思います。
if a and b and c and d and e: print("全部True") if a: if b: if c: if d: if e: print("全部True")
プログラムに慣れていれば、1つ目のコーディングになるでしょう。
実際、私はこのようにコーディングしてきました。
しかし、それが「all」を用いれば、次のようにコーディングできます。
if all([a, b, c, d, e]): print("全部True")
シンプルじゃないですか?
ここで、公式サイトにおける「all」について確認しておきます。
all(iterable) iterable の全ての要素が真ならば (もしくは iterable が空ならば) True を返します。以下のコードと等価です
判断したい変数は、すべてリストに放り込んでいます。
iterableは、forで表現できるモノだという認識で大丈夫です。
なお、リスト型や辞書型に関しては、次の記事で解説をしています。
変数が5個程度なら、まだ「and」を4つ書いてやり過ごすこともできるでしょう。
しかし、これが100個となればどうしますか?
実際にそんなケースがあるのか?と思われるかもしれません。
しかし、それがあるのですよね。
例えば、データベースから100行を取得したとします。
各データのflgカラムが、すべて「True」なら「すべて完了」と表示するようなケースです。
「すべて完了」でないなら、「未完あり」と表示するという具合ですね。
100行をDataFrame(データフレーム)で変換していれば、次のようなチェックが可能となります。
df = pd.read_sql(query, con) if all(df["flg"]): print("すべて完了") else: print("未完あり")
「all」さん、凄くないですか?
これを「all」を使わず、コーディングするならfor文でクルクル回すでしょうね。
一つでもflgがTrueでないなら、その時点でforをbreakで抜けるというようになるでしょう。
そうやって考えれば、「all」でのチェックはかなり便利です。
それに、コードもかなり見やすくなります。
「or」は「any」でOK
「条件が一つでも正の場合にある処理を行なう」
このような仕様も頻繁に出てきます。
早速、実際のプログラムで確認していきましょう。
if a or b or c or d or e: print("1つ以上はTrue") else: print("全部False")
「or」が多すぎでウザイコードも、「any」を使えば以下のようになります。
if any([a, b, c, d, e]): print("どれか一つはTrue") else: print("全部False")
「all」同様、「any」もコードがシンプルになります。
公式サイトにおける「any」の説明を確認しておきましょう。
any(iterable) iterable のいずれかの要素が真ならば True を返します。iterable が空なら False を返します。以下のコードと等価です
「all」と同じようにデータベースを利用する場合に、「any」もその威力をより発揮するでしょう。
df = pd.read_sql(query, con) if any(df["flg"]): print("1つ以上は完了") else: print("すべて未完")