/*THK Analytics用解析タグ*/

【Python】関数

2022年8月12日

 

関数とはある処理を簡単に利用できるための仕組みです。これを部品化などと言うこともあります
いままで利用してきたprintなどもpythonが用意した関数です。
関数はプログラマーが自由に作ることもできます。
この項では関数について学びます。

関数の定義

def 関数名 (引数1,引数2, ・・・):
return 戻り値

関数はある手続きをまとめたものになりますので、引数を渡して結果をもらうという形になります。
引数は複数渡すことが出来ます。
ただし引数や戻り値は無くても構いません。
また戻り値は一つのみです。

引数も戻り値もない関数

シンプルな関数の例です。
このプログラムでは画面にhello worldを表示する関数を定義しています。
この関数を3回呼び出すことでhello worldを3回画面に表示しています。

プログラムは行の先頭から実行されますが関数定義部分は飛ばされます。
同様にコメント行も飛ばされるので、最初に実行されるのは6行目のhello_world()になります。
これは関数なので関数hello_worldの中身を実行します。
終了すると次の行のhell_world()を実行というようにすべての行を実行します。

引数と戻り値がある関数

少し有意義な関数を作成しましょう。
例として直角3角形の斜辺を求めるプログラムを考えてみます。
斜辺の長さをcとすると3平方の定理よりa²+b²=c²となります。
これをpythonで作成します。

それでは見て見ましょう。
def syahen (hen_a, hen_b):で関数の名前と引数を定義しています。
ここでは直角三角形の直角を挟む2辺A,Bを受け取ります。
次の2行でA辺とB辺の2乗を求め次の行でその合計の平方根を求め戻り値としています。
return math.sqrt(hen_a2+hen_b2)

math.sqrt()は平方根を求める関数でmathモジュールに組み込まれた関数です。
この関数を利用するため先頭でimport mathを行っています。

タプルを利用した(見かけ上の)複数の戻り値

先ほど関数の戻り値は一つであると説明しました。
しかし複数の戻り値が必要なケースもあります。その場合はタプルを使って複数の戻り値を実現します。
タプルに関してはこちらで学習しましたね。
サンプルを見て解るようにreturnでタプルで指定すれば複数の戻り値を返すことができます。
受け取る際はサンプルのように変数をカンマで区切り複数の変数に代入するアンパック代入してください。

 

デフォルト引数

関数によっては引数に基本的には同じ値が入り、たまに異なる値が入るケースがあります。
このような場合、関数を呼び出し側で毎回同じ値をいれるのは面倒なのでデフォルト引数という仕組みが用意されています。
デフォルト引数をつかうことで呼び出し側で毎回引数をセットする手間が省けます。
尚、デフォルト引数より後ろに実引数を置くことは出来ません。

サンプルは名前の年齢を登録するプログラムです。年齢はデフォルトで20歳とします。
本サンプルではlで定義した辞書に名前と年齢を登録しています。
関数funcは引数に名前と年齢を受け取り辞書に追記します。
辞書に追記する関数はsetdefault()でpythonに登録されています。
引数の年齢を省略するとデフォルトの20が入ります

 

タプルを用いた可変長引数

タプルを引数に利用する事で可変長な引数を持つ関数を作成することが出来ます。
こちらは指定されたリストにデータをセットするサンプルです。
タプルを用いたサンプルはこのように*を付けて表現します。
一般的に*argsとします。
for d in args:行で引数の数だけループすることを指示しています。
引数の中身は(d)で取得出来ます。dは変数なので好きな変数名で構いません。
l.append関数でリストの最後に追記しています

ディクショナリを用いた可変長引数

ディクショナリを用いても可変長な引数を持つ関数を作成することが出来ます。
ディクショナリを利用する場合はこのように**を2つ付けて利用します。
一般的に*kwargsとします。
簡単にサンプルを説明します。
関数の一つ目の引数は対象のディクショナリ、第2引数が**kwargsで可変長引数になっています。
for key in kwargs:の行で引数の数だけループすることを指示しています。
keyにはディクショナリのキー、ここでは人名ですね、次のkwargs[key]でキーの値を指します。

 

今回はここまで。

お疲れ様でした。

python教室「総合目次」に戻る

Python教室

Posted by taka