連鎖比較と優先順位
同じ変数を 2 回書く範囲チェック
「0 円以上、かつ予算以下」のような範囲の判定は、ここまでの道具だと同じ変数を 2 回書くことになります。長くはありませんが、数学で 0 ≦ x ≦ 10 と書くのに比べると回りくどい形です。
Python には、数学の式そのままの見た目で書ける記法があります。連鎖比較 です。
Python
people = 4
print(1 <= people <= 8)True と出ます。これは 1 <= people and people <= 8 と同じ意味に展開されるので、両方を満たしたときだけ True です。and に展開されるといっても真ん中の値は 1 回しか評価されないので、そこに関数呼び出しを置いても二重には呼ばれません。
不等号の向きはそろえてください。1 <= people >= 8 と書いても文法としては通りますが、意味の分からない条件になります。3 つ以上つなぐこともできますが、長くなるほど読みにくくなるので、2 段までにとどめるのが実用的です。
どれから計算されるか
式の中に複数の演算子が混ざったとき、計算される順番は 3 段に分かれています。まず算術の + - * /、次に比較の < や == や in、最後に not and or です。かっこがあれば、その中が何より先です。
Python
count = 12
print(count * 2 > 30 and count > 0)count * 2 の 24 が先に出て、24 > 30 は False、count > 0 は True、False and True で全体が False。落ち着いて上から段を降りれば読めます。
迷ったらかっこ
順番は覚えるに越したことはありませんが、実務では 迷ったらかっこを付ける のが正解です。かっこは実行速度をほとんど変えず、読み手の負担だけを減らします。
とくに and と or が混ざるときは要注意です。and のほうが強いので、A or B and C は A or (B and C) になります。(A or B) and C のつもりで書くと、結果が変わったまま気づけません。
「動くから正しい」と「読めるから正しい」は別の話です。3 か月後の自分が読める式を書いてください。
やってみよう
関数 in_range を実装してください。引数は price と budget の 2 つで、price が 0 以上かつ budget 以下のとき True、そうでないとき False を返します。
in_range(500, 3000) は True、in_range(3001, 3000) は False、in_range(-100, 3000) も False です。下限の 0 と上限の budget は、どちらも範囲に含めます。in_range(0, 3000) も in_range(3000, 3000) も True になるということです。
連鎖比較で書いても、and を使った形で書いても正解です。まずは連鎖比較の書き味を試してみてください。マイナスの金額を弾けるので、この形はそのまま入力チェックに使えます。
要件
- 関数名は in_range で、引数は price と budget の2つ
- price が 0 以上かつ budget 以下のとき True を返す
- 下限の 0 と上限の budget はどちらも範囲に含める
- 0 <= price <= budget の連鎖比較で書く(and を使った形でも可)