0
0

More than 1 year has passed since last update.

久しぶりにpython書いたら複数文字列の演算子を使った条件式の書き方わからんくなってた

Posted at

条件式 and,or

Pythonを書く時、論理演算子としてandorを使って、条件式を書くことがある。(JavaScriptやCでは &&|| で表現する)
有名なもので、FizzBuzz問題3の倍数かつ5の倍数を表現するときにandが使われることが例に挙げられる。

複数文字列がinで囲まれた大きな文字列に含まれるかどうか

次のような場合を考える

example1.py
if "abc" or "def" in "ghi":
    print("True")
else:
    print("False")

>>> True

直感的には、"abc"も"def"も"ghi"には含まれていないため、Falseが返ることが期待されますが、実際には、予想と反するTrueが返ってきます。

これがなぜかというと、pythonでは次のように解釈されているためです。

example2.py
if "abc" or ("def" in "ghi"):
...

この場合、左側の条件式"abc"が真として扱われるため、右側の条件式が評価されることなく、if文はTrueとなります。

if文の改善を試みる

example1.pyの改善を試みます。

example3.py
# パターン1
if ( "abc" or "def" ) in "ghiabc":
    print("True")
else:
    print("False")
>>> True

# パターン2
if ( "abc" or "def" ) in "ghidef":
    print("True")
else:
    print("False")
>>> False

パターン1は期待通りに結果が返ってきますが、パターン2では期待に反する結果が返ってきます。
このことから、パターン2のように書いた場合、左側の条件項(今回の場合"abc")のみが評価対象になっています。
そのため、評価対象のみを括弧で囲むことは、解決策にはなりません。

結論から言うと、example1.pyに書いたコードを期待通りに実行する場合は次のように書く必要があります。

example4.py
if "abc" in "ghi" or "def" in "ghi":
    print("True")
else:
    print("False")
>>> False

example4.pyでは、各条件に対して評価を行っています。
これが確実なコーディング方法です。

まとめ

Pythonで複数文字列の演算子を使た条件式を書く場合、直感とは反する結果が返ってくることがある。
内部的にどう処理されているかを把握しておくことで、コーディング時に困惑することが少なくなるかと思います。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0