一覧PG-03-1 · 演算子と評価順

演算子の優先順位と複合代入

料金の式へ括弧を加え、商と余りを正負の値で確認します。最後に整数とリストの+=を実行し、同じ記号でも変更される対象が違うことを確かめます。

説明

演算子の優先順位は式のまとまりを決めます。整数の除算や複合代入も、記号の見た目だけで判断すると、負数や共有リストで意図と異なる結果になります。

料金の式へ括弧を加え、商と余りを正負の値で確認します。最後に整数とリストの+=を実行し、同じ記号でも変更される対象が違うことを確かめます。

1送料も割引した式としない式

商品1000円、送料200円を考えます。半額にする範囲を括弧で変えます。

price = 1000; shipping = 200価格と送料; print(price + shipping / 2除算が先, (price + shipping) / 2合計を括弧でまとめる, price / 2 + shipping商品価格だけ半額)

それぞれ1100、600、700です。送料だけ半額、合計全体を半額、商品だけ半額という異なる式です。Pythonの/は整数同士でもfloatの結果を返します。

2累乗と符号のまとまり

累乗は右側からまとまり、左側の単項マイナスより強く結び付きます。括弧のある式と比較します。

print(2 ** 3 ** 2右から累乗, (2 ** 3) ** 2左を先に累乗, -3 ** 2, (-3) ** 2符号と括弧)

2の9乗は512、8の2乗は64です。-3 ** 2は-(3 ** 2)なので-9、(-3) ** 2は9になります。読み手が迷う式では、意図するまとまりを括弧で明示します。

3箱数と余り

23個を5個入りの箱へ詰めます。満杯の箱数、余り、端数を含む必要箱数を求めます。

items = 23; capacity = 5個数と箱の容量; print(divmod(items, capacity)商と余り); print((items + capacity - 1) // capacity端数を含む箱数)

商4・余り3で、必要な箱数は5です。divmodは//と%の結果を組で返します。後半の切上げ式は、個数が0以上、容量が正の整数という条件で使っています。

4負数を含めた商と余り

//は負の無限大方向へ丸めます。正負の組合せで、商と余りから元の値を戻せるか確認します。

[(a, b, a // b, a % b床へ丸めた商と余り, b * (a // b) + a % b元の値を復元) for a, b in [(7, 3), (-7, 3), (7, -3), (-7, -3)]符号の四通り]

-7 // 3は-3で、余り2を足すと-7に戻ります。7 // -3は-3、余り-2です。余りは0か除数と同じ符号になり、a = b×商+余りが成立します。

5整数の+=と別名

残数の整数を別名へ保持してから、+=で増やします。

count = 3; saved = count同じ整数を参照; count += 2整数の加算と再代入; print(count, saved)別名への影響

countは5、savedは3です。整数そのものを変更したのではなく、countを計算後の整数へ結び直しています。

6リストの+=と別名

内容を変更できるリストで同じ形を試します。

items = [3]; alias = items同じリストを共有; items += [2]元のリストを拡張; print(items, alias, items is alias)値と同一性を確認

両方[3, 2]で、同じリストを参照しています。リストの+=は内容をその場で拡張するため、別名からも変更が見えます。整数のときと変更範囲が違います。

7通常の+では新しいリストになる

同じ初期状態へ戻し、通常の+で作った結果をitemsへ代入します。

items = [3]; alias = items同じ初期状態; items = items + [2]新しいリストを作って再代入; print(items, alias, items is alias)変更範囲を比較

itemsは新しい[3, 2]、aliasは元の[3]です。複合代入を単なる省略形とみなすと、この共有への影響を見落とす場合があります。

まとめ

括弧と演算規則から式のまとまりを確認します。

負数の商・余り、可変オブジェクトの複合代入は具体的な値で確認します。

操作履歴と解説を振り返れます。

Python 3

1
price = 1000; shipping = 200; print(price + shipping / 2, (price + shipping) / 2, price / 2 + shipping)
1100.0 600.0 700.0
2
print(2 ** 3 ** 2, (2 ** 3) ** 2, -3 ** 2, (-3) ** 2)
512 64 -9 9
3
items = 23; capacity = 5; print(divmod(items, capacity)); print((items + capacity - 1) // capacity)
(4, 3)
5
4
[(a, b, a // b, a % b, b * (a // b) + a % b) for a, b in [(7, 3), (-7, 3), (7, -3), (-7, -3)]]
[(7, 3, 2, 1, 7), (-7, 3, -3, 2, -7), (7, -3, -3, -2, 7), (-7, -3, 2, -1, -7)]
5
count = 3; saved = count; count += 2; print(count, saved)
5 3
6
items = [3]; alias = items; items += [2]; print(items, alias, items is alias)
[3, 2] [3, 2] True
7
items = [3]; alias = items; items = items + [2]; print(items, alias, items is alias)
[3, 2] [3] False

演習完了