トップページ -> Python入門 基礎編 -> 条件分岐をマスターしよう ②

条件分岐をマスターしよう! ②

前回は条件分岐について学びました. 今回は条件式についてさらに深く解説していきます. 論理演算子 ブール値 リストと包含関係の順番で解説していきます.

論理演算子

論理演算子と言うと難しく聞こえますが,and or not のことです. 条件式の中にはこれらを用いることができます. 実際の例を見てみましょう.

  1. and

    if (条件A) and (条件B) と書くことによって,「もし(条件A)を満たし,かつ,条件Bを満たすなら」という条件が書けます. 入力が100より大きく,かつ,150より小さいならば「Hello World」と表示するプログラムを書いてみましょう. ここでは3通りの書き方で書いてみます.
    
    # and を使わない場合
    x = int(input())
    
    if x > 100:
        if x < 150:
            print("Hello World")
    
    これは今までの知識で書くことができますね. 100より大きいか確かめた後に150より小さいかを確かめています.
    
    # and を使う場合
    x = int(input())
    
    if x > 100 and x < 150:
        print("Hello World")
    
    andを使った書き方です. 二重のifブロックよりすっきりしましたね.
    
    # 不等号で両側から挟む場合
    x = int(input())
    
    if 100 < x < 150:
        print("Hello World")
    
    説明していませんでしたが,不等号で両側から挟むこともできます. これはPython特有の書き方で他のプログラミング言語にはあまりない書き方かもしれません.
  2. or

    if (条件A) or (条件B) と書くことで「もし条件Aか条件Bのいずれかを満たすなら」という条件が表現できます. ここで言う「いずれか」とはどちらも満たす場合も含みます. 今回は入力が100より小さい または 150より大きい ときに「Hello World」と表示しましょう. 今回は2通りの書き方で書きます.
    
    # or を使わない書き方
    x = int(input())
    
    if x < 100:
        print("Hello World")
    elif x > 150:
        print("Hello World")
    
    これは今までの知識で書ける書き方です. 上から順に条件を判断していきどこかで一つでも満たしたら処理を行えばいいのです.
    
    # or を使った書き方
    x = int(input())
    
    if x < 100 or x > 150:
        print("Hello world")
    
    orを使った書き方です. だいぶすっきりしましたね. 実際,orを使わずに複数の条件を表現しようとすると,elifと処理を何度も書くことになるため面倒です. or の便利さが分かっていただけたかと思います.
  3. not

    if not (条件A) と書くことで,「もし条件Aを満たさないならば」という条件が表現できます. 今回は入力が100でなければ「入力は100じゃないよ」と表示するプログラムを書いてみましょう. 今回は「これはちょっと…」という書き方も含めて4通りの書き方をしてみます.
    
    # not を使わない書き方
    x = int(input())
    
    if x < 100:
        print("入力は100じゃないよ")
    elif x > 100:
        print("入力は100じゃないよ")
    
    100より大きいなら表示 100より小さいなら表示という書き方をしました. これは見にくい上に or でまとめることができますね.
    
    # not を使わない書き方
    x = int(input())
    
    if x == 100:
        pass
    else:
        print("入力は100じゃないよ")
    
    突然 pass というワードが出てきて驚いている方もいられるかもしれませんが,これは 処理を何も行わないということを示す文です. x が100である場合は pass を用いて処理を行いません. そうでない場合は出力をします. 明示的に何も行わないことを記述したい場合はいい書き方かもしれません.
    
    # not を使った書き方
    x = int(input())
    
    if not x == 100:
        print("入力は100じゃないよ")
    
    notを使って簡潔に記述しました. 読みやすさも短さもいい感じですね.
    
    # ブール値に着目した書き方
    x = int(input())
    
    if x-100:
        print("入力は100じゃないよ")
    
    ブール値」に着目した書き方です. ここまでの知識では訳が分からない書き方ですね. ブール値についてはこの後すぐに解説します.

