第3回 演算子

本題に入る前に必ず連絡の動画を見てください。
Google Colabへのリンク

1. 算術演算子

概要

動画の解説を参照

演算子とは、1つまたは複数の変数または値を元にして決められた処理を行うもののことです。
そのうちの算術演算子は、いわゆる算数の計算に当たる処理を行うものです。主に以下のようなものがあります。
演算子 概要 結果
+
加算
2 + 3
5
-
減算
2 - 3
-1
*
乗算
2 * 3
6
**
べき乗
2 ** 3
8
/
除算
7 / 3
2.33...
//
除算 (切り捨て)
7 // 3
2
%
剰余
7 % 3
1
算術演算子の対象は基本的には整数、浮動小数点型、複素数型の変数または値です。

ただし、「+」は例外で、文字列型の変数または値をつなげる処理になります。

文字列型と数を表す値を「+」で直接つなぐことはできません。

「str」を使うと数値を文字列に変換できます (「キャスト」といいます)。そのため以下のコードの「+」は文字列どうしの結合の演算子になります。
以下のビット演算子では、値を2進数として考えて、それぞれの桁で論理積・排他的論理和・論理和を得られます。
演算子 概要 結果
&
ビット論理積
7 & 2
2
^
ビット排他論理和
7 ^ 2
5
|
ビット論理和
7 | 2
7
~
否定
~7
-8
>>
左シフト
5 >> 1
2
<<
右シフト
5 << 1
10
1~4行目の例では \((7)_{10}=(0111)_2\), \((2)_{10}=(0010)_2\) なので、それぞれの桁でこれらの演算を行った結果として以下の値が得られます。
論理積 : どちらも1なら1 \((0010)_2=(2)_{10}\)
排他的論理和 : 異なっていたら1 \((0101)_2=(5)_{10}\)
論理和 : すくなくとも片方1なら1 \((0111)_2=(7)_{10}\)
否定 : 0, 1 を反転 \((1000)_2=(-8)_{10}\)
参考 : 昨年度のディジタル回路の「補数」

また、最後の2つの演算子では、値を2進数として考えて、右側の値の分だけ左の値を右・左にずらします。
これは、「『2の?乗』で割る(小数部分切り捨て)」、「『2の?乗』をかける」という処理にあたります。
この例では \((5)_{10}=(101)_2\) を右・左に1つずらした結果として以下の値が得られます。
右に1つずらす \((10)_2=(2)_{10}\)
左に1つずらす \((1010)_2=(10)_{10}\)

課題1

※ 準備 : 学籍番号を入れて「入力」をクリック (タップ) してください。


型 (左側) と型 (右側) の値を
で演算した結果を表示させるコードを書いてください。

2. 代入演算子

動画の解説を参照

「=」はこれまでも出てきた「左辺に右辺の値を代入する」演算子です。
また、以下の表の「=」以外の演算子も代入演算子と呼ばれ、左辺と右辺の値で演算を行った結果を左辺に代入するものです。
いずれも前項の算術演算子、ビット演算子、シフト演算子と「=」を組み合わせた形です。
演算子 概要
xの値
=
左辺に右辺の値・式を代入
x = 10
10
+=
左辺と右辺の加算結果を左辺に代入
x = 10; x += 2
12
-=
左辺から右辺の減算結果を左辺に代入
x = 10; x -= 2
8
*=
左辺と右辺の乗算結果を左辺に代入
x = 10; x *= 2
20
/=
左辺を右辺で除算した結果を左辺に代入
x = 10; x /= 4
2.5
//=
左辺を右辺で除算した結果の整数部を左辺に代入
x = 10; x //= 4
2
%=
左辺を右辺で除算した余りを左辺に代入
x = 10; x %= 3
1
**=
左辺を右辺乗した結果を左辺に代入
x = 10; x **= 3
1000
&=
左辺と右辺のビット論理積を左辺に代入
x = 10; x &= 2
2
^=
左辺と右辺のビット排他論理積を左辺に代入
x = 10; x ^= 2
8
|=
左辺と右辺のビット論理和を左辺に代入
x = 10; x |= 2
10
>>=
左辺を右辺の値だけ右シフトした結果を左辺に代入
x = 10; x >>= 2
2
<<=
左辺を右辺の値だけ左シフトした結果を左辺に代入
x = 10; x <<= 2
40

課題2

変数 a, b に上の表と異なる任意の値を代入し、
の代入演算子の動作を確認するコードを書いてください。

3. 変数とアドレス

動画の解説を参照

変数の値はメモリ上の特定の位置に保存されます。
アドレス (変数の値が書きこまれている場所) は「id」で取得できます。
以下のコードのように a, b はそれぞれ別の場所にありますが、a を代入してできた c のアドレスは a と同じになります。
つまり、a と c は同じものを指します (これを「同じオブジェクトである」といいます) なので、このような代入を参照渡しといいます。
C言語などでは、整数型などの変数を代入して新しい変数を作ると、別のアドレスになります。
このような代入を値渡しといいます。
Pythonではどの型であっても変数から変数に代入すると常に参照渡しになります。
ただし、c を作ったあとで a の値を書きかえると、a と c のアドレスは別のものになります。
これは、整数型の変数が「入れ物をそのままにして値だけ変更する」ということができず、値を変えようとするとオブジェクトとして別のものになってしまうためです。
このような性質をイミュータブル (immutable) といいます。

リストでも同様に a を代入して c を作るとオブジェクトとして同じものになります。

ただし、a の要素を書き換えてもオブジェクトとしての a と c は同じままです。
そのため、a[0] の要素を書き換えると c[0] もそれにあわせて変化します。
このような性質をミュータブル (mutable) といいます。
リストの要素ではなく、全体に新しい値を代入すると別なオブジェクトに変化し、a と c は別のものを指すようになります。

課題3

自分の氏名を1文字ずつ格納したリスト name 、学籍番号を整数として格納した変数 id を作り、それぞれを name_, id_ に代入して4つの変数の値を表示させたあと、name[0] と id の値を別なものに書き換えてもう一度4つの変数の値を表示させるコードを書いてください。

提出

今回作成したノートブックを「plang2024a@gmail.com」と共有してください。
※ 課題の再提出の際は、ノートブックの再度の共有はせずにチャットで連絡してください。