≪いっしょにPython≫ プログラマーの実験ノート

 このページは,プログラム言語Pythonをこれから学ぼうと考えている筆者の備忘録です.
 そこそこ調べて書いていますが,仕様を精密に調べたものではありません.どちらかと言えば,実装されたPython 3を使ってみてどうなったかということを中心に書いたものです.いわば,実験ノートの記録です.

1. Pythonの数値

 次の表は,Pythonにおいて整数型(int)または浮動小数点型(float)の数値を入力したときの,入力例とその結果および備考です.
入力例結果備考
33単に0〜9の数値を入力すれば10進数と解釈される
-3.1-3.1同上(小数の場合,負の数の場合も同様)
0b102先頭に,接頭語(プレフィックス,Prefix)の0b(オービーではない,零ビー)または0Bを付けると2進数と解釈される.統合開発学習環境(IDLE)の元で>>>に続いて0b10と入力すると,エコー出力は10進数の2となる
0B21エラー0Bに続く数は2進数でなければならないから,2を書くとエラーになる.
0B0.1エラー2進数の小数は受け付けない.
-0b10−2符号は,接頭語(プレフィックス,Prefix)の0bの前に書く
0o1715先頭に,接頭語(プレフィックス,Prefix)の0o(零零ではない,零オー)または0Oを付けると8進数と解釈される.統合開発学習環境(IDLE)の元で>>>に続いて0o17と入力すると,エコー出力は10進数の15になる(1×8+7=15だから)
0o8エラー0oに続く数は8進数(0〜7までの数字)でなければならないから,8を書くとエラーになる.
0o0.1エラー8進数の小数は受け付けない.
0xab171先頭に,接頭語(プレフィックス,Prefix)の0x(零零ではない,零オー)または0Xを付けると16進数と解釈される.統合開発学習環境(IDLE)の元で>>>に続いて0xab, 0xAb, 0xAb, 0XaBなどと入力すると(x,a,bは大文字小文字の区別はない→0〜9,a〜z,A〜Zで62進数とはしない),エコー出力は10進数の171になる(10×16+11=171だから)
0x1gエラー0xに続く数は16進数でなければならないから,0〜9,a〜fよりも大きな数字を書くとエラーになる.
0x0.1gエラー16進数の小数は受け付けない.
032エラー先頭が0の場合,小数点がないとエラーになる(3進法とは解釈されない)
00.30.30.3の許容範囲の書き方と見なされる
.30.3先頭がドット(ピリオド)の場合は,0.の省略と解釈される(-.3→-0.3も同様)
【要約】
•小数が使えるのは10進数だけ.
•0.の0は省略できる.
•プレフィックスの0b, 0o, 0x以外に整数値を0から書き始めることはできない.

2. Pythonの(単項)算術演算子

aが整数型(int)または浮動小数点型(float)のとき,次の表は,左欄に示される算術演算子を使ったときの,単項演算の入力例とその結果の一覧です.
演算子意味入力例結果備考
+符号を変えない+33後に続く数の符号を変えない
+符号を変えないa+エラー後に続く数がないとエラーになる
符号を変える−3−3後に続く数の符号を変る
符号を変える3エラー後に続く数がないとエラーになる
 これらの結果は,「当然のことを述べているだけで,特に印象に残らない」ように見えますが,C言語やjavascriptで使われるインクリメント演算子(++),デクリメント演算子(−−)がPythonにはないということと関係があるようです.
 すなわち,インクリメント演算子(++),デクリメント演算子(−−)が定義されている言語では,
a++a +=1すなわちa = a+1a−−a −=1すなわちa = a−1を表し,インクリメント,デクリメントしてから処理する場合は,各々++a, −−aと書くようになっていますが,
(1) これらのインクリメント演算子(++),デクリメント演算子(−−)はPythonにはないというのは事実です.
(2) Pythonでa++, a−−と書けばエラーになります.
(3) Pythonで++aと書けば,エラーにならずaの値は変化しません.
 もっと,詳しく調べると,a = 3のとき,次のようになります.
演算+a++a+++a++++a
3333
演算−a−−a−−−a−−−−a
−33−33
演算−a−+a+−a−+−+a
−3−3−33
【要約】
•インクリメント演算子(++),デクリメント演算子(−−)はPythonにはない.(変数の後に付けるa++のような記号は使えない)
•数値の前に付ける符号としての単項演算子としては,+は「後にする続く数値の符号を変えない」,−は「後に続く数値の符号を変える」という約束に忠実に従っているだけである.(変数の前に付ける++aのような記号は,インクリメント演算子ではなく,単に符号演算子の重ね書きになる)
 例えば,−+−aは,(−(+(−a)))に等しい.

