Python 3の組み込み関数を速攻理解しよう: オブジェクト生成/数値計算/文字列/イテラブル編:特集:タイニーレファレンス(1/2 ページ)
Python 3が提供する組み込み関数のうち、オブジェクトを生成するもの/簡単な計算を行うもの/文字列に関連するもの/イテラブルに関連するものを紹介する。
Python 3には多くの組み込み関数が用意されている。今回と次回に分けて、これらの組み込み関数を幾つかのジャンルに分類して、その構文と簡単な利用法を紹介していく。
ジャンル
Python 3の組み込み関数はおおよそ次のようなジャンルに分類できる。
- オブジェクト生成に関連するもの
- 絶対値/商と剰余/累乗/丸めを計算するもの
- 文字/文字列操作に関連するもの
- イテラブル(反復可能)オブジェクトに関連するもの
- 関数/クラス/オブジェクトに関連するもの
- スコープ/モジュールに関連するもの
- Pythonコードの動的評価に関連するもの
- コンソール/ファイルに関連するもの
- その他
今回は上記の分類のうち、最初の4つのジャンルについて見ていくことにする。
●オブジェクト生成に関連するもの
オブジェクトを生成する目的で使用される組み込み関数としては以下の表に挙げるものがある(本稿では、数値と文字列を変換する関数は文字/文字列操作に分類してある)。
関数 | 説明 |
---|---|
bool | 指定した引数の値に応じてbool型の値、TrueかFalseを返送する |
bytearray | ミュータブル(変更可能)なbyte配列を返送する |
bytes | イミュータブル(変更不可能)なbyte配列を返送する |
complex | 「x+yj」形式の複素数を返送する |
dict | 指定した引数を基に辞書を作成する |
float | 指定した引数から浮動小数点数を生成する |
frozenset | 指定したイテラブル(反復可能オブジェクト)を基にイミュータブルな集合を生成する |
int | 指定した引数に応じた整数を返送する |
list | 指定した引数を基にリストを生成する |
memoryview | 指定した引数を基にメモリビューオブジェクトを生成する |
object | 無引数で呼び出し、特筆すべき属性を持たないオブジェクトを生成する |
set | 指定した引数を基に集合を生成する |
str | 指定した引数を文字列化したものを返送する |
tuple | 指定した引数を基にタプルを生成する |
オブジェクトを生成/返送する組み込み関数 |
これらの組み込み関数は、Pythonの組み込み型のオブジェクトを生成するために使われる(つまり、対応する組み込み型のコンストラクタとなっている)。以下でこれらの関数の構文を示す。なお、以下では省略可能な引数については「[]」で囲んで示す。
bool
組み込み関数boolの構文を示す。
bool([x])
組み込み関数boolは指定した引数xの値が真と評価される場合はTrueを、偽と評価される場合はFalseを返送する。例えば、引数に空のリスト、空文字列などを渡すとその戻り値はFalseとなる。また、引数を指定しなかった場合はFalseが返送される。
bytearray/bytes
組み込み関数bytearray/bytesの構文を以下に示す。これらの構文の引数の意味は同じで、前者はミュータブル(変更可能)なbyte配列を、後者はイミュータブル(変更不可能)なbyte配列を生成するものだ。ここでいう「byte配列」とは各要素が0〜255の範囲の整数値を取る配列のことで、バイナリデータを扱うような場合に使用する。
bytearray([source[, encoding[, errors]]])
bytes([source[, encoding[, errors]]])
引数を指定しない場合には空のbyte配列が返送される。引数sourceには文字列/整数/イテラブルなどを指定できるが、その型と値に応じたbyte配列が返される(詳細はPythonのドキュメント「Python 標準ライブラリ」の「bytearray」の説明を参照のこと)。
引数sourceに文字列を渡した場合には、そのエンコード方式を引数encodingに渡す必要がある。さらにオプションで、エンコード時のエラー処理方法を引数errorsに渡してもよい(引数errorsに渡せる値についてはPythonのドキュメント「str.encode」を参照)。この場合は、引数sourceに渡した文字列が、str.encodeメソッドを使用して、引数encoding(および引数errors)に渡した方法でエンコードしたものが結果のbyte配列となる。
以下に例を示す(なお、本フォーラムではUnicodeのコードポイント「\u2014」で示されるダッシュ記号を表記できないため、以下のサンプルでは「\u2014」として表記している)。また、byte配列を文字列化するにはdecodeメソッドを使用できる。
b1 = bytearray(b'abc') # 「b'abc'」はbyte配列リテラル
print(b1) # 出力結果: bytearray(b'abc')
b2 = bytearray('abc', 'utf-8', 'strict') # 文字列abcをUTF-8形式でエンコード
print(b2) # 出力結果: bytearray(b'abc')
s = '\u2014' # \u2014で示されるダッシュ記号はCP932には含まれない
b3 = bytearray(s, 'cp932', 'backslashreplace') # バックスラッシュエスケープする
print(b3) # 出力結果: bytearray(b'\\u2014')
b3 = bytearray(s, 'cp932', 'replace') # 「?」などで置き換える
print(b3) # 出力結果: bytearray(b'?')
print(b1.decode()) # 出力結果: abc
整数を渡した場合は、そのサイズのbyte配列が返される(全ての要素の値は'\x00'となる)。イテラブルを渡した場合は、その要素の値を基にbyte配列が作成される(イテラブルの要素は0〜255の範囲の整数値である必要がある)。以下に簡単な例を示す。
b4 = bytearray(5) # bytearray型のオブジェクトの要素は変更可能
b4[0] = 104
b4[1] = 101
b4[2] = 108
b4[3] = 108
b4[4] = 111
print(b4) # 出力結果: bytearray(b'hello')
print(b4.decode()) # 出力結果: hello
b5 = bytes([119, 111, 114, 108, 100]) # bytes型のオブジェクトの要素は変更不可能
b5[0] = 87 # エラー
print(b5) # 出力結果: b'world'
complex
組み込み関数complexは複素数を作成するのに使用する。構文は次のようになる。
complex([real[, imag]])
complex(['<real>+<imag>j'])
引数realには数値か文字列を指定する。引数realが数値の場合、それは複素数の実数部を、引数imagが虚数部を示す。引数realが文字列の場合、その文字列が複素数全体を表すものとして扱われる。このときには「1+2j」のように虚数部にはサフィックスとして「j」を付加する必要がある。引数を指定しなかった場合には「0j」が生成される。以下に例を示す。
c1 = complex(1, 1) # 1+1j
c2 = complex('1+0j') # 1+0j
c3 = complex('1 + 0j') # エラー: 「+」の前後に空白を入れてはいけない
print(c1 + c2) # 出力結果: 2+1j
dict
組み込み関数dictは、指定した引数を基に辞書を作成する。構文は以下の通り。
dict(**kwargs)
dict(dictobj, **kwargs)
dict(iterable, **kwargs)
ここでいう「**kwargs」とは、複数のキーワード引数をまとめて1つの辞書として扱うための記法だ。簡単には、上の構文は下のように読み替えてもよい。
dict([a=x[, b=y[, c=z[, ……]]]])
dict(dictobj, [a=x[, b=y[, c=z[, ……]]]])
dict(iterable, [a=x[, b=y[, c=z[, ……]]]])
つまり、最初の構文は「x=1, y=2, ……」といったようにキーワード引数形式で辞書の要素を指定していく。次の構文はその前に辞書オブジェクトdictobj(正確にはマッピングオブジェクト。ただし、Pythonでは標準のマッピングオブジェクトは辞書オブジェクトのみ)と最初の構文と同様なキーワード形式での要素の指定を行う。最後の構文では引数iterable(イテラブルなオブジェクト)を指定するが、この場合、イテラブルの各要素が「2つの要素を持っている」必要がある。以下に例を示す。
d1 = dict(a=1, b=2, c=3)
d2 = dict(d1, d=4, e=5)
d3 = dict([('a', 1), ('b', 2), ('c', 3)], d=4, e=5)
d4 = dict([['x', 100], ['y', 200]])
print(d1) # 出力結果: {'a': 1, 'b': 2, 'c': 3}
print(d2) # 出力結果: {'a': 1, 'b': 2, 'c': 3, 'd': 4, 'e': 5}
print(d3) # 出力結果: {'a': 1, 'b': 2, 'c': 3, 'd': 4, 'e': 5}
print(d4) # 出力結果: {'x': 100, 'y': 200}
float
組み込み関数floatは指定した引数から浮動小数点数を生成する。構文を以下に示す。
float([x])
引数xには数値もしくは文字列を指定する。文字列を指定する場合、それは10進数値として扱われる。他にも無限大を意味する'Infinity'または'Inf'(大文字小文字は無視)、浮動小数点数演算における未定義あるいは表現不可能な値である「Not a Number」を意味する'NaN'(大文字小文字は無視)も指定可能。以下に例を示す。
f1 = float(1.1)
f2 = float('100')
f3 = float('NaN')
print(f1, f2, f3) # 出力結果: 1.1 100.0 nan
frozenset/set
組み込み関数frozenset/setは指定したイテラブル(反復可能オブジェクト)を基にイミュータブルな集合を生成する。前者はイミュータブルな集合を、後者はミュータブルな集合を生成する。構文を以下に示す。
frozenset([iterable])
set([iterable])
引数iterableを指定しない場合、空のfrozenset/setが生成される(例は省略する)。
int
組み込み関数intは指定した引数に応じた整数を返送する。構文は以下の通り。
int(x=0)
int(x, base=10)
1つ目の構文を見ると分かる通り、引数なしでこれを呼び出すと整数0が返される。2つ目の構文では、引数xに文字列(もしくはbyte配列)を、引数baseには引数xで表される値の基数を指定する(引数xの省略時には基数は10となる)。以下に例を示す。
i1 = int('ff', 16)
i2 = int(b'1111', 2)
i3 = int(b'1111')
print(i1, i2, i3) # 出力結果: 255 15 1111
変数i2には基数を2としたときの「1111」の値を、変数i3には基数を10としたときの「1111」の値が代入されていることに注目しよう。
list
組み込み関数listは指定した引数を基にリストを生成する。構文を以下に示す。
list([iterable])
引数iterableを省略すると、空のリストが生成される。引数iterableにはイテラブル(組み込み関数rangeの戻り値、タプル、リスト、辞書など、反復可能なオブジェクト)を渡す。以下に例を示す。
l1 = list(range(10)) # rangeからリストを生成
l2 = list((1, 2, 3)) # タプルからリストを生成
l3 = list({'a': 1, 'b': 2}) # 辞書からリストを生成
l4 = list({'a': 1, 'b': 2}.items()) # 辞書からリストを生成
print(l3) # 出力結果: ['a', 'b']
print(l4) # 出力結果: [('a', 1), ('b', 2)]
memoryview
組み込み関数memoryviewは指定した引数を基にメモリビューオブジェクトを生成する。メモリビューオブジェクトとは、byte配列などが内部で使用しているメモリ領域(バッファー)へのアクセスするためのラッパーとなり、それらのデータへの直接的なアクセスを行えるようにするものだ。
b1 = b'abcdefg'
b2 = bytearray(b1)
m1 = memoryview(b1)
m2 = memoryview(b2)
m1[0] = ord('A') # TypeError: b1は変更不可能
m2[0] = ord('A') # b2は変更可能なので成功する
print(bytes(b1).decode()) # 出力結果: abcdefg
print(bytes(b2).decode()) # 出力結果: Abcdefg
メモリビューオブジェクトは、それが参照しているメモリが変更不可能であれば、その要素を変更はできない。逆に変更可能であれば、メモリを直接書き換えられる。上のサンプルの変数b2は変更可能なbyte配列を参照しており、そのメモリビューを参照している変数m2を介して、その内容を書き換えている。
object
組み込み関数objectは無引数で呼び出し、特筆すべき属性を持たないオブジェクトを生成する。このオブジェクトには後から任意の属性を付加することはできない(例は省略する)。
str
組み込み関数strの構文を以下に示す。
str(object='')
組み込み関数strは引数に指定したオブジェクトを文字列化する。あるいは、「オブジェクトのインフォーマルな表現」(オブジェクトを印字可能な文字としたもの)を返す。これに対して、組み込み関数reprは「オブジェクトのオフィシャルな表現」を返す。
組み込み関数strを呼び出すと、最終的にそのオブジェクトが持つ__str__メソッドが呼び出されるが、これが存在しない場合には__repr__メソッドが呼び出される(全ての型の基底クラスであるobjectクラスの__str__メソッドの実装がobject.__repr__メソッドを呼び出すようになっている)。
__str__メソッドと__repr__メソッドの違いは、前者はよりシンプルで簡易的なオブジェクトの文字列表現を返してもよいのに対して、Pythonのドキュメント「Python 言語リファレンス」にある「object.__repr__」の説明によれば、後者は「これは (適切な環境が与えられれば) 同じ値のオブジェクトを再生成するのに使える、有効な Python 式のようなものであるべき」という点だ。つまり、厳密に文字列表現には(組み込み関数reprを介して呼び出される)__repr__メソッドを、簡易的な文字列表現には(組み込み関数strを介して呼び出される)__str__メソッドを使用する(なお、組み込み関数reprについては次回取り上げる)。
なお、組み込み関数strには3引数のバージョンもあるが、これについては説明を割愛する。
tuple
組み込み関数tupleは指定した引数を基にタプルを生成する。構文を以下に示す。
tuple([iterable])
引数iterableを省略すると、空のタプルが作成される。例を以下に示す。
t1 = tuple(range(10)) # rangeからタプルを生成
t2 = tuple([1, 2, 3]) # リストからタプルを生成
t3 = tuple({'a': 1, 'b': 2}) # 辞書からタプルを生成
t4 = tuple({'a': 1, 'b': 2}.items()) # 辞書からタプルを生成
print(t3) # 出力結果: ('a', 'b')
print(t4) # 出力結果: (('a', 1), ('b', 2))
次ページでは数値計算に関連するものを取り上げる。
Copyright© Digital Advantage Corp. All Rights Reserved.