if文の基本
このレッスンで作るもの —
ifを使って、金額が大きいときだけ違う答えを返すprice_alertを作ります。
if 文の基本
第 3 章では price >= 1000 のような比較が True か False を返すことを扱いました。ただし判定の結果を手に入れただけでは、プログラムの動きは変わりません。結果によって 実行する処理そのものを切り替える 道具が if です。
おこづかい帳で言えば「1000 円以上の買い物をしたときだけ警告を出す」という動きが、ここではじめて書けるようになります。
条件分岐は、プログラムがはじめて「考えて動いている」ように見える瞬間です。ここから先、書けるものの幅が一気に広がります。
文法を確認する
if のうしろに条件を書き、行末に半角のコロンを置きます。次の行から、条件が True のときだけ動く処理を 半角スペース 4 つ分下げて 書きます。
if price >= 1000:
return "高額"
return "通常"条件が成り立てば return "高額" に進み、関数はそこで終わります。成り立たなければ if の中は丸ごと飛ばされ、下の return "通常" に進みます。
この下げ幅を インデント と呼びます。Python ではインデントが「どこからどこまでが if の中身か」を決める文法そのものです。他の言語のような波かっこは使いません。
def price_alert(price):
if price >= 1000:
return "高額"
return "通常"def の中で if を使うと、インデントは 2 段になります。def の中身が 4 つ分、if の中身がさらに 4 つ分です。
動きを追ってみる
price_alert(1500) を呼んだときの流れは下記のとおりです。
priceに1500が入る1500 >= 1000を計算し、Trueになるifの中に入り、return "高額"で関数が終わる
price_alert(300) なら 2 の判定が False になるので、if の中身は 1 行も動かず、そのまま下の return "通常" に落ちます。
ifは通せんぼだと思うと分かりやすいです。条件がTrueのときだけ道が開き、Falseのときは中身をまるごと素通りします。
三項演算子との使い分け
第 3 章の三項演算子を使えば、同じことが 1 行でも書けます。
def price_alert(price):
return "高額" if price >= 1000 else "通常"結果はまったく同じです。では if は要らないのかというと、そうではありません。三項演算子が書けるのは 2 つの値のどちらかを選ぶ ときだけで、if のように複数行の処理を入れることはできません。
第 3 章で作った check_budget も if で書き直せます。三項演算子でひとまとめにしていた判定をほどくと、オーバーのときだけ行を足す、といった拡張がしやすくなります。
1 行で収まる値の選択なら三項演算子、処理が 2 行以上になるなら
if文。この線引きを先に決めておくと毎回迷わずに済みます。
手元で動かしてみる
kakeibo.py に下記を書いて保存し、実行してみます。
def price_alert(price):
if price >= 1000:
return "高額"
return "通常"
print(price_alert(1500))
print(price_alert(300))高額 と 通常 が 1 行ずつ出れば正解です。price_alert(1000) も足して呼んでみると、>= が「ちょうど」を含んでいることが目で確認できます。
よくある間違い
- コロンを忘れる —
if price >= 1000と書いて末尾の:を落とすとSyntaxErrorになります。ifの行は必ずコロンで終わります。 - インデントがずれる — 半角スペース 4 つが基本です。タブと混ぜたり、2 つと 4 つが混在したりすると
IndentationErrorになります。 =と==を取り違える — 条件で使うのは比較の==です。代入の=を書くとSyntaxErrorになります。
>= は「以上」、> は「より大きい」です。1000 ちょうどをどちら側に入れるかで結果が変わるので、境目の値は必ず自分の手で確かめます。
やってみよう
関数 price_alert(price) を実装してください。price が 1000 以上なら文字列 "高額" を、そうでなければ "通常" を返します。1000 ちょうどは「高額」に入れます。
if と return の組み合わせで書いてみてください。書けたら 999 と 1000 の 2 つを渡して、境目で答えが切り替わることを確かめてみてください。
要件
- 関数名は price_alert で、引数は price の 1 つ
- price が 1000 以上なら "高額" を return する
- price が 1000 未満なら "通常" を return する
- if の行は末尾にコロンを付け、中身は半角スペース 4 つ分インデントする
入出力例
price_alert(1500) → "高額"
price_alert(1000) → "高額"
price_alert(999) → "通常"
price_alert(300) → "通常"
price_alert(0) → "通常"