2項演算子(符号,符号,…)

 実際には,次のような演算にもエラーなく結果が出る.
演算5++35+++35−−35−+35+−35−+−3
結果888228
筆者の解釈5+(+3)5+(+(+3))5−(−3)5−(+3)5+(−3)5−(+(−3))
 筆者の解釈としては,2項の間に+,−の演算子が複数個ある場合は,上記の表のように左端のみ2項演算子,他は第2項の符号演算子と考えれば,計算結果と一致する.(同様にして 5*+3→15,  5*−3→−15,  5+*3→エラー,  5+/3→エラー⇒先頭以外は符号の+,−でなければならない.)

3. Pythonの(2項)算術演算子

 a, bが整数型(int)または浮動小数点型(float)のとき,次の表は,左欄に示される算術演算子を使ったときの,2項演算の入力例とその結果の一覧です.
演算子意味入力例結果備考
+足し算2 + 35
+足し算0b10 + 0o792進数や8進数で入力したときも,結果は10進数で表示される
引き算2 − 5−3
*掛け算2 * 36
**累乗2 ** 3823=8を表す
**累乗2 * * 3エラー**という演算子の間に空白を入れてはいけない
**累乗0**01数学的には00は定義されないが,Pythonでは1として処理する(Excelでは,=0^0は#NUM!←「数値でない」として処理される)
**累乗2 ** (1/2)1.4142135623730951を近似値で表す
/小数の
割り算
2/30.6666666666666666割り算の商を浮動小数点数で表す,余りは出さない(16ビット機で行うと16桁までの近似値になる)
//整数の
割り算
14//34割り算の商を整数まで求める(商の小数を切り捨てたもの)…(*1)
%割り算の余り14%32a÷b=q…r ←→a=bq+r
においてqは商,rは余り…(*2)
※他のプログラミング言語と同様に,0で割る計算を行うとエラーになる.したがって,a/0, a//0, a%0 のような計算はできない.

整数割り算の補足…上記の(*1)(*2)

 整数割り算(//)と割り算の余り(%)は,正の整数の割り算にだけ定義されているわけではない.被除数,除数が「負の数」「小数」の場合にも定義されている.その場合,商や余りをどのように定義するかは,各々の処理系での約束事であり,真偽の問題ではない.
 a, bが整数型(int)または浮動小数点型(float)のとき,次の表は,各々の処理系で示される整数割り算と割り算の余りです.
a÷b=q… r←→a=bq+rで,qを整数値とする場合
•PythonとExcelでは,小数a/bを超えない最大の整数をa//b→qとする.
 aが負のとき,bqrは逆向きになる.
 その結果,余り(r)の符号は除数(b)の符号と一致する.
•Javascriptでは,bqrはつねに同じ向きになる.
 その結果,余り(r)の符号は被除数(a)の符号と一致する.
abPython
// %
Javascript
(q) ← %
Excel
(q) ← mod(a, b)
備考
1434  2(4) ← 2(4) ← 24≦14/3=4.66...<5
14−4×3=2
−143−5  1(−4) ← −2(−5) ← 1−5≦−14/3=−4.66...<−4
−14−(−5)×3=1
−14−(−4)×3=−2
14−3−5  −1(−4) ← 2(−5) ← −1−5≦14/(−3)=−4.66...<−4
14−(−5)×(−3)=−1
14−(−4)×(−3)=2
−14−34  −2(4) ← −2(4) ← −24≦−14/(−3)=4.66...<5
−14−4×(−3)=−2

 被除数または除数の少なくとも一方が小数のとき,a//b4.0のような小数の形で書かれるが,実際には整数値になる.また,Pythonでは 14.1%3.1→1.699999...などと表示されるが,これは1.7のことである.
abPython
// %
Javascript
(q) ← %
Excel
(q) ← mod(a, b)
備考
14.13.14.0 1.7(4) ← 1.7(4) ← 1.74≦14.1/3.1=4.54...<5
14.1−4×3.1=1.7
−14.13.1−5.0 1.4(−4) ← −1.7(−5) ← 1.4−5≦−14.1/3.1=−4.54...<−4
−14.1−(−5)×3.1=1.4
−14.1−(−4)×3.1=−1.7
14.1−3.1−5.0  −1.4(−4) ← 1.7(−5) ← −1.4−5≦14.1/(−3.1)=−4.54...<−4
14.1−(−5)×(−3.1)=−1.4
14.1−(−4)×(−3.1)=1.7
−14.1−3.14.0  −1.7(4) ← −1.7(4) ← −1.74≦−14.1/(−3.1)=4.54...<5
−14.1−4×(−3.1)=−1.7

(参考)
Pythonでは,整数割り算の商と余りは,関数 divmod(a,b) により同時に[タプルとして]得られる.
【例】 divmod(-14.1,3.1) → (-5.0, 1.4000000000000008)

4. Pythonの複合代入演算子

• 他のプログラミング言語と同様にPythonにおいても,数値の場合にa+1の値を新たにaの値とするというような演算を複合代入演算子によって表すことができます.
• C言語やJavascriptで用いるインクリメント,デクリメント演算子は,Pythonではこの複合代入演算子を使って,a+=1, a−=1などと表すことができます.
• なお,読みやすく,間違いにくくするために,a += 1のように,変数や定数と演算子の間にスペースを入れることはできますが,a + = 1のように「複合代入演算子の間にスペースを入れるとエラーになります」.
演算子意味結果
+=a+=ba=a+ba=1
a+=1 → aの値は2
−=a−=ba=a−ba=10.1
a−=1 → aの値は9.1
*=a*=ba=a*ba=2
a*=3 → aの値は6
/=a/=ba=a/ba=3
a/=2 → aの値は1.5
//=a//=ba=a//ba=14
a//=3 → aの値は4
%=a%=ba=a%ba=14
a%=3 → aの値は2
//=a//=ba=a//ba=14
a//=3 → aの値は4
**=a**=ba=a**ba=3
a**=2 → aの値は9

5. 演算子の優先順位

 他のプログラミング言語と同様に,Pythonでも演算子の優先順位が正確に定められています.ただ,生部側から言えば,詳細に定められているものを「全部覚えて使いこなす」のは,とても大変です.特に,日頃あまり使わないビット演算の順位などには興味を持ちにくいということもあるでしょう.
 このページでは,よく使うものの優先順位だけ覚えて,自信の持てないものは括弧( )で囲むという方法をお勧めしたい.
【優先順位の高い方から】
(1) 括弧( )で囲まれた式は先に計算する … (...)
(2) 累乗(べき乗,指数) … を表す2**3など
(3) 符号演算子 … +, −
(4) 掛け算,割り算,整数割り算,剰余 … *, /, //, %
(5) 足し算,引き算 … +, −
(*) 同じ優先順位に属するもの(例えば,*と/ )は,左から先に行う.
 余り欲張らずに,上記の表の程度を使いこなすようにします.(詳細なものはこちらの下端)
(1)は最も重要ですので覚えます.(2)(4)(5)の順位は,中学校から数学で習う順位と同じです.
(3)も覚えられたら覚えます.
【例】
演算結果備考
2 + 3 * 4143*4→12を先に計算するから2+12→14になる
4*2**3322**3→8を先に計算するから4*8→32になる
10−5−23−と−は同順位だから左の−を先に行う.5−2 →3になる
10−(5−2)7( )の中を先に行うから
10−3 →7になる
24/4/23/と/は同順位だから左の/を先に行う.6/2 →3になる
24/(4/2)12( )の中を先に行うから
24/2 →12になる
(3) 符号演算子と(2)べき乗,(4)掛け算,割り算の優先順位は分かりにくいので,次のような計算は最も強い(1) ( )を使って優先順位を明示的に書く方がよいと考えられる.
演算結果備考
2**−1/20.25「べき乗→符号→割り算」の順と考えられるが,「符号→べき乗→割り算」の順の結果が得られる:(2**(−1))/2→0.25
−2**1/2−1.0「べき乗→符号→割り算」の順:(−(2**1))/2→−1.0
2**1/−2−1.0「べき乗→符号→割り算」の順:(2**1)/(−2)→−1.0
(−1)**(1/2)(6.12..e-17 +1j)( )の中を先に行うから
になる
6.12..e-17はほぼ0,Python上では虚数単位はj
○== メニューに戻る ==