Python の if not と or を組み合わせた時は条件に注意

Pythonで以下のようなif not 条件1 or 条件2を実行する。

def sleep_in(weekday, vacation):
    if not weekday or vacation:
        return True
    else:
        return False

すると以下のような結果となる。

weekday vacation 実行結果
True True True
True False False
False True True
False False True

ここでvacationnotの判定になっていないことに疑問を感じた人向けの内容となるが、 これはnotweekdayのみに有効になっているためである。
判定を分解すると以下のようになる。

  • not 条件1
  • 条件2

もし条件2notで判定させたければ、if not 条件1 or not 条件2というように都度notを付けるようにする。