2010/10/27

Pythonの基本 数の基本

「Python基本 まとめ」に戻る


Release:1.0
Date:October 27, 2010
自分用に書いたPythonの数についてのまとめです。
間違いや勘違いが多分に含まれている可能性があるので、参考にされる方は
公式のドキュメントなどで確認をお願いします。

注) 印はまだ自身のないところです。

テスト環境

テスト環境
OS: Ubuntu10.10
Python 2.5.2
Python 2.6.6
Python 3.1.2

– はじめに

Pythonには、整数などに対する型を宣言する必要はありません。
たとえば、cで整数を扱おうとすると、
#include <stdio.h>
int n;
int main(void)
{
  n = 4 + 6;
  printf("「4 + 6」の計算結果を表示します\n");
  printf("4 + 6 = %d\n", n);
  return 0;
}
などと変数 nint (整数)で型を指定する必要がありますが、
Python2.6以上の場合は(3系の場合は u を省いてください)、単純に
>>> n = 4 + 6
>>> print(u"「4 + 6」の計算結果を表示します\n  4 + 6 = {0}".format(n))
「4 + 6」の計算結果を表示します
  4 + 6 = 10

とするだけですみます。

動的な型付けは便利なぶん、欠点もありますので、「Pythonとはこのようなものだ」
とわりきって覚えてください。

print文は分けて書いたら \n を書かなくても改行されます。

keisan.py の場合はなら、(3系の場合は u を省いてください)

#-*- coding:utf-8 -*-
n = 4 + 6
print(u"「4 + 6」の計算結果を表示します")
print(u"  4 + 6 = {0}".format(n))

実行をしてみると、

$ python test.py
「4 + 6」の計算結果を表示します
  4 + 6 = 10

というふうになります。

Python2.5では下のように書きます。

#-*- coding:utf-8 -*-
n = 4 + 6
print(u"「4 + 6」の計算結果を表示します")
print(u"  4 + 6 = %d " % n)

という具合です。

おさらいになりますが、 n という変数には数(int, float, long, complex)でも文字列でも
なんでも入れておけるということを覚えてくださいね。

他の言語も学習する人は、同じ変数には違う型をなるべく入れない方がいいかもしれません(※)

ここで出てきた format%d については次の「Pythonの基本 まとめ 文字列」で取り上げたいとおもいます。

– Pythonで扱える数とは

まずはどんな数を使えるのか、さらっとみてみましょう。

















ブール型と複素数型が少し複雑そうですね。
複素数型は私がわからないので、勉強してから追記します。

ブール型については、 —- 論理演算についてもう少し で少し詳しく説明します。

– 演算子

演算子についての詳細は http://docs.python.org/reference/expressions.html#summary を参考に
してください。

まずは、何ができるのかざっと例を上げていきます。

>>> 1 + 1
2
>>> (8 * (12 - 3)) / 2
36
>>> 89 % 3
2
>>> 2 ** 16
6553
>>> True and False
False
>>> True or Flase
True
>>> not True
False
>>> 18 < 89
True
>>> 8 <= 8
True
>>> 1 == True
True
>>> 1 != True
False
>>> 1 is True
False
>>> 1 is not True
True
>>> x = 12
>>> x < 5
False
>>> x < 5 or x > 10
True
>>> x < 5 and x > 10
False
>>> x > 10 and x < 20
True
>>> 10 < x < 20
True
>>> x < 5 or (x > 10 and x < 20)
True
>>> 28 % 9
1
>>> 8 | 2
10
>>> 4 ^ 9
13
>>> 2 << 8
512
>>> ~ 26
-27

四則演算

例を見ていただければ解ると思いますが、数学の四則演算の法則と変わりありません。
一つだけ特殊なものは、 % でしょうか。

% とはあまりを求める演算子、つまり余剰を求めます。

>>> 8 % 3
2

これは、8 ÷ 3 = 2 … 2 の余りの2を出す演算子です。

優先順位

四則演算での優先順位は数学と全く同じです。優先したいものがあれば、丸括弧 ( ) を使います。

>>> 2 * (4 + 2) / 4
3
この例ならば、まずは先に 4 + 2 = 6 を出し、次に、2 × 6 = 12 を出し、最後に
12 ÷ 4 = 3 を出すといった具合です。

いい忘れましたが、 / は ÷ ですので、覚えておいてくださいね。

— 整数型と浮動小数点型の自動型変換

Pythonの型付けは動的だといいましたが、float型とint型を計算する場合はfloat型に
変換されます。 float型の方が優先順位が高い ということになります。
>>> 1 + 0.5
1.5

Pythonでの除算(割り算)

