演算子の優先順位と複合代入
料金の式へ括弧を加え、商と余りを正負の値で確認します。最後に整数とリストの+=を実行し、同じ記号でも変更される対象が違うことを確かめます。
説明
演算子の優先順位は式のまとまりを決めます。整数の除算や複合代入も、記号の見た目だけで判断すると、負数や共有リストで意図と異なる結果になります。
料金の式へ括弧を加え、商と余りを正負の値で確認します。最後に整数とリストの+=を実行し、同じ記号でも変更される対象が違うことを確かめます。
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
price = 1000; shipping = 200; print(price + shipping / 2, (price + shipping) / 2, price / 2 + shipping)1100.0 600.0 700.0
print(2 ** 3 ** 2, (2 ** 3) ** 2, -3 ** 2, (-3) ** 2)512 64 -9 9
items = 23; capacity = 5; print(divmod(items, capacity)); print((items + capacity - 1) // capacity)(4, 3) 5
[(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)]
count = 3; saved = count; count += 2; print(count, saved)5 3
items = [3]; alias = items; items += [2]; print(items, alias, items is alias)[3, 2] [3, 2] True
items = [3]; alias = items; items = items + [2]; print(items, alias, items is alias)[3, 2] [3] False
演習完了