関数の呼び出し

目的

Pythonでは既に用意されている関数を呼び出して処理を行い,様々な関数を組み合わせて複雑な処理を行うことが多い.ここでは,関数の呼び出し方を学ぶ.

説明

関数の呼び出し方

ここまでの説明でも既に以下の関数を使用した.

  • type
  • print
  • enumerate
  • zip
  • arange
  • int

これらはPythonで標準で使用できる組み込み(built-in)関数と呼ばれるものである.

値を受け取り,処理をする関数(引数)

例えばprint関数では,関数名の後ろに小括弧で囲んで文字列データや数値データを指定すると,指定した文字列データや数値データが表示された.

このように,関数では小括弧で囲んで情報を指定して処理を行う.小括弧で囲んだものを関数の引数と呼ぶ.

値を受け取り,値を返す関数(返り値)

print関数のように情報を受け取って表示するだけの関数もあるが,多くの関数では処理した結果の値を返す.例えば文字列データを受け取って文字列の長さを返す関数lenを使用する場合には以下のように記述し,処理した結果の値(関数の返り値)を代入文で受け取る.

複数の値を受け取る関数(位置引数)

また,round関数は数値データを受け取り,丸めた(四捨五入した)値を返す関数である.

round関数では,以下のようにカンマで区切って引数を2つ指定することができる.第1引数は丸めたい値であり,第2引数は丸める際の小数点以下の桁数である.このように,複数の引数を指定できる関数もある.

この例では引数の意味が指定する順番によって変わる.このような方法で指定した引数を位置引数と呼ぶ.

複数の値を受け取る関数(キーワード引数)

round関数では以下のように,キーワードnumberとndigitsを使用して引数を指定することができる.位置引数とは異なり,引数の順番を変えても意味は同じである.また,位置引数とキーワード引数は併用できるので,一部を位置引数で,一部をキーワード引数で指定することもできる.

print関数も複数の値を引数として指定できる.指定した複数の値は半角スペースで区切られて表示される.区切り文字列(separator)を変更するには,sepキーワードで引数として指定すればよい.また,print関数では最後(end)に改行を行うが,最後に表示する文字列を変更するには,endキーワードで引数として指定すればよい.Pythonでは改行を「\n」で,タブを「\t」で表す.例えば,区切り文字列を半角スペースからカンマやタブ,最後に表示する文字列を改行からピリオドと改行にするは以下のように記述すればよい.

複数の値を返す関数

関数の中には処理した結果が複数の値となるものがある.このような関数はリストやタプルとして複数の値を返す.例えば,divmod関数は割られる値と割る値を引数で指定すると,整数の除算を行い,商と余りをタプルとして返す.例えば,秒数を分と秒に変換する処理は以下のように書け,返り値がタプルとして取得できていることがわかる.

また,以下のように返り値のタプルをアンパックして受け取ることもできる.

組み込み関数の例

ここでは,よく使用される組み込み関数をいくつか紹介する.

型変換する関数(int関数・float関数・str関数・bool関数)

int型,float型,str型,bool型の値を他の型に変換するには,int関数,float関数,str関数,bool関数を使用すればよい.例えば,int型の値をfloat型やstr型に変換するには以下のように記述すればよい.

また,float型の値をint型やstr型に変換するには以下のようにすればよい.

リスト・タプル・集合・辞書を作成する関数(list関数・tuple関数・set関数・dict関数)

リスト・タプル・集合・辞書のオブジェクトを作るには,list関数・tuple関数・set関数・dict関数を使用することができる.例えば,空のリスト・タプル・集合・辞書のオブジェクトを作るには,以下のようにすればよい.

また,リスト・タプル・集合のオブジェクト同士で変換する際にも,list関数・tuple関数・set関数を使用することができる.例えば,リストからタプルや集合に変換するには以下のようにすればよく,

タプルからリストや集合に変換するには以下のようにすればよい.

また,集合からリストやタプルに変換するには以下のようにすればよい.

リスト・タプル・集合から辞書に変換するにはdict関数を使用することができる.辞書はキーと値の組となるため,以下のようにキーのタプルと値のリストにzip関数とdict関数を適用することで辞書に変換することができる.また,キーと値の2つの要素をもつタプルのリストにdict関数を適用することで辞書に変換することもできる.さらに,dict関数のキーワード引数の名前としてキーを,キーワード引数の値として値を指定することで辞書オブジェクトを作成することもできる.

イテラブルなオブジェクトに使用できる関数(len関数・max関数・min関数・sorted関数・sum関数)

数値データからなるイテラブルなオブジェクトにlen関数を適用すると要素数が,max関数を適用すると最大値が,min関数を適用すると最小値が,sum関数を適用すると要素の値の和が,sorted関数を適用すると昇順にソートされたオブジェクトが取得できる.また,sorted関数のキーワード引数reverseにTrueを指定すると,降順にソートされたオブジェクトが取得できる.例えば,テストの点数のリストに各関数を適用すると,以下のようになる.

また,テストの点数の辞書の値に各関数を適用しても同様の結果が得られる.

文字列データからなるイテラブルなオブジェクトにlen関数を適用すると要素数が,max関数を適用すると文字数が最大の要素が,min関数を適用すると文字数が最小の要素が,sorted関数を適用するとアルファベット順にソートされたオブジェクトが取得できる.また,sorted関数のキーワード引数reverseにTrueを指定すると,アルファベット順の逆順にソートされたオブジェクトが取得できる.例えば,テストの科目名のリストに各関数を適用すると,以下のようになる.

