1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

pythonメモ - 「if not A and B」は「if (not A) and B」だった件

Posted at

はじめに

if notの構文で静かにハマったのでメモ残す。

not演算子とは?

参考:https://www.sejuku.net/blog/65070

if文におけるnot演算子は条件式が偽の場合、真を返す。
これだけだとちょっとわけわからないので例文。

例文
x = 10
if not x == 20:
    print(True)
else:
    print(False)
実行結果
True
実際の使用例
if not len(sys.argv[1:]):
    usage()

このスクリプトを見ると、
「引数が1以上では無い(=引数が無い)場合は、usage()を呼び出す。」となる。
まぁ、これはわからないでもない。

よくわからなかったケース

ハマったのが以下の文。andとnotの合わせ技。ちょっとよくわからない…
if (not listen) and len(target) and port > 0:
なのか、
if not (listen and len(target) and port > 0):
なのか分からなくなって悩んだ。

例文
if not listen and len(target) and port > 0:
    buffer = sys.stdin.read()
    client_sender(buffer)           

and/or演算子を含む場合の読み方

結論からいうとこのスクリプトと同意。notはlistenにしか掛かってない。

例文
if (not listen) and len(target) and port > 0:
    buffer = sys.stdin.read()
    client_sender(buffer)           

これだけだとわからないので、いくつか例文を書いて確認した。

x = 20
y = 20

# ケース1:結果は「No」
if not x == 10 and y == 20
    print("Yes")
else:
    print("No")

# ケース2:カッコを付けて条件式の評価順位を明確にしたところ、結果はケース1と同じく「No」
if (not x == 10) and y == 20
    print("Yes")
else:
    print("No")

# ケース3:not ==ではなく!=にしてみた。こちらも結果はケース1と同じく「No」
if x != 10 and y == 20
    print("Yes")
else:
    print("No")

おわりに

こんな記事をQiitaに残すのはなかなか恥ずかしいけど
当時何にハマったのか、ということを思い出に残したくて投稿しました。
自分の場合こういう何でもないことでハマることは何度も繰り返すので。

1
0
1

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
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?