加算(足し算)のときは、int型よりfloat型の方が優先順位が高いといいましたが、除算
(割り算)の商(割り算の答え)の場合はPythonのバージョンによってどちらが優先にな
るのかが変わります。
—- Python2系の場合
Python2系の場合、int型どうしの除算で割り切れない場合の商はint型をまもろうとするので、
float型へは自動で変換されません。float型の方が優先順位が高いといいましたが、この場合
はint型をまもろうとすることが、プログラムとしては当然なのかもしれません。
商が浮動小数点、すなわちfloat型になる場合は、
Python2系の場合、これをint型をまもって小数点以下を切り捨てます。
>>> 3 / 2     # 商は1.5になるはずだが、小数点以下が切り捨てられる
1
>>> 7 / 4     # 商は1.75になるはずだが、小数点以下が切り捨てられる
1
>>> 7 / 8     # 商は0.875になるはずだが、小数点以下が切り捨てられる
0

回避するためにはどちらか、または両方をfloat型にして書く必要があります。

>>> 3.0 / 2
1.5
>>> 7.0 / 4.0
1.75
>>> 7 / 8.0
0.875
—- Python3系の場合
Python3系では、「 / 」演算子は必ず浮動小数点を返すようになりました。
2系のようにint型をまもった(切り捨て算)割り算は「 // 」演算子を使うようにします。
>>> 3 / 2
1.5
>>> 3 // 2
1

ちなみに

2系でも「 // 」演算子は使えるので、将来に3系への移行を考えて、除算はすべて「 // 」
演算子にしておくのもいいかもしれません(※)。

— int型とlong型の自動変換

Python2系の場合は、
CPUが32bitのPCではint型は 0b1111111111111111111111111111111
int((1 << 31) - 1) [ int((2 ** 31) - 1) ] すなわち2147483647までの数字を扱えます。
2147483647を超えると自動的に、long型となり末尾に L が付きます。
long型はメモリの許す限りの数を実質無限に扱えます。
>>> 2147483647       # ここまではint型
2147483647
>>> 2147483647 + 1   # ここからがlong型
2147483648L

Python3系ではlong型は廃止となり、long型がint型となりました。
ですので、末尾に L が付くことはありません。

>>> 2147483647
2147483647
>>> 2147483647 + 1    # 末尾に L が付かない
2147483648

—- 論理演算についてもう少し

Pythonの中の変数は全て、論理値として使う事ができます。
[]、0、""、None のような”空”の値は、偽を意味し、その他の値の時([0]、1、”Hello, world” など)は、真を意味します。

>>> w, x, y, z = [], 0, '', None
>>> w == x == y == z
False
>>> w == False
False
>>> x == False
True
False
>>> y == False
False
>>> z == False
False

偽や真とは、上記のように TrueFalse をそのまま表すものではありません。
ただし、数値の0と1はそのまま TrueFalse と同義になります。

例えば、Python2.6以上は、(3系の場合は u を省いてください)

>>> for i in ([], 0, '', None):
...     if i:
...         print(u"{0!r:4} = 真".format(i))
...     elif not i:
...         print(u"{0!r:4} = 偽".format(i))
...
[]   = 偽
0    = 偽
''   = 偽
None = 偽

Python2.5では

>>> for i in ([], 0, '', None):
...     if i:
...         print(u"%s = 真" % repr(i).ljust(4))
...     elif not i:
...         print(u"%s = 偽" % repr(i).ljust(4))
...
[]   = 偽
0    = 偽
''   = 偽
None = 偽

このような感じとなります。

# 変数 i が真の場合はという意味
if i:
    何かのコード
# 変数 i が偽の場合はという意味
if not i:
    何かのコード

これを覚えておくと便利です。

真の値も試してみましょう。

>>> a, b, c, d = [1], 1, 'hoge', True
>>> a == True
False
>>> a == False
False
>>> b == True
True
>>> b
1
>>> b == False
False
>>> c == True
False
>>> d == True
True
>>> d is True
True

先で説明したように, 1 == True で同義でしたね。

>>> for i in ([1], 1, 'hoge', True):
...     if i:
...         print(u"{0!r:4} = 真".format(i))
...     elif not i:
...         print(u"{0!r:4} = 偽".format(i))
...
[1]  = 真
1    = 真
''   = 真
True = 真

Python2.5では

>>> for i in ([1], 1, 'hoge', True):
...     if i:
...         print(u"%s = 真" % repr(i).ljust(4))
...     elif not i:
...         print(u"%s = 偽" % repr(i).ljust(4))
...
[1]  = 真
1    = 真
''   = 真
True = 真

以上で数の基本は終了です。抜けているものは気づいたときに付け足していきます。

比較の説明などはまた機会があったら記事を書きたいと思います

「Python基本 まとめ」に戻る

0 件のコメント:

コメントを投稿