また,テストの点数の辞書のキー(科目名)に各関数を適用しても同様の結果が得られる.

複雑な処理の記述例

Pythonでは,あるデータに対して関数を使って処理を行い,処理結果に名前をつけ,それをまた別の関数により処理し,処理結果に名前をつける,といったことを繰り返し,複雑な処理を記述する.ここまでは数値データや文字列データに対して関数を使用する方法を説明したが,その他のデータに対しても記述の仕方は同じである.ここでは,画像データに対しても同様の方法で処理が記述できることを確認する.

画像の読み込みと表示

Pythonファイルと同じ場所にある「input_image.png」という名前の画像データを読み込み,ウィンドウに表示するには以下のように記述すればよい.

標準で用意されている組み込み関数以外の関数を使用するには,モジュールをインポートする必要がある(モジュールについては後の単元で説明する).ここではOpenCVを使用して画像処理を行うため,1行目でcv2モジュールをインポートしている.3行目で読み込む画像ファイル名に名前をつけ,4行目で読み込んでいる.cv2モジュールのimread関数は,引数に画像ファイル名を指定すると,読み込んだ画像データを返す.ここでは読み込んだ画像データに「image」という名前をつけている.5行目で画像データをウィンドウに表示している.cv2モジュールのimshow関数では,第1引数にウィンドウのタイトルバーに表示する文字列を,第2引数に表示する画像データを指定する.通常のプログラムは処理が終わると終了してしまうが,画像を表示するプログラムは画像を表示し続ける必要がある.6行目は何かキーが押されるまで処理を待つ関数である.7行目はウィンドウを全て消去するための関数である.

このプログラムを実行すると,タイトルバーに「input image」と表示されたウィンドウが現れ,ウィンドウに読み込んだ画像が表示される.ウィンドウをアクティブにした状態で何かキーを押すと,ウィンドウが消え,プログラムが終了する.

グレースケールに変換

読み込んだ画像に対して簡単な画像処理をしてみよう.読み込んだ画像がカラー画像だとしてグレースケール画像に変換する処理は以下のように書ける.

5行目でカラー画像からグレースケール画像への変換を行っている.cv2モジュールのcvtColor関数は,第1引数に画像データを,第2引数に変換の種類を指定すると,変換された画像データを返す.ここでは第2引数に「cv2.COLOR_BGR2GRAY」と指定することで,カラー画像(BGR)からグレースケール画像(GRAY)に変換している.また,変換したグレースケール画像に「gray_image」という名前をつけている.7行目でその画像をウィンドウに表示している.

このプログラムを実行すると,カラー画像に加えて,タイトルバーに「gray image」と表示されたウィンドウにグレースケール画像が表示される.

解像度を変更

グレースケール画像に変換した画像の解像度を変更するには,以下のようにすればよい.

6行目で解像度を変更している.cv2モジュールのresize関数は,第1引数に画像データを,dsizeキーワード引数に解像度をタプルで指定すると,指定した解像度の画像データを返す.ここは解像度320☓240の画像に変換し,「resized_gray_image」という名前をつけている.9行目でその画像をウィンドウに表示している.

このプログラムを実行すると,カラー画像,グレースケール画像に加えて,「reseized gray image」と表示されたウィンドウに解像度が変わったグレースケール画像が表示される.

画像の保存

処理した結果の画像をファイルに保存するには,以下のようにすればよい.

4,5行目で保存するファイル名を指定している.OpenCVではファイル名の拡張子により,画像ファイルのフォーマットを指定することができる.ここでは,グレースケール画像をpng形式,解像度を変換したグレースケール画像をjpg形式で保存することにしている.12,13行目のように,cv2モジュールのimwrite関数を使用すると,第1引数で指定した名前のファイルに第2引数で指定した画像データを書き出すことができる.

このプログラムを実行すると,「gray_image.png」と「resized_gray_image.jpg」という名前のファイルができ,それぞれに処理後の画像が保存される.

このように,Pythonでは様々なデータを関数によって処理することができ,処理した結果に名前をつけ,次の処理を関数によって行う,ということを繰り返し,複雑な処理を記述する.記述の仕方はどのようなデータに対しても同様なので,関数の呼び出し方のルールを身に着けることが重要となる.

課題

課題0

42.195kmを走るのに7571秒かかった.これは何時間何分何秒かを求めよ.

課題1

1円の貯金が1年に1.5倍になるとして,50年後に貯金額は約何億円になるか,概数で近似せよ.

課題2

身長・体重・右目の視力・左目の視力からなるリストから,辞書を作成せよ.

課題3

身長・体重・右目の視力・左目の視力からなる辞書から,リストを作成せよ.

課題4

英語・数学・国語・理科・社会の試験の点数からなるリストを作成し,最も良かった教科の点数と最も悪かった教科の点数を求めよ.

課題5

英語・数学・国語・理科・社会の試験の点数からなるリストを作成し,5教科の平均点を求めよ.

課題6

5人分の学籍番号のタプルを作成し,昇順に並べ替えよ.

課題7

自分で用意した画像データを読み込み,表示せよ.

課題8

自分で用意した画像データを読み込み,解像度を変更して表示せよ.

課題9

自分で用意したカラー画像データを読み込み,解像度を変更し,グレースケールに変更して表示し,ファイルに書き出せ.