[Python入門]if文による条件分岐:Python入門(1/3 ページ)
複雑な構造のプログラムを書くには「制御構造」が欠かせない。その中でも、条件によって処理を振り分けるために使われるif文に関連する話題を取り上げ、Python 3.10で追加されたmatch文を簡単に紹介する。
* 本稿は2019年5月7日、2022年5月25日に公開/改訂された記事を、Python 3.11.5で動作確認したものです(確認日:2023年9月11日)。
前回までにPythonのプログラムを構成する最小限の要素ともいえる、文字列、数値、変数、幾つかの演算子(四則演算子、代入演算子)、コメントなどについて見てきた。今回から数回に分けて、より複雑なプログラムを作成する上で必須の要素である「制御構造」と呼ばれる機能を取り上げる。今回は制御構造について簡単に説明をした後で、「条件分岐」を行うための構文を行う構文を紹介しよう。
制御構造とは
本連載の第2回「Hello Python」では「プログラムは上から下に順に実行される」と述べた。例えば、以下のコードは上から順に実行される。
print('最初に実行される')
print('次に実行される')
print('最後に実行される')
これは直観的でよく分かる動作だ。しかし、それだけではうまくプログラムを構成できないこともある。例えば、「何らかの条件が成立したら処理Aを実行し、そうでなければ処理Bを実行する」とか「指定した回数だけ、同じ(ようで少しだけ違う)処理を繰り返す」といった場合がそうだ(後者は「必要なだけ、似た処理をプログラムに書き下せばいいじゃん」と思う人もいるかもしれないが、次回に取り上げる「繰り返し処理」を行うための制御構造を使うことで、コードを簡潔にできる)。
このような処理では、プログラムコードは単に上から順に実行されるのではなく、「条件によって実行されるところと実行されないところ」ができたり、「特定の箇所だけが何度も実行」されたりするようになる。プログラム実行の流れを変化させる、構文をまとめて「制御構造」と呼ぶ。
制御構造には大きく分けて次の2種類がある(この他にもプログラムの実行フローを制御する構文は幾つもあるが、それらについては必要に応じて説明していくことにしよう)。
- 条件分岐:何らかの条件に応じて、実行するプログラムコードを分岐させる
- 繰り返し処理:何らかの条件が成立している間、同一のコードを実行し続ける
以下ではこのうちの「条件分岐」を取り上げると共に、Pythonプログラムを構成するさまざまな要素(前回紹介しなかった演算子など)も取り上げていこう。「繰り返し処理」については次回と次々回に紹介する。
条件分岐
上でも述べたが「条件分岐」とは、「何らかの条件に応じて、実行するプログラムコードを分岐させる」ものだ。Pythonではif文を使って条件分岐を行う(他のプログラミング言語でよく見られるswitch文Pythonにはないが、Python 3.10ではより高機能なmatch文が追加された。これについては後で簡単に紹介する)。
if文はその名前から想像できる通り、「もしXXXがYYYだったらAする。そうでなかったらBする」といった処理を行う。
if文の基本構文
まずはif文の最も基本的な構文を以下に示す。
if 条件:
条件成立時に実行するブロック
これがif文の最も基本的な構文だ。なお、ここまでに説明してこなかったが、今回紹介するif文や、次回と次々回に取り上げるfor文とwhile文など、複雑な構造を持つ文のことを「複合文」(他の文を含む文)と呼ぶ(これに対して、「x = 0」のような単純な文のことを「単純文」と呼ぶ)。
複合文では(特にif文ではよく言及されるが)、文は1つ以上の「節」で構成される。上に示した構文の場合、「節」は「if 条件:」と、その下でインデントされている「ブロック」(「スイート」ともいう)で構成される。そして、最初の行が「if」であることから、これを「if節」と呼ぶ(後で見る「if〜else」文はif節とelse節の2つの節で、「if〜elif〜else」文はif節とelif節とelse節で構成される)。
ここでは、ユーザーから何かの数を受け取り、それが偶数だったら「even」と画面に表示するプログラムを考えてみよう。回りくどいかもしれないが、このコードがどのようなものになるかを少しずつ考えていこう*1。
*1 第2回「Hello Python」の「もう少し難しいHello Worldプログラム」で触れているように、「Try Jupyter」ページの「Jupyter Notebook」リンクから起動するPython環境では以下のコードがうまく動作しない。対処策としては上記ページにあるように、Binderを使う方法がある。以下では、Binderを使って起動した環境で話を続けることにしよう。
ユーザーからの入力は変数numberに受け取るものとすると、これはこのように書き下せる。
変数numberユーザーからの入力を受け取る
if 変数numberの値が偶数:
条件成立時に実行するブロック(「even」と画面に表示)
まず、この場合、上に示した構文の「条件成立時に実行するブロック」とは「evenと画面に表示する」ことであり、これは既におなじみのprint関数を使えばよい。
変数numberにユーザーからの入力を受け取る
if 変数numberの値が偶数:
print('even')
ユーザーからの入力を受け取るには、第2回「Hello Python」の「もう少し難しいHello Worldプログラム」などでも使用したinput関数が使える。よって、上のコードは次のように書き換えられる。
number = input('何か数値を入力してください: ')
if 変数numberの値が偶数:
print('even')
ただし、第5回「Pythonの文字列の基本」の「文字と数値の変換」でも述べたように、input関数を使ってユーザーから受け取る入力は全て文字列となる。「100」という文字列は「1」という文字、「0」という文字、「0」という文字が連なったもので、「100」という整数値ではないことには注意が必要だ。そのため、文字列を整数に変換する必要があるが、これにはint関数が使える。
number = input('何か数値を入力してください: ')
number = int(number)
if 変数numberの値が偶数:
print('even')
これで、実際のif文の説明に入る準備が整った。if文の条件は「入力された数値が偶数」つまり「変数numberの値が偶数」である。偶数とは「2で割り切れる数」つまり「2で整数除算を行った余りが0となる数」のことだ。第3回「数値と算術演算」の「数値の算術演算と演算子」で述べたように、余りを求めるには「%」演算子が使える。ここでは「number % 2」で変数numberの値を2で割った余りが得られる。ある値が何かの値と等しいかを調べるには比較演算子の「==」が使える。つまり、「変数numberの値が偶数」かは「number % 2 == 0」のようにして表現できるということだ。
このことから、条件の部分をPythonのコードとして表現すると次のようになる。
number = input('何か数値を入力してください: ')
number = int(number)
if number % 2 == 0:
print('even')
このコードをセルに入力して、実行した例を示す。Jupyter Notebookなどでは、input関数によるユーザー入力があれば、セルの下にその入力ボックスが表示されるので、そこに何か適当な数値を入れて[Enter]キーを入力することで、それが偶数かどうかを判定してくれる。
ここまでに見てきたのが、一番簡単なif文の使い方だ。ただし、これでは「もしXXXがYYYだったら、Aする」という処理しか表現できない。「そうでなかったらBする」という処理を行いたいときにはどうすればよいだろう。例えば、「ユーザーが入力した数値が偶数ならevenと、そうでなかったらoddと表示する」といった処理がそうだ。このようなときには次に紹介する「if〜else文」を使う。
if〜else文
if〜else文の構造は次のようになる。
if 条件:
条件が成立したときに実行するブロック
else:
条件が成立しなかったときに実行するブロック
既に述べた通り、if〜else文はif節とelse節で構成される。「else:」は「if 条件:」と同じインデント位置に置き、そこからインデントを付けて、指定した条件が成立しなかったときに実行する処理を記述する。この形式のif文を使えば、「ユーザーが入力した数値が偶数ならevenと、そうでなかったらoddと表示する」処理が次のように書ける。
number = input('何か数値を入力してください: ')
number = int(number)
if number % 2 == 0:
print('even')
else:
print('odd')
実行結果を以下に示す。
if〜else文は「条件が成り立つか成り立たないか」の二択で全ての場合分けを表現できる場合には有用だが、そうではなくさらに分岐が必要な場合もある。そこで、プログラミングの世界ではよくある演習問題である「FizzBuzz問題」を解きながら、if文のもう1つの形式である「if〜elif〜else」文について見てみることにしよう。
Copyright© Digital Advantage Corp. All Rights Reserved.