関数の定義

目的

関数の呼び出しでは,既に用意されている関数を呼び出して使用する方法を学んだ.ここでは,自分で関数を作り,作った関数を呼び出して使用する方法を学ぶ.

説明

関数の定義

引数がない関数

まず,引数がなく,値を返さない関数を定義してみよう.関数を定義する(define)にはdefの後に関数名を,その後ろに小括弧を書き,その後ろにコロンを書く.その後にインデントを下げて処理内容を書けばよい.

例えば以下のように,「introduce_myself」という名前の関数を定義し,処理内容は「My name is Tanaka Taro.」と表示するだけとする.次に,関数を呼び出すと,「My name is Tanaka Taro.」と表示される.

引数が1つの関数

引数が1つある関数を定義するには,関数名の後の小括弧中に引数を表す変数を書き,その変数を使用して処理内容を記述すればよい.例えば引数で受け取った名前を表示する関数の定義は以下のようになり,引数で名前を指定して関数を呼び出すと,指定した名前を含んだ自己紹介文が表示される.

引数が複数の関数

引数が複数ある関数を定義するには,関数名の後の小括弧中にカンマで区切って引数を表す変数を書き,その変数を使用して処理内容を記述すればよい.例えば,名前と年齢を引数で指定し,名前と年齢を含んだ自己紹介文を表示する関数の定義と呼び出しは以下のようになる.

値を返す関数

値を返す関数を定義するには,処理した結果の値をreturn文によって返せば(returnすれば)よい.例えば,身長と体重を引数で受け取り,BMIを求め,求めたBMIを返す関数の定義と呼び出しは以下のようになる.

複数の値を返す関数

複数の値を返す関数を定義するには,処理した結果の値をカンマで区切ってタプルとしてreturn文で返せばよい.例えば,身長と体重を引数で受け取り,BMIと標準体重を求め,結果を返す関数の定義と呼び出しは以下のようになる.返り値はタプルのアンパックを使用して取得すればよい.

デフォルト引数値の指定

Pythonでは関数の引数にデフォルト値を設定できる.引数のデフォルト値は,関数名の後の小括弧中の引数に代入文を使用して指定すればよい.例えば,身長と体重のデフォルト値に日本人20代前半男性の平均身長171.5cmと平均体重65.5kgを指定すると以下のようになり,関数を呼び出す際の引数の指定を省略することができる.

デフォルト引数値は一部の引数にだけ設定できるが,その場合,デフォルト値が設定されていない引数を前に,デフォルト値が設定されている引数を後に記述する必要がある.これは,前の引数ほど重要度が高く必ず指定しなければならず,後の引数ほど重要度が低く省略可能である,と考えればよいだろう.例えば以下のように前の引数にだけデフォルト値を設定すると,

以下のようなエラーが表示される.

関数の定義と呼び出しの順

ここまでの例では,関数の定義を先に,関数の呼び出しを後に書いた.例えば以下のように順番を入れ替えて実行すると

以下のようなエラーが表示される.この場合,1行目が実行されるときに,まだbmi_standard_weight関数が定義されていないために,「’bmi_standard_weight’ is not defined」という状態になってしまう.

例えば,以下のように,適当な名前(例ではmainという名前)の関数を先に定義し,その関数中からbmi_standard_weight関数を呼び出し,その後でbmi_standard_weight関数を定義し,最後にmain関数を呼び出してみよう.

関数の定義部分は関数が呼び出されるまで実行されないので,この場合最初に実行されるのは13行目のmain関数の呼び出しである.このとき,既にmain関数は定義されているため,問題なくmain関数が実行される.次に,main関数中でbmi_standard_weight関数が呼び出されるが,これも既に定義されているため,問題なく実行される.このようにmain関数の呼び出しを最後に記述すれば,main関数の定義とbmi_standard_weight関数の定義の順はどちらが先でも問題ない.関数の定義の順を意識したくない場合はこのような書き方をするとよいだろう.

課題

課題0

名前と年齢と趣味を受け取り,自己紹介文を表示する関数を定義し,呼び出せ.

課題1

名前と年齢と趣味と血液型からなるリストを受け取り,自己紹介文を表示する関数を定義し,呼び出せ.

課題2

西暦を受け取り,うるう年であるかどうかを返す関数を定義し,呼び出せ.

課題3

ある人の年齢と別の人の年齢を受け取り,年齢差を返す関数を定義し,呼び出せ.

課題4

秒数を受け取り,時間と分と秒に変換し,変換した時間・分・秒を返す関数を定義し,呼び出せ.

課題5

右目の視力と左目の視力を受け取り,左右の視力の平均と左右の視力の差を求め,平均と差を返す関数を定義し,呼び出せ.

課題6

英語・数学・国語の試験の点数からなるリストを受け取り,最も良かった教科の点数と最も悪かった教科の点数を返す関数を定義し,呼び出せ.

課題7

英語・数学・国語の試験の点数からなる辞書を受け取り,最も良かった教科の点数と最も悪かった教科の点数と平均点を返す関数を定義し,呼び出せ.

課題8

英語・数学・国語の試験の点数(100点満点)からなるリストを受け取り,20点満点に換算した点数をリストとして返す関数を定義し,呼び出せ.

課題9

英語・数学・国語の試験の点数(100点満点)からなる辞書を受け取り,50点満点に換算した点数を辞書として返す関数を定義し,呼び出せ.