Pythonでifの複数条件(and・or)が不要になる【all・any】

Pythonでifの複数条件(and・or)が不要になる【all・any】 プログラミング

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("すべて未完")
タイトルとURLをコピーしました