Python 3の組み込み関数を速攻理解しよう: オブジェクト生成/数値計算/文字列/イテラブル編:特集:タイニーレファレンス(2/2 ページ)
Python 3が提供する組み込み関数のうち、オブジェクトを生成するもの/簡単な計算を行うもの/文字列に関連するもの/イテラブルに関連するものを紹介する。
絶対値/商と剰余/累乗/丸めを行う組み込み関数
数値計算に関連する組み込み関数としては以下のものがある。
関数 | 説明 |
---|---|
abs | 絶対値を計算する |
divmod | 第1引数を第2引数で割った章と剰余を計算する |
pow | 累乗を計算する |
round | 数値を丸める |
数値計算に関連する組み込み関数 |
以下にこれらの組み込み関数の構文をまとめる。
abs(x) # xの絶対値を計算
divmod(x, y) # (x // y, x % y)をタプルで返す
pow(x, y) # xのy乗を返す
round(num[, ndigit]) # numの値を小数点以下ndigit桁に丸めた値を返す
組み込み関数roundで引数ndigitを指定しなかった場合は、numに受け取った値に近い整数に丸められる。以下にこれらの組み込み関数の使用例を示す。組み込み関数roundの丸め方にはクセがあるので注意しよう(詳細はroundの説明を参照のこと)。
print(abs(-2)) # 出力結果: 2
print(divmod(22, 7)) # 出力結果: (3, 1)
print(pow(2, 4)) # 出力結果: 16
print(round(0.5)) # 出力結果: 0
print(round(1.5)) # 出力結果: 2
print(round(3.14159, 2)) # 出力結果: 3.14
文字/文字列操作に関連するもの
文字や文字列操作に関連する組み込み関数としては以下のものがある。
関数 | 説明 |
---|---|
bin | 引数に指定した整数値を2進表記の文字列に変換する |
chr | 引数に指定した値をUnicodeのコードポイントとして、その文字(列)を返す |
format | 文字列の書式化を行う |
hex | 引数に指定した整数値を16進表記の文字列に変換する |
oct | 引数に指定した整数値を8進表記の文字列に変換する |
ord | 引数に指定した文字のUnicodeコードポイントを返す |
文字/文字列操作に関連する組み込み関数 |
これらの組み込み関数の構文を以下にまとめる。
bin(x)
chr(i)
format(value[, format_spec])
hex(x)
oct(x)
ord(c)
組み込み関数formatについては後述するとして、他の関数の使用例を以下に示す。
x = 254
print(bin(x)) # 出力結果: 0b11111110(0bは2進表記のプレフィクス)
print(hex(x)) # 出力結果: 0xfe(0xは16進表記のプレフィクス)
print(oct(x)) # 出力結果: 0o376(0oは8進表記のプレフィクス)
y = 'あ'
z = ord(y)
print(hex(z)) # 出力結果: 0x3042(「あ」のコードポイントは「U+3042」)
print(chr(z-1)) # 出力結果: ぁ
組み込み関数formatについては少し説明が必要になる(ただし、多くの場合はstr.formatメソッドを使用するか、Python 3.6以降ではf文字列を使用することになるだろう)。組み込み関数formatは第1引数valueに表示したい値を、第2引数format_specにそれをどのように書式化するかを指定する。後者の指定の詳細については「書式指定ミニ言語仕様」を参照のこと。簡単にまとめると次のようになる。これらを左から順に組み合わせて指定する(全て省略可能)。
- 書式指定後の引数valueの値が文字列幅より少ない場合に埋める文字を指定
- 右寄せ/左寄せなどを「>」「<」「=」「^」で指定
- 符号の付け方を「+」「-」「 」(空白文字)で指定
- 値の型に応じた特殊な表示形式を使用する場合には「#」を指定
- 0埋めで表示する場合は「0」を指定
- 文字列幅を指定
- 整数を10進表記で3桁ごとに区切り付きで表示する場合は「,」「_」を、2進/8進/16進などで4桁区ごとに区切り付きで表示する場合は「_」を指定
- 浮動小数点数を表示する場合の小数点以下の桁数を「.」に続けて指定
- データの表現方式を「s(文字列)」「b(2進数)」「c(文字)」「d(10進数)」「o(8進数)」「x(16進数)」「e(指数表記)」「f(固定小数点)」「g(汎用フォーマット)」などを利用して指定
以下に例を示す(最後の例はPython 3.6以降)。
# 「*」埋め、右寄せ、「0x」を前置、8桁幅、16進表記
print(format(65536, '*>#8x')) # 出力結果: *0x10000
# 「0」埋め、右寄せ、「0x」を前置、8桁幅、16進表記
print(format(65536, '>#08x')) # 出力結果: 00x10000
# 符号と数値の間を空白埋め、10桁、3桁ごとにカンマ表示、10進表記
print(format(65536, '=+10,d')) # 出力結果: + 65,536
# 符号と数値の間を「0」埋め、10桁、3桁ごとにアンダースコア表示、10進表記
print(format(65536, '=+010_d')) # 出力結果: +0_065_536
イテラブル(反復可能)オブジェクトに関連するもの
イテラブル(反復可能)オブジェクトに関連する組み込み関数としては以下がある。
関数 | 説明 |
---|---|
all | 引数に指定したイテラブルの全ての要素が真であればTrueを返送する |
any | 引数に指定したイテラブルのいずれかの要素が真であればTrueを返送する |
enumerate | enumerateオブジェクトを返送する |
filter | 引数に関数とイテラブルを受け取り、イテラブルの各要素にその関数を適用した結果が真となる要素だけをまとめたイテレータを作成する |
iter | イテレータオブジェクトを返送する |
len | オブジェクトの長さを返送する |
map | 引数に関数とイテラブルを受け取り、「イテラブルの全ての要素にその関数を適用した結果を適用したものを返送するイテレータ」を返送する |
max | 引数に受け取った値の中で最大のものを返送する |
min | 引数に受け取った値の中で最小のものを返送する |
next | 引数に指定したイテレータの次の要素を返送する |
range | 指定した初期値、最終値、ステップを満たすrangeオブジェクトを返送する |
reversed | 引数に指定したシーケンス(順序を持ったコレクション)を逆順に取得するイテレータを返送する |
slice | 指定した引数を基にスライスオブジェクト(インデックスを表すオブジェクト)を生成する |
sorted | 引数に指定したイテラブルをソートした結果のリストを返送する |
sum | 受け取った要素の総和を計算する |
zip | 複数のイテラブルをまとめたイテレータを返送する |
イテラブル(反復可能)オブジェクトに関連する組み込み関数 |
以下では、似た用途で使用される組み込み関数をまとめて紹介する。
イテラブルの要素をチェックする: all/any/len/sum
組み込み関数のall/anyはイテラブルの全要素を調べ、その真偽によりTrue/Falseを返送する。組み込み関数lenはイテラブルの長さを調べるもので、組み込み関数sumはイテラブルの要素の総和を求めるのに使用する。これらの構文を以下にまとめる。
all(iterable)
any(iterable)
len(s)
sum(iterable[, start])
組み込み関数lenにはシーケンス(リストやタプル、バイト列など)や集合や辞書などを渡せる。組み込み関数sumにはイテラブルに加えて、引数startに初期値を渡せる)。以下にこれらの使用例を示す。イテラブルの要素は数値である必要がある(初期値=数値との加算を行える要素である必要がある)。
l = [9, 7, 1, 4, 5, 7, 0, 3, 10, 5]
print(all(l)) # 出力結果: False(0があるため)
print(any(l)) # 出力結果: True(1以上の値が含まれているため)
print(len(l)) # 出力結果: 10(要素数10)
print(sum(l)) # 出力結果: 51
print(sum(l, 100)) # 出力結果: 初期値100+51
l2 = ('foo', 'bar', 'baz')
sum(l2) # エラー: 文字列の連結には使えない
最大値/最小値を求める: max/min
組み込み関数max/minはイテラブルの中で最大/最小の要素を返送する。以下に構文をまとめる。
max(iterable, *[, key, default])
max(arg1, arg2, *args[, key])
min(iterable, *[, key, default])
min(arg1, arg2, *args[, key])
組み込み関数max/minの最初の構文では引数iterableに対象のイテラブルを、キーワード引数keyに最大値/最小値の計算で使用する順序関数を、キーワード引数defaultに引数iterableが空の場合に返送するデフォルト値を指定する。ただし、2つのキーワード引数を指定しない場合には、引数iterableは空であってはならない。2つ目の構文では、2つ以上の値から最大値/最小値を計算する(このときにも順序関数を指定可能)。以下に使用例を示す。
l1 = list(range(5)) # [0, 1, 2, 3, 4]
print(max(l1)) # 出力結果: 4
# 正負を反転する関数をキーとして指定
print(max(l1, key=lambda x: -x)) # 出力結果: 0
l2 = 'a', 'C', 'd', 'B'
print(min(l2)) # 出力結果: B(大文字小文字を考慮する)
print(min(l2, key=str.lower)) # 出力結果: a(大文字小文字を無視)
print(min([], key=str.lower, default='none')) # 出力結果: none
イテラブルの要素に関数を適用する: filter/map
組み込み関数filterとmapはともに、引数として関数とイテラブルを受け取り、受け取ったイテラブルの各要素に関数を適用し、その結果を返すイテレータを生成する。違いは、組み込み関数filterは関数の適用結果が真と判定される要素だけをイテレータの要素とするのに対して、組み込み関数mapは適用した結果を全て返送するイテレータを生成する点となる。構文を以下にまとめる。
filter(function, iterable)
map(function, iterable)
使用例を以下に示す。
l = list(range(5))
# 2で割り切れるものだけを抽出
l2 = list(filter(lambda x : x % 2 == 0, l))
# 2で割り切れるかの判定結果からなるイテレータを生成
l3 = list(map(lambda x: x % 2 == 0, l))
print(l2) # 出力結果: [0, 2, 4]
print(l3) # 出力結果: [True, False, True, False, True]
print(max('Z', 'x')) # 出力結果: x
print(max('Z', 'x', key=str.lower)) # 出力結果: Z
print(min(-10, -20, key=abs)) # 出力結果: -10
イテラブル/シーケンスを並べ替える: reversed/sorted
組み込み関数reversedはシーケンス(リストやタプルなどの順序を持ったコレクション)を受け取り、それを逆順に並べるイテレータを返送する。組み込み関数sortedは任意のイテラブルを受け取り、それをソートした結果のリストを返送する。構文は次の通り。
reversed(seq)
sorted(iterable[, key][, reverse])
組み込み関数sortedにはイテラブル以外に、2つのキーワード引数を指定できる。キーワード引数keyには並べ替えを行う際に使用する順序関数を、キーワード引数reverseには並べ替えを逆順に行うかどうかをTrue/Falseで指定する。使用例を以下に示す。
l = [4, 6, 1, 8, 10]
rv = reversed(l)
print(rv) # 出力結果: <list_reverseiterator object at ……>
for item in rv: # 出力結果: 10, 8, 1, 6, 4,
print(item, end=', ')
l2 = sorted(l)
print(l2) # 出力結果: [1, 4, 6, 8, 10]
l3 = sorted(l, reverse=True)
print(l3) # 出力結果: [10, 8, 6, 4, 1]
l4 = ('M', 'd', 'Z', 'a')
print(sorted(l4)) # 出力結果: ['M', 'Z', 'a', 'd']
print(sorted(l4, key=str.upper)) # 出力結果: ['a', 'd', 'M', 'Z']
イテラブル/イテレータを操作する: enumerate/iter/next/range/slice/zip
本稿で最後に紹介するのは何らかの形で列挙や反復を行うためのオブジェクトを返送するものだ。構文を以下に示す。
enumerate(iterable, start=0)
iter(object[, sentinel])
next(iterator[, default])
range(stop)
range(start, stop[, step])
slice(stop)
slice(start, stop[, step])
zip(*iterables)
組み込み関数enumerateはイテラブルを受け取り、その要素にインデックスを付加した「(index, item)」形式の要素を返すイテレータ(enumerateオブジェクト)を生成する。引数startにはインデックスの初期値を指定する(省略すると0)。以下に例を示す。
e = enumerate(['foo', 'bar', 'baz'], start=2)
for item in e:
print(item[0], item[1])
# 出力結果
# 2 foo
# 3 bar
# 4 baz
組み込み関数iterは引数に受け取ったオブジェクトに対応するイテレータを返送する。引数objectのみを指定した場合には、そのオブジェクトは反復処理が可能である必要がある(詳細は「iter」を参照されたい)。引数sentinelを指定した場合は、引数objectの値は呼び出し可能(関数など)である必要がある。その呼び出し結果が引数sentinelで指定した値となるまで反復処理が続けられる。また、以下の例に示すように、イテレータの次の要素を取得するには組み込み関数nextを使用できる。組み込み関数nextの引数defaultの値はイテレータが全ての要素を返送していた場合に使用される(指定しなかった場合は例外が発生する)。
from random import randint
l = list(range(3))
it = iter(l)
print(next(it)) # 出力結果: 0
print(next(it)) # 出力結果: 1
print(next(it)) # 出力結果: 2
print(next(it)) # StopIteration例外
it2 = iter(lambda : randint(0, 3), 3)
next(it2, 'terminated') # 出力結果: 1など
next(it2, 'terminated') # 出力結果: 0など
# …… 省略 ……
next(it2, 'terminated') # 出力結果: 'terminated'(関数randintが3を返送)
最初の例は3要素のリストからイテレータを生成し、それに対して組み込み関数nextを呼び出している。要素がなくなったところで、StopIteration例外が送出されているのが分かるはずだ。次の例はランダムに0〜3の範囲の整数値を返送する関数(ラムダ式)を組み込み関数iterに渡し、その値が3だったら反復処理を終了するように指定している。
組み込み関数rangeは指定した範囲を表すrangeオブジェクトを返送する。1引数バージョンでは初期値を0、最終値を引数に指定した値、ステップを1とするrangeオブジェクトが生成される(最終値は範囲には含まれない)。3引数バージョンでは指定した初期値、最終値、ステップを表すrangeオブジェクトを生成する。これは特定の範囲の値(回数)を利用したループ処理(や内包表記)などで使用できる。
組み込み関数sliceの引数も同様だが、こちらは「スライスオブジェクト」を生成する。これはリストなどのシーケンス(順序を持つコレクション)のインデックス範囲を指定するのに使用できる。
以下に使用例を示す。
for i in range(3): # 出力結果: 0 1 2
print(i)
l = list(range(0, 10, 2)) # 初期値0、最終値10、ステップ2の範囲からリストを作成
print(l) # [0, 2, 4, 6, 8](10は含まれない)
s = slice(0, 5, 2) # 初期値0、最終値5、ステップ2のスライスを指定
print(l[s]) # 出力結果: [0, 4, 8](0、2、4番目の要素で構成されるスライス)
組み込み関数zipは複数のイテラブルをまとめたタプルを要素とするイテレータを返送するものだ。以下に使用例を示す。
l1 = [chr(x) for x in range(ord('A'), ord('E'))] # ['A', 'B', 'C', 'D']
l2 = [x for x in range(0, 10)] # [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
it = zip(l1, l2)
print(list(it)) # 出力結果: [('A', 0), ('B', 1), ('C', 2), ('D', 3), ('E', 4)]
l3 = list(zip(*[iter(range(12))]*4)) # 12個の要素を持つリストを4要素ずつに分割
print(l3) # 出力結果: [(0, 1, 2, 3), (4, 5, 6, 7), (8, 9, 10, 11)]
見ての通り、組み込み関数zipに渡したイテラブルの要素数が異なる場合は、要素数が少ないものに合わせて、イテレータが生成される。最後の例に示したように、要素数の多いリストやタプルをn個ずつに分割する際にも使用できる(詳細は「zip」を参照のこと)。
今回はPython 3の組み込み関数のうち、オブジェクトを生成するもの(コンストラクタ)、ちょっとした計算を行うもの、文字/文字列に関連するもの、イテラブル(反復可能)オブジェクトに関連するものを見てきた。次回は残りの組み込み関数を紹介する。
Copyright© Digital Advantage Corp. All Rights Reserved.