S-JIS[2017-12-29] 変更履歴

Pythonの型

Python3.6.4の組み込み型のメモ。


概要

Pythonでは数値文字列はオブジェクトであり、クラスのインスタンスや関数・メソッド、モジュールもオブジェクトである。

typeを使うと、そのオブジェクトがどの型なのか取得できる。
(helpを使う方が分かりやすいこともある(笑))

type(123)  	→ int
type("")   	→ str
type([1,2])	→ list
type(abs)  	→ builtin_function_or_method
type(__builtins__)	→ module

数値型

Pythonの数値は整数・浮動小数点数・複素数が扱える。

型の名称は整数→int、浮動小数点数→float、複素数→complex。
桁数はメモリーの許す限り扱える。
C言語Javaだと整数でも桁数(バイト数)に応じてintやlong、浮動小数点数でもfloatとdoubleがあったりするが、Pythonではそこは分かれていない)

数値の演算をすると、数値の型が変わる事がある。
例えば「1 / 2」(int同士の除算)は「0.5」(float)になる。

数値リテラルの例
説明
整数(int) 123 十進数
0123 十進数は0から始める事は出来ない。(Python3.0より前は八進数だったらしい?)
0b111 二進数
0o777 八進数
0xfff 十六進数
123_456
0b1111_0000
0x1234_abcd
アンダースコアで区切ることが出来る。(Python3.6)
浮動小数点数(float) 3.14
1.
.1
1e-1
 
0.000_001
1_000e-6
アンダースコアで区切ることが出来る。(Python3.6)
複素数(omplex) 1j
(1+2j)
虚数は整数や浮動小数点数の末尾に「j」あるいは「J」を付けて表す。
実数部が0以外の場合は丸括弧で囲む。

数値の演算子


ブール型(真偽値)

真偽値はTrue, Falseで表す。型の名称はbool。
(boolクラスはintクラスを継承しているらしい)

Pythonでは数値や文字列・リスト等も真偽値として扱える。
0や空を表す値がFalse、それ以外はTrue扱いとなる。
数値やリストを真偽値に変換するにはboolオブジェクトを生成する。

b1 = bool(0)	# False
b2 = bool(123)	# True

ブール演算(and, or, not)


イテレーター型

コンテナー(の役割を持つクラス)のように反復処理(イテレーターパターン?)を行うクラスのこと、だと思われる。

コンテナーのクラスに__iter__メソッドを持たせ、イテレーターオブジェクトを返すようにする。
これにより、for文やinで使えるようになる、と思われる。


シーケンス型

シーケンスは、値を並べて保持するオブジェクト。
基本的なシーケンス型はリストタプルrange
文字列(str)もシーケンスとして扱える。
バイト列を扱うシーケンスはbytes(イミュータブル(不変)), bytearray(ミュータブル(可変))。

シーケンス型は__iter__メソッドを持っているので、イテレーターとして扱える。


シーケンス型は、例えばn番目の要素を取り出すことが出来る。

seq = ["a", "b", "c"]
print(seq[1])
→ bが表示される

setdictはシーケンス型ではないので、こういった使い方は出来ない。


リスト型

リストはミュータブルなシーケンス。(JavaのList相当)
同種の値を複数保持する目的で使用する。場合によっては値を後から追加削除したり書き換えたりすることが出来る。
他の言語で言う「配列」はPythonではリストである。

リストの初期化(リストのリテラル)は値をカンマ区切りで並べて角括弧で囲む。

リストの例
  説明
要素数0 a = [] 空リスト。
要素数1 a = [1]  
要素数3 a = [1, 2, 3]  
末尾カンマ a = [1,]
a = [1, 2, 3,]
末尾の値の後ろに(余分な)カンマを付けてもよい。このカンマは無視される。
値の取得 v = a[0]  
値の代入 a[0] = 123  
要素の分解 [x, y, z] = [1, 2, 3] リストの各要素を変数とする代入。
代入先の要素数と代入元の要素数は一致している必要がある。
[_, y, _] = [1, 2, 3] 代入先にアンダースコアを指定すると、そこには値は代入されない。
[x, y, *z] = [1, 2, 3, 4]
[_, y, *_] = [1, 2, 3, 4]
変数の前に「*」を付けると、残りの値がリストで入ってくる。

リストの詳細


タプル型

タプルはイミュータブルなシーケンス。(ScalaのTuple相当)
異なる種類の値を複数保持する目的で使用する。(関数やメソッドで複数の値を返したい場合とか)
イミュータブルなので、値を後から追加削除したり書き換えたりすることは出来ない。

タプルの初期化(タプルのリテラル)は値をカンマ区切りで並べて丸括弧で囲む。
ただし、丸括弧を省略することも出来る。

タプルの例
  説明 Scala相当