ここまでは3つの論理演算子 and or not について学びました. 同じ処理をするプログラムでも読みやすさや長さに違いがありましたね. プログラムの書き方に正解はありませんが,以下のことに気を付けるといいと思います.

  1. 誰が見ても読みやすいかどうか

    読みやすさを重視して書くとよいでしょう. 自分で書いたプログラムでも数日後には他人の書いたプログラムに見えるものです. コメントアウトを利用して説明を書き加えるのもよいでしょう.
  2. 記述が簡潔かどうか

    簡潔な記述は読みやすさにつながります. 同じような処理がひとまとめにできないか など常にプログラム全体の動きを考えながら記述するとよいでしょう.
  3. 処理時間が早いかどうか

    無駄な処理が多く時間がかかってしまうプログラムよりは処理がスマートで早く結果を返すプログラムのほうが優秀でしょう. 基礎編では難しい処理はしませんが,難しい処理をさせる場合はデータ構造やアルゴリズムに関する知識も重要になります. コードの書き方次第では10倍以上も時間がかかってしまったりします.
  4. 書きやすいかどうか

    最後に書きやすいかどうかです. 長期にわたって利用するプログラムは上記の3つが重要になるのですが,その場しのぎで結果だけほしい場合は書きやすさが重要です. 記述が簡潔で読みやすく処理が早いプログラムを1時間で書いて10秒の処理で結果を得るより, 記述が煩雑で読みづらく処理も遅いが10分でかけるプログラムで5分の処理で結果を得たほうが効率的な場合も往々にしてあります.
自分のできていないことを文章に起こすのはなかなか精神に来ますね. 一通りの書き方で満足せず他の記述の仕方についても考えてみるとプログラミングの力がつくと思います.

ブール値

次はブール値について学んでいきましょう. 条件式の正体が見えてきます. 今までごまかし続けていましたが,条件分岐のときからお話ししていた True False が正にブール値なのです. True False はそれぞれ1, 0と同一視されます.


print("論理和:",True+True,True+False,False+True,False+False)
print("論理積:",True*True,True*False,False*True,False*False)
ブール値
以下のようになります. やはり,True は 1,False は 0 として扱われていますね. 実は,条件式だけでなくオブジェクトそのものにもブール値があります. これはbool関数を用いて判定することができます. いくつか実験してみます.以下のコードを見てください.

print("Hello World:",bool("Hello World"))
print("空白:",bool(" "))
print("空の文字列:",bool(""))

print("[1]:",bool([1]))
print("空のリスト:",bool([]))

print("100:",bool(100))
print("0:",bool(0))
print("-100:",bool(-100))
以下のような結果になりましたね.
ブール値2
bool関数は文字列型 list, set, tuple, dict型に対してはその長さ(要素の数)が0であればFalse 0でなければTrueを返します. また,数値に対しては0であればFalse 0でなければFalseを返します. if (条件式) という書き方だけでなく if (オブジェクト) という書き方をしてもオブジェクトの持つブール値に応じて 条件分岐が起こります.オブジェクトを使った条件分岐を見てみましょう.

if [1,2,3]:
    print("A")
    
if []:
    print("B")
    
if "Hello World":
    print("C")
    
if "":
    print("D")
    
if 100:
    print("E")
    
if 0:
    print("F")
    
if not 0:
    print("G")
以下のようになります.
条件分岐とブール値
上記の説明通り長さが0でないか 数値が0でない場合のみ文字が出力されていますね. ここまでの知識を踏まえてもう一度,先ほどのコードを見てみましょう.

# ブール値に着目した書き方
x = int(input())

if x-100:
print("入力は100じゃないよ")
これは if x-100 の部分で x が100でない限りはx-100==0 にならないことを利用していますね. このコードの正体はオブジェクトの持つブール値を利用した書き方だったのです.

複数の要素を持つデータ型と条件

最後は手短に終わりますよ. ある x というデータが複数の要素を持つデータ型に含まれるかどうかを簡単に判定する方法があります. if x in (オブジェクト) という書き方をすることで簡単に記述できます. 以下では文字列型とリスト型について判定してみましょう.


if "H" in "Hello World":
    print("H in Hello World")

if "h" not in "Hello World":
    print("h not in Hello World")

if 1 in [1,2,3,4,5]:
    print("A")

if 0 in [1,2,3,4,5]:
    print("B")
以下のようになります.
包含関係とブール値
in を使うことで包含関係(要素が含まれるかどうか)が簡単に判定できますね.

今回は様々な条件式とオブジェクトのブール値について学びました. スマートに条件分岐が書けるかどうかでプログラムの可読性がだいぶ変わってきます. 使いながら徐々に慣れていきましょう. 次回は繰り返し処理を行うfor文について解説します.

<- 前へ戻る 【目次に戻る】 次へ進む ->