0
0

Pythonの`and`, `or`の動作

Last updated at Posted at 2024-07-31

自分が最初におもっていた仕様

誤解1 or, and は基本的に引数はbool型で返り値はbool型でbool

たとえば,
0<x<10 or x%2==0
という式があったら, x=14だとしたら

0<x<10Falseになって, x%2==0Trueとなって
False or Trueが計算されてTrueになるみたいな感じで頭の中で解釈していた。

誤解2 引数がbool型じゃない場合は, Noneの場合はFalseになって, それ以外の場合はTrueとなる

たとえば,

if os.getenv('OPENAI_API_KEY') :

とかくと, APIキーが設定されていず, Noneとなるとき, Falseとして解釈される.
os.getenv('OPENAI_API_KEY')があるときTrueと解釈される.

誤解2の解消

None以外でも以下のものはFalseと評価される。

「偽」と評価されるもの

以下のオブジェクトはFalseと評価される

  1. None
  2. False
  3. 数値のゼロ
    • 0(整数)
    • 0.0(浮動小数点数)
    • 0j(複素数)
  4. 空のシーケンスおよびコレクション
    • ''(空文字列)
    • [](空リスト)
    • ()(空タプル)
    • set()(空セット)
    • frozenset()(空フローズンセット)
    • {}(空辞書)
  5. 空の範囲
    • range(0)

「真」と評価されるもの

上記以外のすべてのオブジェクトはTrueと評価される。

実例

以下の例では、さまざまなオブジェクトが「真」と評価されるか「偽」と評価されるかを確認できます:

# 偽と評価されるもの
print(bool(None))  # False
print(bool(False))  # False
print(bool(0))  # False
print(bool(0.0))  # False
print(bool(0j))  # False
print(bool(''))  # False
print(bool([]))  # False
print(bool(()))  # False
print(bool(set()))  # False
print(bool(frozenset()))  # False
print(bool({}))  # False
print(bool(range(0)))  # False

# 真と評価されるもの
print(bool(True))  # True
print(bool(1))  # True
print(bool(-1))  # True
print(bool(3.14))  # True
print(bool(-3.14))  # True
print(bool(1j))  # True
print(bool(-1j))  # True
print(bool('Hello'))  # True
print(bool([1, 2, 3]))  # True
print(bool((1, 2, 3)))  # True
print(bool({1, 2, 3}))  # True
print(bool(frozenset({1, 2, 3})))  # True
print(bool({'key': 'value'}))  # True
print(bool(range(1, 10)))  # True

誤解1の解消

誤解1している状態だと

print(None and "default")    # False
print(0 and "fallback")      # False
print([] or "empty list")   # True
print("value" or "default") # True 
print(1 or 0)               # True 
print(True and False)        # False

みたいな結果になってしまう。

or 演算子は、左から右に評価し、最初にTrueと評価される値を返し, すべてがFalseの場合は、最後の値を返す

and 演算子は、左から右に評価し、最初にFalseと評価される値を返し,すべてがTrueの場合は、最後の値を返す

という仕様だ。

誤解1している状態だと

print(None and "default")    # None
print(0 and "fallback")      # 0
print([] or "empty list")   # "empty list"
print("value" or "default") # "value" 
print(1 or 0)               # 1 
print(True and False)        # False

となる。

この仕様を利用すると以下のような3項演算子をシンプルにかける

self.api_key = api_key if api_key else os.getenv('OPENAI_API_KEY')
# の代わりに
self.api_key = api_key or os.getenv('OPENAI_API_KEY')
# とかける.
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