まえおき
- この記事は執筆中のやさしくはじめるPythonプログラミングの本の特定の章の部分抜粋です。
- 入門本なので初心者の方向けです。
- ビルトイン関数の章の内容が主になります。
- Qiita記事にマッチしていない箇所(「章」や「ページ」といった単語が使っていたり、改行数が余分だったり、リンクが対応していない等)があるという点はご留意ください。気になる方は↑のリンクの電子書籍版をご利用ください。
- コメントなどでフィードバックいただいた場合、書籍側にも活用・反映させていただく場合があります。
最初から使える関数たち : Pythonのビルトイン関数
本章ではPythonのよく使われるビルトイン関数について触れていきます。ビルトインという単語は聞きなれないものかもしれませんが、英語だと「built-in」という単語で、「作り付けの」とか「本来備わっている」、「内臓の」といったような意味を持ちます。
built
という単語からも分かる通りbuilt-in
の単語は建築業界でも使われる単語で、建築業界では建物が建てられた時からすでに備わっている設備や機能などのことを言います。
プログラミング界隈でもビルトインは同じような形で使われ、「Pythonのビルトインの関数」といった表現が出てきたら「Pythonで最初から組み込まれている関数群」という意味になります。
前章では皆さん自身で関数を色々作っていきましたが、基本的な関数の処理はいちいち作らなくても、Python側で事前に用意してくれていたりします。いままでたくさん使ってきた、変数などの内容を出力するprint関数もPythonのビルトイン関数です。
覚えておくと自分で関数を作るよりも便利なものが色々あります。少しずつ実際に使っていって覚えていきましょう。
※なお、すぐには使わなそうな(優先度が低めな)発展的な関数や、他の説明が必要な関数などについては後々の章で都度触れたり本書では説明を割愛していたりします。全ての把握が必要な場合にはPythonの公式ドキュメントなどをご確認ください。
引数の内容を出力する : print関数
まずは前章まででも色々と使ってきたprint関数からです。
今まで使ってきて分かる通り、print関数では引数に指定した内容を画面に出力します。コマンドラインやAnaconda Promptなどの黒い画面でPythonを実行した場合にはそちらの画面へ内容が出力され、Jupyter上で実行すればJupyter上に内容が出力されます。
変数の内容を都度確認したり、不具合(バグ)の原因を探る作業(デバッグなどとも呼ばれます)やログ出力など様々なケースで非常に良く使われます(ログ出力はprint以外にも別途Pythonで機能がありますがここでは触れません)。
使い方はシンプルで、引数に任意の値を指定するとその内容を出力してくれます。
print(100)
コード実行結果の出力内容:
100
何のひねりも無いコードではありますが、print関数に100という値を引数に指定しているため、100という結果が出力されています。
引数には変数も指定することができます。以下のコードではcat_age
という変数をprint関数の引数に指定しています。
cat_age = 5
print(cat_age)
コード実行結果の出力内容:
5
これだけだと特に変数の内容を出力しなくても内容はすぐに確認できますが、実務ではコードが複雑になってきたり長くなってきたりして、「この変数は今どんな値になっているのだろう?」といったケースは良く発生するためprintでの出力はよく利用します。
また、print関数は複数の引数を指定することができます。その場合デフォルトでは半角のスペースが挟まれる形で複数の値が出力されます。複数の文字列や変数を1つの文字列に連結しなくても出力できるので、出力内容に対するラベルを付けたり複数の値を扱うときなどに便利です。引数の件数は2個でも3個でも、もしくはそれ以上でも受け付けてくれます。
cat_name = 'tama'
print('my name is:', cat_name)
コード実行結果の出力内容:
my name is: tama
複数の引数を指定した際の区切り文字で半角スペース以外を利用したい場合には、sep
引数をキーワード引数を利用して指定することでデフォルトの半角スペース以外を設定することができます(英語のseparatorで「区切り文字」といった意味を持ちます)。
answer = 2
print('1 + 1', answer, sep=' = ')
コード実行結果の出力内容:
1 + 1 = 2
合計を計算する : sum関数
sum関数は、引数に数値を格納したリストなどを指定するとその内容の合計値を返却してくれます。sumは日本語では合計や総額といった意味を持つ単語になります。
以下のコードでは、1 + 2 + 3
を計算した時と同じ結果を得ることができます(sum関数などは主にリストなどの値が変動する変数などで利用します)。
summed_val = sum([1, 2, 3])
print(summed_val)
コード実行結果の出力内容:
6
なお、値は整数だけでなく浮動小数点数が含まれていても問題なく計算してくれます。
summed_val = sum([1.2, 2.5, 3])
print(summed_val)
コード実行結果の出力内容:
6.7
最大値と最小値を計算する : max関数とmin関数
リストなどの値の中の最大値(maximum)と最小値(minimum)を求めるにはmax関数とmin関数を使います。
使い方はsum関数とほぼ同じで、引数にリストなどを指定するだけです。
最大値を求めるサンプル :
max_value = max([10, 3, 2.5, 60, 30])
print(max_value)
コード実行結果の出力内容:
60
最小値を求めるサンプル :
min_value = min([10, 3, 2.5, 60, 30])
print(min_value)
コード実行結果の出力内容:
2.5
絶対値を取得する : abs関数
数値の絶対値を取得するにはabs関数を使います。絶対値は英語だとabsolute valueとなります。
引数に指定した数値が正の値であればそのままの値が返却され、負の値を引数に指定した場合には正の値になって返却されます。
引数に正の値を指定した場合のサンプル :
absolute_value = abs(10)
print(absolute_value)
コード実行結果の出力内容:
10
引数に負の値を指定した場合のサンプル :
absolute_value = abs(-10)
print(absolute_value)
コード実行結果の出力内容:
10
四捨五入に近い計算を行う : round関数
浮動小数点数(float)の値に対して四捨五入に近い計算をするにはround関数を使います。
「近い」と表現した通り、厳密には四捨五入の計算とは異なり「偶数への丸め」と呼ばれる端数処理の計算となるので注意してください(「偶数への丸め」は英語でround to evenとなります)。
「偶数への丸め」とは、端数の値が5の時に、丸めた(roundした)際の結果が偶数になる方に値が設定されます。
例えば、2.5という、端数が5になっている値を考えてみます。
四捨五入をすると3になります。一方で偶数への丸めの場合には結果が偶数になるように処理されるので偶数の2になります。
1.5という値に関しても同様に考えてみます。四捨五入した時には2となります。また、偶数への丸めの場合でも同じように偶数の2に変換されます。
このように偶数の丸めの計算であるPythonのround関数は四捨五入と結果がずれるケースがあるので注意してください。
実際にそれぞれのケースでround関数を使って結果を確認してみましょう。
まずは1.5を指定した際に、偶数の2になることを確認します。
rounded_value = round(1.5)
print(rounded_value)
コード実行結果の出力内容:
2
続いて1.4を指定してみます。端数が5では無い場合は四捨五入と同じような挙動となるため、1となります。
rounded_value = round(1.4)
print(rounded_value)
コード実行結果の出力内容:
1
続いて2.5を指定してみます。端数が5なのと丸めた際に偶数の値となるので結果は3ではなく2になります。
rounded_value = round(2.5)
print(rounded_value)
コード実行結果の出力内容:
2
また、小数点以下の第何位までを利用するかどうかの指定が必要な場合には第二引数に整数で指定します。例えば第一位まで残したい場合には第二引数に1を、第三位まで残したい場合には3を指定します。
小数点以下第一位まで残す指定のサンプル :
rounded_value = round(100.45235, 1)
print(rounded_value)
コード実行結果の出力内容:
100.5
第二位まで残す指定のサンプル :
rounded_value = round(100.45235, 2)
print(rounded_value)
コード実行結果の出力内容:
100.45
第三位まで残す指定のサンプル :
rounded_value = round(100.45235, 3)
print(rounded_value)
コード実行結果の出力内容:
100.452
要素の件数を取得する : len関数
様々な要素の件数を取得するにはlen関数を使います。「長さ」の意味を持つlengthの英単語に由来します。取得できる件数の種類は引数に指定した型によって変わります。
例えば、文字列を引数に指定した場合には「文字数」が返却されます。リストを指定した場合には「リストに格納されている値の数」が返却されます。辞書を指定すると「キーと値のセットの数」が返却される、といった具合です。
コードを書いて試してみましょう。
まずは文字列から試してみます。引数にapple
という5文字の文字列を指定しているので5が返ってきていることが確認できます。
char_num = len('apple')
print(char_num)
コード実行結果の出力内容:
5
続いてリストに対して試してみます。100, 200, 300
という3つの値を格納したリストなので、3が返ってきていることが確認できます。
list_length = len([100, 200, 300])
print(list_length)
コード実行結果の出力内容:
3
辞書も試してみます。'name': 'ミケ'
というキーと値のセットと、'age': 3
というキーと値のセットが2件あるため返却値も2になっていることが確認できます。
dict_length = len({'name': 'ミケ', 'age': 3})
print(dict_length)
コード実行結果の出力内容:
2
文字列とリスト、辞書について触れましたが、この3つの他にも様々な型の値をlen関数の引数に指定することができます。ただし、長さを持たないような型の値を指定した場合にはエラーになります。
例えば整数などの数値を指定してみるとエラーになることが確認できます。
len(100)
TypeError: object of type 'int' has no len()
今回の例では「整数(int)の型はlen関数で長さを取得する機能を持っていないよ」といったような意味のエラーメッセージになります。
リストなどの中身を昇順ソートした値を取得する : sorted関数
リストのような複数の値で順番を持つ要素に対してsorted関数を使うと、中の値を昇順(小さい値から大きい値の順)でソート(データを並び変えること)することができます。
関数名の末尾にedと付いていることが分かるように、「ソートされた値を取得する」といった処理の関数になります。
引数に指定した値が数値を含んだリストであれば、数値が小さい順に並んだリストを取得することができます。
sorted_list = sorted([300, 200, 500, 100])
print(sorted_list)
コード実行結果の出力内容:
[100, 200, 300, 500]
文字列を含んだリストを引数に指定した場合には、英語であれば先頭の文字のアルファベット順(a~z)にソートされます。
sorted_list = sorted(['banana', 'apple', 'orange', 'melon', 'carrot'])
print(sorted_list)
コード実行結果の出力内容:
['apple', 'banana', 'carrot', 'melon', 'orange']
日本語の文字列を含んだ文字列であれば、先頭の文字でひらがなやカタカナなどでソートされます。
sorted_list = sorted(['リンゴ', 'オレンジ', 'メロン', 'ニンジン', 'アボカド'])
print(sorted_list)
コード実行結果の出力内容:
['アボカド', 'オレンジ', 'ニンジン', 'メロン', 'リンゴ']
漢字などもソートすることができます。順番が決まっているため、ソートすると毎回同じ順番になります。
sorted_list = sorted(['猫', '犬', '兎'])
print(sorted_list)
コード実行結果の出力内容:
['兎', '犬', '猫']
漢字はどういったルールで順番が決まっているのでしょう?後々の章で文字コードなどについて触れていきますが、実は文字には番号のようなものが割り振られています(Unicodeの文字コード)。ひらがなもカタカナも、様々な漢字も記号にもこの番号のようなものが割り振られており、sorted関数などを使った時にはこの値を参考にしてソートがされています。
なお、数値と文字列といったように異なる型の値を含んだリストに対しては「どちらが小さいのか」の判定ができないためにエラーになります。
sorted_list = sorted(
[300, 'banana', 'apple', 450, 'orange', 'melon', 'carrot', 100])
TypeError: '<' not supported between instances of 'str' and 'int'
「文字列と整数の要素間の小なり(<)の比較はサポートされていませんよ」といったようなエラーメッセージとなります。
リストなどの中身を逆順にした値を取得する : reversed関数
sorted関数と同じように、reversed関数もリストなどの中身の順番を入れ替えるための関数です。
こちらはリストの値を逆にしたものを返却します。「逆にする」といった意味のreverseに名前は由来します。
例えば[5, 1, 3]
というリストがあれば[3, 1, 5]
という結果が返却されます。
注意点として、返却値はsortedと異なりリストではなくイテレーターという特殊な型のものが返却されます。後々のセクションで触れる型の内容を確認できるtypeという関数を使って返却値をチェックしてみるとリスト以外の値が返却されていることが分かります。
reversed_list = reversed([300, 200, 500, 100])
print(type(reversed_list))
コード実行結果の出力内容:
<class 'list_reverseiterator'>
イテレーターに関してはのちのちの章で触れていくためここでは説明は割愛します。
返却されたイテレーターはリストのように[0]
といったインデックスを使った参照などができません。以下のようにエラーになります。
reversed_list = reversed([300, 200, 500, 100])
reversed_list[0]
TypeError: 'list_reverseiterator' object is not subscriptable
subscriptは「添え字」といった意味を持ちます。リストなどのインデックスの番号は添え字などとも呼ばれます。subscriptableで「添え字が設定できない」といったような意味になるので、エラーメッセージは「list_reverseiterator
の型のオブジェクトには添え字(インデックスの指定)はできないよ」といったような内容になります。
返却された値をリストとして使いたい場合にはどうすればいいのでしょう?そういった場合には「キャスト」と呼ばれる処理をするとリストとして使えるようになります(キャストに関しても後々の章で詳しく触れていきます)。
リストにキャストするには値をlist関数に渡します。以下のコードのようにキャストの処理を挟むとインデックスを参照したりといったリストの制御ができるようになります(下記のコードではreversed_list = list(reversed_list)
の行がキャストに該当します)。
reversed_list = reversed([300, 200, 500, 100])
reversed_list = list(reversed_list)
print('先頭のインデックスの値:', reversed_list[0])
print('リスト全体の値 :', reversed_list)
コード実行結果の出力内容:
先頭のインデックスの値: 100
リスト全体の値 : [100, 500, 200, 300]
なぜリストではなくイテレーターというもので返却されているのでしょう?海外も含めてネット上の投稿などを見てみてもはっきりとコレ!という理由は実は分かっていません。
この本を書いている時点でPythonも約30年くらいの歴史を持っているため、「Pythonの実装の歴史上の都合」とか「sortedは関数になっていて、一方で実はreversedはクラス(後々触れます)で実装されており、内部のC言語での実装のしやすさ的に一部がクラスになっている」とか「他のビルトインの関数もメモリなどの負荷面に配慮してイテレーターに途中から変更された都合でsortedとreversedでずれている」とか様々なことが言われています。
小難しいですし、読んでいても面白いという以外は実務などでは知らなくても特に実害は無いと思いますので、ひとまずは「reversedの結果をリストで使いたい場合はキャストする」とだけ覚えておいてください。
特定のフォーマットの文字列を作成する : format関数
format関数は第一引数に数値などの値を取り、第二引数に特定のフォーマットの文字列を指定することで、第一引数に指定された値を特定のフォーマットに合わせた文字列で返却してくれます。
たとえば数値に3桁ごとに半角のコンマを入れたり、round関数のように小数点数を特定の位置で端数処理したり、2進数と呼ばれるフォーマットの文字列に変換したり、任意の桁数になるまで先頭を0などで埋めたりといった具合です。
利用頻度が低めなフォーマットも多く、他で代替できるものもあったりするためここでは全てのフォーマットは触れませんがいくつかサンプルとしてコードを書いていきます。
まずは数値に対して3桁ごとに半角のコンマを付与した文字列を取得したいケースです。使い方は第一引数には数値、第二引数に','
といったように半角のコンマの文字列を指定します。
print(format(1234567, ','))
コード実行結果の出力内容:
1,234,567
続いて文字埋め処理です。第二引数に>
の記号とその後に半角の数字を入れると、第一引数の値がその数字分半角スペースが左側に付与された文字列になります。例えば第一引数に1
と指定して、第二引数に>5
とすると結果の文字列が5文字になるように4つの半角スペースが付与された文字列が返却されます。
print(format(1, '>5'))
コード実行結果の出力内容:
1
第一引数が123
といった値を指定した場合には足りない文字数分の2文字だけ半角スペースが付与されたりと、第一の値次第で付与されるスペース数が変動します。
print(format(123, '>5'))
コード実行結果の出力内容:
123
>
の記号の前に特定の文字を配置することで、足りない部分のスペースの追加でスペース以外を指定することができます。たとえば!>5
といった文字列を第二引数に指定すると、5文字になるように左側に!
の文字が追加されます。
print(format(123, '!>5'))
コード実行結果の出力内容:
!!123
これを利用することで例えば任意の文字数になるように左側に0を追加した文字列を作ることもできます。
print(format(12, '0>5'))
コード実行結果の出力内容:
00012
また、>
の記号ではなく<
の記号を使うと今度は右側に足りない文字数分、特定の文字が追加されます。
print(format(123, '!<5'))
コード実行結果の出力内容:
123!!
>
や<
の記号の代わりに^
の記号を第二引数に指定すると、第一引数に指定した値の左右に半分ずつ特定の文字列が追加され、合計で指定の文字数分になる形で文字列が返却されます。結果の文字数は^
記号の後に設定します。
例えば返却値を15文字にしたければ^15
といったように指定します。以下のコードで試してみると、第一引数に指定された猫
という文字列の両側に15文字になるまで半角のスペースが追加されます。
print(format('猫', '^15'))
コード実行結果の出力内容:
猫
また、^
の記号の左側に特定の文字を設定すると半角スペースの代わりにその文字で追加処理が実行されます。
print(format('猫', '犬^15'))
コード実行結果の出力内容:
犬犬犬犬犬犬犬猫犬犬犬犬犬犬犬
次は小数点数の扱いです。任意の数字で特定の小数部の桁数まで含んだ文字列を作るには.3f
といったような文字列を第二引数に指定します。3の部分は小数点以下第何位までを残すかどうかの任意の値です。3を指定したら3位まで残る形になります。.2f
や.4f
といったような任意の値が設定できます。f
という部分は浮動小数点数を表すfloatの頭文字に由来します。
第一引数に整数を指定した場合には.000
といったように指定した小数部の桁数分の文字列が付与されます。
print(format(2, '.3f'))
コード実行結果の出力内容:
2.000
第一引数に1.234567
といった値を指定し、且つ第二引数で指定した小数部の桁数を超えている場合はround関数を使ったときと同じように端数の丸めが実行され、指定した桁数の小数部のみ残されます。
print(format(1.234567, '.2f'))
コード実行結果の出力内容:
1.23
その他にも数値の2進数や16進数などへの変換も行うことができます。ここではあまり深くまでは触れませんが、初めてそれらを聞く方もいらっしゃると思うので軽く説明しておきます。
コンピューターに絡んだデザイン画像などで、よく0と1の羅列で表現されているものを見たことがあるかもしれません(例 : 0011101001といったようなものなど)。
このように0と1の組み合わせで色々な値を表現する方法を2進数といいます。普段の生活で使う数字は10進数と呼ばれるもので、0, 1, 2, 3, ..., といったように、0~9の10個の数字を使って値を表現しています。
一方で2進数は0, 1, 10, 11, 100, 101, 110, 111といったように値が増えるごとに0と1の組み合わせをずらしていくことで数値を表現します。各値がどんな値なのかはぱっと見では分かりづらいため普段の生活ではほぼ使いませんが、プログラミングやコンピューターの世界ではよく出てきます。
2進数と10進数の説明からも予想できるかもしれませんが、16進数は16個の値で表現されます。数字は0~9の10個しかないので、数字に加えてabcdef(大文字が使われることも多くあります)の6個のアルファベットが使われます。
16進数は主にweb業界の技術などでカラーコード(色の指定)で使われたりします。FFFFFF
で白、FF0000
で赤、0000FF
で青といったように数字とA~Fまでのアルファベットで色が表現されます。左の2文字が赤、真ん中の2文字が緑、右の2文字が青の数値を表し最終的な色を表現できるので、10進数よりも慣れてくると直感的に色を扱うことができるようになります。
例えば16進数の代わりに10進数で色を表現すると白が16777215
、赤が16711680
,緑が65280
といったように数字をぱっと見ただけでは何の色なのかの判断が難しく感じます。
以下に10進数と2進数、16進数でそれぞれがどんな値になるのかを記載しておきます(16進数などで桁が6桁になっていないものは、カラーコードなどでは0が左側に設定された値が該当します。例えばff
という値であればカラーコード上の0000ff
と一致します)。
10進数、2進数、16進数の対応をまとめると以下のような表になります。
10進数 | 2進数 | 16進数 |
---|---|---|
1 | 1 | 1 |
2 | 10 | 2 |
3 | 11 | 3 |
4 | 100 | 4 |
5 | 101 | 5 |
6 | 110 | 6 |
7 | 111 | 7 |
10 | 1010 | a |
15 | 1111 | f |
16 | 10000 | 10 |
17 | 10001 | 11 |
これらの変換もformat関数で行うことができます。
まずは10進数を2進数に変換した文字列を取得する処理を書いていきます。2進数に変換するには第二引数に'b'
と指定します。2進数が英語でbinary codeやbinary numberなどと呼ばれるので、binaryの頭文字のbが2進数への変換の指定で使われます。
10進数の3を2進数の11の文字列へと変換するサンプル :
print(format(3, 'b'))
コード実行結果の出力内容:
11
10進数の15を2進数の1111の文字列へと変換するサンプル :
print(format(15, 'b'))
コード実行結果の出力内容:
1111
続いて10進数を16進数に変換した文字列を取得する処理について触れていきます。16進数に変換するには第二引数に'x'
と指定します。16進数が英語でhexadecimal numberやhexadecimal digit、もしくは略してhexなどになります。hexの読みの一部を取ってxが16進数の指定に使われるようになっています。
10進数の10を16進数のaの文字列へと変換するサンプル :
print(format(10, 'x'))
コード実行結果の出力内容:
a
10進数の17を16進数の11の文字列に変換するサンプル :
print(format(17, 'x'))
コード実行結果の出力内容:
11
今度は逆に2進数や16進数の値を10進数に変換したい場合を考えてみます。その場合第一引数に2進数や16進数の値を指定する必要がありますが、Python上で2進数や16進数の値はどうやって表現するのでしょう?
まずは2進数ですが、Pythonで扱うには0b
と先頭に付けた後に2進数の値を記述します。111
という2進数の値を扱いたい場合には0b111
といった形で表現します。
また、10進数に変換する場合には第二引数に'd'
を指定します。10進数が英語でdicimal numberとかdecimal digitなどと呼ばれるので、10進数を指定する場合にはdicimalの頭文字を取ってdを引数に指定します。
2進数の111を10進数の7の文字列に変換するサンプル :
print(format(0b111, 'd'))
コード実行結果の出力内容:
7
最後に16進数を10進数に変換する処理を考えます。16進数をPythonで扱うには0x
という値を先頭につけて表現します。ffffff
という値であれば0xffffff
といったように記述します。
第二引数は同様に'd'
を指定します。
16進数のffffffを10進数の16777215に変換するサンプル :
print(format(0xffffff, 'd'))
コード実行結果の出力内容:
16777215
変数などが特定の型かどうかを調べる : isinstance関数
ある変数などの値の型が文字列なのか?整数なのか?もしくは他のなんらかの型なのか?といったことを調べたい場合にはisinstance関数を使います。この関数を使うことによって、値が〇〇の型であればこの処理を、××の型であれば別の処理をといったようなプログラムの制御が可能になります。
名前の由来ですが、なんらかの型で生成された値のことをインスタンス(instance)と言います。例えば5
という値であれば整数のintの型から作られた値なので整数のインスタンスとなります。
「対象の値はこの型のインスタンスである」という意味を英語を絡めて考えると「対象の値 is この型の instance」という感じになるので、isinstanceという関数名になっています。
第一引数にはチェックしたい変数などを指定し、第二引数には型を指定します。
たとえばnameという変数が文字列かどうかを調べるには第二引数にstrを指定する形で以下のように書きます。結果は真偽値(bool)でTrueかFalseで返却されます。値が指定した型の場合にはTrue、そうではない場合はFalseになります。
name = 'タマ'
result = isinstance(name, str)
print(result)
コード実行結果の出力内容:
True
なお、第二引数の型に関しては複数の型をタプルで指定することもできます。その場合、「タプル内のいずれかの型」に該当した場合にTrueが返却され、それ以外ではFalseが返却されます。例えば整数(int)もしくは浮動小数点数(float)どちらかに該当するかを確認するには(int, float)
といったように第二引数に指定します。
第一引数が整数の場合にTrueになるサンプル :
print(isinstance(100, (int, float)))
コード実行結果の出力内容:
True
第一引数が浮動小数点数の場合にTrueになるサンプル :
print(isinstance(20.35, (int, float)))
コード実行結果の出力内容:
True
第一引数が文字列の場合に、intでもfloatでもないのでFalseになるサンプル :
print(isinstance('タマ', (int, float)))
コード実行結果の出力内容:
False
その他にも、特定の型を継承したインスタンスに対してもisinstanceではTrueになるといった性質もあるのですが、その辺りは後々のクラスの章で詳しく触れていきます。
インスタンスの型を取得する : type関数
ここまででも何度か出てきたtype関数に関しても触れていきます。type関数は第一引数になんらかのインスタンスを指定すると対象の型が返却されます。整数の値を指定すればintが、文字列の値を指定すればstrが返却されるといった具合です。
整数を引数に指定してintが返却されている例 :
print(type(100))
コード実行結果の出力内容:
<class 'int'>
文字列を引数に指定してstrが返却されている例 :
print(type('猫'))
コード実行結果の出力内容:
<class 'str'>
isinstance関数と違ってこちらは具体的な型の情報が取れるため、print関数などと組み合わせて良く使ったりします。たとえばisinstance関数で「特定の型の値かどうか」チェックして、もし異なる時に「では何の型の値なのだろう?」といった時に使ったりします。
また、型の値が取得できるのでisinstanceでやるような「この値は〇〇の型かどうか」といった判定の真偽値を取得することも一応はできます(==
という書き方は左辺と右辺が一致したらTrue、一致しなければFalseを返却するという書き方です。後々の条件分岐の章で詳しく触れます)。
is_int = type(100) == int
print(is_int)
コード実行結果の出力内容:
True
ただし、こういった書き方はPythonのコーディング規約のPEP8では非推奨で、isinstanceを使うようにと定められています。
オブジェクトの型の比較は、型を直接比較するかわりに、常に isinstance() を使うようにすべきです。
Python コードのスタイルガイド
理由はいくつかあります。一例としていくつか触れていきます。
まずは比較だけをするのであればisinstanceの方が記述が少しだけ煩雑では無いという点があります。isinstance関数を使う場合には関数を1つ呼び出すだけで対応することができます。
2つ目の理由として、isinstanceのセクションでも触れましたがisinstanceは値が特定の型を継承していた型であっても対象に含めるという特徴があります。継承云々に関しては後々で触れますが、ここでは家系図的なものを想像してみてください。継承と呼ばれる機能を使うと、親の特徴を受け継いだ型を作ることができます。
isinstance関数では型に先祖の人を指定することで、「〇〇一家かどうか」といったような判定になります(実際にはプログラムなので「文字列ファミリーかどうか」といったような判定になります)。
一方でtype関数は「特定の個人かどうか」といった判定になります。
古いPythonバージョンの話なので皆さんの使っているPythonでは関係ないですが、Python2.7などの古いPythonでは文字列がstrだけでなく、basestringという先祖に当たる型が存在し、その子供としてstrの型やunicodeという型なども存在していました。
このように特定の要素(例えば文字列)で複数の型が存在すると、「文字列かどうか」という判定をしたい時にtype関数だと大変です。「str型かどうか」もしくは「unicode型かどうか」といったように、似ている型がたくさんあるほどチェックが大変になります。
そこで、isinstance関数で家系図の上の方のご先祖様を指定するだけで「文字列ファミリーかどうか」といった判定が簡単にできるというのもisinstanceが推奨されるメリットの一つです。
なお、Pythonの現在のバージョンでは文字列の型はstrに統一されているので文字列ではこういった複数の型で悩まされることはありません。ただし他の型ではそういったことが発生しますし、皆さん自身で特定の型(クラス)を後々の章で作っていきますが、そうすると今回触れたようなケースが必要になる場合が発生してきます。
3つ目の理由として、自然言語(普通の英語の文法)に近いというメリットも挙げられます。Python界隈では自然言語に近いコードが好まれます。コードの意味が英語の文章を読むのと近い形で理解できると、コードの理解が簡単になるためです。
例えば、後々の条件分岐の章で詳しくは触れますが、「もし変数がNoneであれば」というコードをPythonで書くとif variable is None:
といった書き方になります。プログラムでありながら英語を読むのに近い形でコードを書くことができます。
isinstanceの場合はそこまでは自然言語に近いとは言えませんが、isinstanceを使って「もし文字列ならば」といったコードを書く場合はif isinstance(variable, str):
といったコードになります。if type(variable) == str:
といったコードよりも個人的には少し自然言語に近い・・・とも感じられます。
全ての内容がTrueならTrueを返却する : all関数
リストやタプルなどで、格納されている値が全て真偽値(bool)のTrueになっているかどうかを判定するにはall関数を使います。「全て(all)がTrueなら」といった判定なのでallという関数名になっています。
例えば1つ1つなんらかのチェックをして結果の真偽値をリストに加えていって、最後に全体がTrueになっているのかそうではないのかといった判定に使います。
使い方はシンプルで、第一引数に真偽値を格納したリストやタプルを指定するだけです。
リストの値が全てTrueなのでTrueが返却されるサンプル :
all_values_are_true = all([True, True, True, True])
print(all_values_are_true)
コード実行結果の出力内容:
True
リストの中にFalseが含まれているためFalseが返却されるサンプル :
all_values_are_true = all([True, True, False, True])
print(all_values_are_true)
コード実行結果の出力内容:
False
1つでもTrueが含まれていたらTrueを返却する : any関数
内容はほぼall関数と似たような内容ですが、any関数はリストの中身にどれか1つでもTrueが含まれていればTrueを返却します。「それらのうちのいずれか」という英語を考えるとany of themなどになりますが、そういった意味合いに由来してany関数となっています。
使い方もall関数と同じで、真偽値を格納したリストやタプルを第一引数に指定します。
1つでもTrueがリストに含まれているのでTrueが返却されるサンプル :
any_values_are_true = any([True, False, False, False])
print(any_values_are_true)
コード実行結果の出力内容:
True
1もTrueがリストに含まれていないのでFalseが返却されるサンプル :
any_values_are_true = any([False, False, False, False])
print(any_values_are_true)
コード実行結果の出力内容:
False
ビルトインの名前の上書きには注意しよう
ここまで見てきた通り、ビルトインの関数はsumやmaxといったように一般的で且つ短い関数の名前が色々使われています。
そのため、うっかりそれらを変数名などに使ってしまうと関数が上書きされてしまいます。例えば以下のコードのように「合計」の値を算出してその変数の名前をsumとしたとします。
sum = 150 + 200
このコード自体はエラーなどは発生しません。しかしsumという名前が整数の変数に上書きされてしまうため、ビルトインのsum関数が使えなくなってしまいます。
試しに実行してみると以下のようにエラーになります。
sum = 150 + 200
print(sum())
TypeError: 'int' object is not callable
sumがビルトイン関数ではなく整数の変数になってしまっているため、「整数のオブジェクトは呼び出せ(実行でき)ません」という内容のエラーメッセージになります。
このようにビルトインの関数の名前は変数名などで利用可能ですが、上書きしてしまうとそのビルトイン関数が使えなくなったり、他の方がコードを編集するときに「ビルトイン関数を使ったつもりが変数に上書きされていた」といったようなケースが発生して事故や不具合の元になってしまうのでこの例のような上書きは基本的に極力避けましょう。
Jupyterであっても、もしくは他のプログラム用のテキストエディタであっても大半はビルトイン関数と通常の変数が見分けられるように文字の色が異なるものに変えられています(本書もカラー表示した場合、コード表示の部分はビルトイン関数の文字の色が恐らく変わっていると思います)。ビルトイン関数の関数名を全て覚えていなくても、変数を作った時に文字色が通常の変数の色ではなくなっていたら注意し、上書きなどをしていないか調べる等して対応していきましょう。
※一度上書きしてしまったものを元に戻したい場合には、Jupyterであれば最初の方の章で触れたノートブック自体をリセット(再起動)するのやり方を利用してください。
本章の演習問題 その1
[1]. 変数を作って、その内容を出力してみましょう。
[2]. +
の記号を使わずに、ビルトイン関数で5個の任意の数値の合計を計算してみましょう。
[3]. 5個の数値の中の最大値をビルトイン関数を使って取得してみましょう。
演習問題その1の答案例
[1]. 変数などのなんらかの内容を出力するにはprint関数を使います。
age = 25
print('今は', age, '歳です。')
コード実行結果の出力内容:
今は 25 歳です。
※なお、Jupyterの場合はセルの最終行などに変数を配置することで、print関数を省略しても変数の中身が確認できます。
[2]. 数値を格納したリストやタプルなどをsum関数の引数に指定することで、それらの合計を計算することができます。
list_value = [120, 335.3, 221, 890, 1002]
summed_val = sum(list_value)
print(summed_val)
コード実行結果の出力内容:
2568.3
[3]. 数値を格納したリストやタプルなどをmax関数の引数に指定することで、その中で一番大きな値を取得することができます。
list_value = [120, 335.3, 221, 890, 1002]
max_value = max(list_value)
print(max_value)
コード実行結果の出力内容:
1002
本章の演習問題 その2
[1]. 5個の数値の中から最小値をビルトイン関数を使って取得してみましょう。
[2]. -5
の絶対値をビルトイン関数を使って取得してみましょう。
[3]. 100.45
という数値を小数点以下第一位まで表示する形に偶数丸めをビルトイン関数を使って計算し、100.5
という値を取得してみましょう。
演習問題その2の答案例
[1]. 数値を格納したリストやタプルなどをmin関数の引数に指定することで、その中で一番小さな値を取得することができます。
list_value = [120, 335.3, 221, 890, 1002]
min_value = min(list_value)
print(min_value)
コード実行結果の出力内容:
120
[2]. 数値の絶対値を取得する場合にはabs関数を使います。変数などで値が正か負か不明な時などにシンプルに使えて便利です。
abs_value = abs(-5)
print(abs_value)
コード実行結果の出力内容:
5
[3]. 偶数丸めを行うにはround関数を使い、小数点以下第一位までを表示するには第二引数に1と指定します。
rounded_value = round(100.45, 1)
print(rounded_value)
コード実行結果の出力内容:
100.5
本章の演習問題 その3
[1]. [1, 3, 6, 1, 5, 7, 9]
というリストの値の件数をビルトインの関数を使って取得してみましょう。
[2]. [1, 3, 6, 1, 5, 7, 9]
というリストの値を昇順(値の小さい順)でソートしたリストをビルトイン関数を使って取得してみましょう。
[3]. [1, 3, 6, 1, 5, 7, 9]
というリストの値を降順(値の大きい順)でソートしたリストをビルトイン関数を使って取得してみましょう。
演習問題その3の答案例
[1]. リストなどの値の件数を取得するにはlen関数を使います。
list_length = len([1, 3, 6, 1, 5, 7, 9])
print(list_length)
コード実行結果の出力内容:
7
[2]. 昇順でソートされたリストを取得するにはsorted関数を使います。
sorted_list = sorted([1, 3, 6, 1, 5, 7, 9])
print(sorted_list)
コード実行結果の出力内容:
[1, 1, 3, 5, 6, 7, 9]
[3]. 降順でソートされたリストを取得するにはsorted関数で昇順ソートした値に対してさらにreversed関数を反映します。また、その値をさらにlistでキャストと呼ばれる変換処理を挟みます。
sorted_list = sorted([1, 3, 6, 1, 5, 7, 9])
reversed_list = list(reversed(sorted_list))
print(reversed_list)
コード実行結果の出力内容:
[9, 7, 6, 5, 3, 1, 1]
本章の演習問題 その4
[1]. 以下の変数が文字列かどうかの真偽値をビルトイン関数を使って取得してみてください。
cat_name = 'タマ'
[2]. 以下の変数の型をビルトイン関数を使って取得してみてください。
price = 200
演習問題その4の答案例
[1]. 変数などが特定の型のインスタンスかどうかの真偽値を取得するにはisinstance関数を使います。第一引数に対象のインスタンス、第二引数に型(今回は文字列なのでstr)を指定します。
cat_name = 'タマ'
is_str = isinstance(cat_name, str)
print(is_str)
コード実行結果の出力内容:
True
[2]. 変数の型を取得するにはtype関数を使います。
price = 200
price_type = type(price)
print(price_type)
コード実行結果の出力内容:
<class 'int'>
章のまとめ
- Pythonに最初から入っていてすぐに使える関数のことをPythonのビルトイン関数と言います。
- 引数の内容を出力するにはprint関数を使います。
- 数値を格納したリストなどの合計値を計算するにはsum関数を使います。
- 数値を格納したリストなどの最大値を取得するにはmax関数、最小値を取得するにはmin関数を使います。
- 数値の絶対値を取得するにはabs関数を使います。
- 偶数への丸め(四捨五入に近い処理)を計算するにはround関数を使います。
- リストやタプルなどの値の件数を取得するにはlen関数を使います。
- リストなどの値を昇順にソートしたリストを取得するにはsorted関数を使います。
- リストの値を逆順にしたものを取得するにはreversed関数を使います。返却値はリストではないので、リストとして扱いたい場合にはキャストを挟む必要がある点には注意してください。
- 数値や文字列を特定のフォーマットに加工した文字列を取得するにはformat関数を使用します。
- 変数などが特定の型かどうかを調べるにisinstance関数を使います。
- 変数などの型を取得するにはtype関数を使います。
- 真偽値を格納したリストの値が全てTrueかどうかの判定をするにはall関数を使います。値のどれかがTrueかどうかの判定にはany関数を使います。
- ミスの元になるので、ビルトインの関数と同じ名前の変数などを作らないように注意しましょう。
Appendix
- python 組み込み関数を全て(69個)紹介する
- ビルトイン 【 built-in 】
- 組み込み関数
- Pythonで小数・整数を四捨五入するroundとDecimal.quantize
- 端数処理 - Wikipedia
- Why are reversed and sorted of different types in Python?
- Python format()
- Python, formatで書式変換(0埋め、指数表記、16進数など)
- What are the differences between type() and isinstance()?
- Pythonの組み込み関数all(), any()の使い方
- 「関数」と「メソッド」の違い
- Pythonで文字列・数値を右寄せ、中央寄せ、左寄せ