PyQオフィシャルブログ

Pythonのオンライン学習プラットフォームPyQのオフィシャルブログです

Pythonのelifはなぜ必要なのですか?という疑問にPyQサポートがお答えします

id:hirokiky です。

Pythonの elif はなぜ必要?

こんなご質問をいくつかPyQサポートにいただきました。

ifをならべても、elifを使っても同じではないですか? 用途や違いを知りたいです。

たしかにそんな気はしますね。 ですが elif も活躍する場面があります。実際のプログラムと、 elif が無い場合の苦労をご紹介できればと思います。

elifの必要なプログラム

FizzBuzzというゲームをプログラムしてみましょう。

FizzBuzzについて

最初のプレイヤーは「1」と数字を発言する。次のプレイヤーは直前のプレイヤーの次の数字を発言していく。 ただし、3で割り切れる場合は「Fizz」(Bizz Buzzの場合は「Bizz」)、 5で割り切れる場合は「Buzz」、 両者で割り切れる場合(すなわち15で割り切れる場合)は「Fizz Buzz」(Bizz Buzzの場合は「Bizz Buzz」)を 数の代わりに発言しなければならない。

https://ja.wikipedia.org/wiki/Fizz_Buzz

この「数字を判定して適切に発言するプログラム」を書くと以下のようになります。 num に答えが必要な数字を入れて動かしてみてください。

num = 15

if num % 15 == 0:  # 15で割り切れるかどうかを判定しています。
    print("FizzBuzz")
elif num % 5 == 0:
    print("Buzz")
elif num % 3 == 0:
    print("Fizz")
else:
    print(num)

FizzBuzzの判定をする条件を日本語で書くとこうなります。

  • 15で割り切れるか? => FizzBuzz
  • そうでないとき5で割り切れるか? => Buzz
  • そうでないとき3で割り切れるか? => Fizz
  • そうでないとき => 数字

と条件が続いていきます。 「そうでないとき〜」と続くのが elif の特徴です。 elif を使うのは、「前までの条件を引き継いで条件を書きたいとき」です。

elifが無くて条件が複雑になる場合

例えば下に elif を消した if だけのプログラムを書いてみました。 このプログラムは期待した動作をしません。 数字が15の場合などに「FizzBuzz」、「Buzz」、「Fizz」と3つ答えが表示されてしまいます。

num = 15

if num % 15 == 0:  # 15で割り切れるかどうかを判定しています。
    print("FizzBuzz")
if num % 5 == 0:
    print("Buzz")
if num % 3 == 0:
    print("Fizz")

理由は、15という数字が15でも5でも3でも割り切れるからです。なのでFizzBuzz、Buzz、Fizzの3つ表示されてしまいます。 elif の「15で割り切れないとき 、5で割り切れるか?」のような、前の条件を引き継いだ条件が書けないのでこうなっています。

elif なしでも正しく動作するよう頑張って書くとこのように複雑になります (このプログラムで100%あっているかどうか自信がないほどに複雑ですね)。

if num % 15 == 0:  # 15で割り切れるかどうかを判定しています。
    print("FizzBuzz")
if num % 15 != 0 and num % 5 == 0:
    print("Buzz")
if num % 15 != 0 and num % 3 == 0:
    print("Fizz")
if num % 5 != 0 and num % 3 != 0:
    print(num)

elifは前の条件を引き継いだ条件が書ける

このように elif がないと、 前の条件を引き継いだ条件 を続けて書くのが難しくなるので elif はプログラムに必要です。 「elif なければプログラムが成り立たない」というわけではないですが、かなり複雑になってしまいます。

いかがでしょうか。

PyQのメールサポートは、PyQのエキスパートたちにメールで質問ができるサポートです。 Pythonを学んでいてハマってしまったり、腑に落ちないことがあるときに質問できます。

有識者に直接質問することで時間を無駄にすることなく学習できます。 質問の内容は、今回のような「Pythonのこれって何の意味があるの?」のような疑問でも大歓迎です!

ぜひプログラミングやPythonの学習にPyQをお役立てください。

pyq.jp