要素数0 t = () 空のタプル。 var t = ()
要素数1 t = (1,) 要素数が1個のタプルは、値の後ろにカンマを付ける。
(こうしないと、式の優先順位を表す丸括弧と区別が付かない為)
var t = Tuple1(1)
要素数3 t = (1, "2", 3.0)   var t = (1, "2", 3.0)
末尾カンマ t = (1, "2", 3.0,) 末尾の値の後ろに(余分な)カンマを付けてもよい。このカンマは無視される。  
丸括弧省略 t = 1, "2", 3.0 丸括弧を省略できる。  
値の取得 v = t[0] タプルのn番目の要素の取得。 var v = t._1
要素の分解 (a, b, c) = (1, "2", 3.0)
(a, b, c) = t
タプルの各要素を変数とする代入。
代入先の要素数と代入元の要素数は一致している必要がある。
var (a, b, c) = (1, "2", 3.0)
var (a, b, c) = t
(_, b, _) = (1, "2", 3.0) 代入先にアンダースコアを指定すると、そこには値は代入されない。 var (_, b, _) = (1, "2", 3.0)
(a, b, *c) = (1, "2", 3.0, 4)
(_, b, *_) = (1, "2", 3.0, 4)
変数の前に「*」を付けると、残りの値がリストで入ってくる。
左の例では、cは「[3.0, 4]」。
 
a, b, c = (1, "2", 3.0)
a, b, c = 1, "2", 3.0
a, b, c = t
代入先も丸括弧を省略できる。  

Scalaのタプルは要素が23個までしか書けないが、Pythonには制限は無さそう。


範囲型(range)

range(レンジ)は 範囲を持つ数値を表すイミュータブルなシーケンス。(ScalaのRange相当)
for文で複数回繰り返すループの為によく使われる。

for i in range(5):
    print(i)

↓実行結果

0
1
2
3
4
rangeの例
  説明 Scala相当
range(開始値, 終了値) range(0, 10) 開始値〜終了値までの範囲を表す。
結果には終了値は含まれない。
0 until 10
Range(0, 10)
range(終了値) range(10)
 
引数が1個しか無い場合は、開始値に0を指定したのと同じ。  
range(開始値, 終了値, 増分) range(0, 10, 2) 第3引数に増分を指定できる。
増分を省略した場合は1。
0 until 10 by 2
Range(0, 10, 2)
空range range(0) 空のrange。  

集合型(set)

集合オブジェクトは、重複しない(また、並び順を保持しない)値を保持するオブジェクト。(JavaのSet相当)
具体的なクラスとしてはset(ミュータブル(可変))とfrozenset(イミュータブル(不変))がある。

setは他のsetやdictのキーとして使う事は出来ないが、frozensetは使う事が出来る。

setの初期化(setのリテラル)は値をカンマ区切りで並べて波括弧で囲む。

setの例
  説明
要素数1 s = {1}  
要素数3 s = {1, 2, 3}
s = {1, 2, 3, 2, 3, 1}
 
末尾カンマ s = {1,}
s = {1, 2, 3,}
末尾の値の後ろに(余分な)カンマを付けてもよい。このカンマは無視される。
要素数0 s = set() {}」(波括弧のみ)だと、空のdictになる。
frozenset s = frozenset({1, 2, 3}) frozensetコンストラクターの引数にsetを渡せばfrozensetになる。

set内包表記


マッピング型(dict)

マッピングオブジェクトはキー毎に値を保持するオブジェクト。(JavaのMap相当)
具体的なクラスとしてはdict(ミュータブル(可変))がある。dictという名称はたぶんdictionary(辞書)から来ている。

dictの初期化(dictのリテラル)はキーと値をコロンで区切った組をカンマ区切りで並べて波括弧で囲む。

dictの例
  説明
項目数0 m = {} 空dict。
項目数3 m = {"a": 1, "b": 2, "c": 3}  
末尾カンマ m = {"a": 1,}
m = {"a": 1, "b": 2, "c": 3,}
末尾の値の後ろに(余分な)カンマを付けてもよい。このカンマは無視される。
dictの引数名 m = dict(a = 1, b = 2, c = 3) dictコンストラクターの引数名を指定する書き方。引数名をキー(文字列)とするdictが作られる。
タプル m = dict([("a", 1), ("b", 2), ("c", 3)]) タプルでキーと値の組を表し、そのリストを指定する書き方。
zip m = dict(zip(["a", "b", "c"], [1, 2, 3])) zipコンストラクターを使うと、2つのリストから要素同士を組(タプル)にしたリストが作られる。

辞書内包表記


ヌルオブジェクト

PythonのヌルはNone。(Javaのnull相当)
Noneの型名はNoneType。

明示的に値を返すように書かれていない関数はNoneを返しているそうだ。


対話ツール(ipython等のREPL)を使っている場合、Noneを返すと何も表示されない。


ellipsisオブジェクト

...」はellipsis(エリプシス)と呼ばれる。何もしない値として使用できる。
(Python全体で唯一の値となるので、ScalaのUnitの唯一の値「()」と似ている)

これを使って以下のように書くことが出来る。

# 関数
def f():
    ...
# 変数
a = ...

よく参考プログラムでは何かを省略するときに「...」と書くことがあるが、Pythonでは正しいコードとなる(笑)


ちなみに、何もしない文としてpassという文がある。

def f():
    pass

passは、何か文を書かなければならない箇所で「何もしない」という場合に使う。


Pythonへ戻る / 技術メモへ戻る
メールの送信先:ひしだま