前回までの「Python初体験」は取り敢えずPythonを使ってみる、ということだったようで、これからソースコードの記述を行うプログラミングに進んでゆくようです。
このサイトではPythonの扱う数と演算子を説明しますが、他の言語と異なっているところはハイライトにします。(同じく私が間違った所は太字ハイライトします。)
(1)特徴的な演算子
べき乗に'**'を使うところでしょうか?BASICでもC系言語でもべき乗は'^'を使うことが多いのでこれはちょっと違いますね。なお、「余り」はC系言語と同じく'%'(モジュロ)演算子です。(ご参考:BASICは'MOD')
(2)変数型の強制変換
C系言語では、変数の型宣言に厳しくいですが、異なる型の演算はキャスト(強制型変換)が無ければくてもコンパイルエラーになりますませんが、これもPythonではも自動的に型変換してくれるようです。(注)
注:Windowsプログラミングで型違いエラーを多く経験したので間違えました。整数、単精度実数、倍精度実数の代入や算術演算の場合は黙示の強制変換が行われます。(参考)
<C言語の例>
int a;
float b, c;
c = b + (float)a; //明示的型変換、しかしキャストを外してもエラーは起きない。
c = b + a; //こうしても黙示的に型変換が行われる
a = b + c; //こうしても黙示的に型変換が行われる
//解説:スミマセン。いつの間にか忘れていました。しかし、明示的型変換で対応していないと、しつこいバグに悩まされる可能性があります。
<BASIC言語の例>
Dim a as Integer
Dim b as Single, c as Single
c = b + a(注)
注:整数、単精度、倍精度浮動小数点変数の混合計算の演算結果は、自動的により変数のバイト数(整数 < 単精度 < 倍精度浮動)が多い型に変換される。
<Pythonの例-上段の実行結果が下段>
10(整数)+ 0.1(浮動小数点実数)
10.1(演算結果は浮動小数点実数)
また、Pythonでは除算は整数で割り切れても浮動小数点実数になるようです。
6 / 2(整数と整数)
3.0(実数)
(3)整数除算
整数の除算では解は整数になることから、剰余は切り捨てられます(例:"3 / 2"の演算結果は1になる。)が、Pythonでは演算結果は自動強制型変換により1.5(浮動小数点実数)になってしまいます。
Pythonでは、整数演算をしたい場合には整数除算演算子である'//'を使います。これは浮動小数点実数に対しても有効です。
<例>
3 / 2
1.5
3.0 // 2.0(値は浮動小数点実数ですが、整数除算演算子があると強制的に整数に変換されるようです。)
1("3.0 / 2.0"の場合は1.5となる。)
(4)論理演算子
論理演算子として次の3つがあるそうです。
and 演算子
or 演算子
not 演算子
C系の言語だと&&、||、!で、BASIC/Visual BasicだとAND/And、OR/Or、NOT/Notなので、似ていますね。
(5)ビット演算子
& →論理積
| →論理和
^ →排他的論理和
~ →反転
<<, >> →シフト
C系の言語と同じですね。
(6)比較演算子
x == y x と y が等しい #C++等と同じですね。
X != y x と y が等しくない #C++等と同じですね。
x > y x は y よりも大きい
x < y x は y よりも小さい
x >= y x は y と等しいか大きい
x <= y x は y と等しいか小さい
x in y x という要素 が y に存在する #Python独特
x not in y x という要素 が y に存在しない #Python独特
なお、予約語'False'('false'だとエラーになる)は0と等価です。(因みにprint(True == 1)も試しましたが、Trueでした。)
print(False == 0.0)
この他"is"という演算子があり、これは値ではなく、オブジェクトが同一か否かを調べるとのことです。実際にColabでやってみると、
a = 100
b = 150
c = 100
print("a == b ->", a == b)
print("a == c ->", a == c)
print("a's ID->", id(a), "b's ID->", id(b))
print("a is b ->", a is b)
print("a's ID->", id(a), "c's ID->", id(c))
print("a is c ->", a is c)
c = b #値もIDも違う
print("a’s ID->", id(a), "c's ID->", id(c))
print("a is c ->", a is c)
結果は、次のようになります。
a == b -> False
a == c -> True
a's ID-> 137388688837968 b's ID-> 137388688839568
a is b -> False
a's ID-> 137388688837968 c's ID-> 137388688837968
a is c -> True
a's ID-> 137388688837968 c's ID-> 137388688839568
a is c -> False #値もIDも違う
変数オブジェクトのaとcは違うのですが、値100のメモリー位置が同じなのでしょうか?"a is c"はTrueになります。
"c = b"の所を変えて、"c = b * 2 / 3"(値は同じ)にすると、結果は、
a == b -> False
a == c -> True
a's ID-> 137388688837968 b's ID-> 137388688839568
a is b -> False
a's ID-> 137388688837968 c's ID-> 137388688837968
a is c -> True
a's ID-> 137388688837968 c's ID-> 137387420507568
a is c -> False #値は同じだが、IDは違う
になりました。これは値のオブジェクトが変わったからでしょう。(注)
注:Webにこの問題に関連するPython文書の引用がありましたのでご参考まで。
「注意点: イミュータブルな型の同一性比較
整数intや文字列strなどのイミュータブル(変更不可)な型のオブジェクトに対するisやis notでの比較は注意が必要。
新たにオブジェクトを生成したときに、既存のオブジェクトへの参照が返される場合とそうでない場合がある。
例えばintの場合、-5から256の範囲の値を生成すると既存のオブジェクトへの参照が返されるが、その範囲外の値は別のオブジェクトとして生成される。
The current implementation keeps an array of integer objects for all integers between -5 and 256. When you create an int in that range you actually just get back a reference to the existing object.
整数型オブジェクト (integer object) ? Python 3.11.3 ドキュメント
a = 256
b = 256
print(a is b)
# True
a = 257
b = 257
print(a is b)
# False」
なかなか違う言語の学習は面白いですね。