3.関数について
3.関数について
関数は、インプットされた値をもとに、決められた処理を実行してくれるプログラムの部品である。プログラムをコーディングしていくと、入力された値のチェックや、毎回同じように行う必要がある計算式など、同じような処理を複数回実行する場合がある。
Pythonではdef文を用い関数を定義し、関数に渡す値のことを引数と呼び、関数から返ってくる値のことを戻り値と呼ぶ。
dsf
func(a,b): # 関数を定義
return a+b
# 関数の戻り値
print(func(1,3)) # 関数の呼び出しと引数
print(func(4,9)) # 関数の呼び出しと引数
実行結果
4
13
何度も繰り返す必要があるような処理を予め部品化し、何度も呼び出す形で利用することができれば便利である。関数をうまく使うことで、コード全体の「構造化」が図れ、効率的なプログラミングが可能となる。
引数や戻り値は必須ではなく、引数や戻り値が存在しない関数も存在する。def文は1つのブロックを構成する場合は、インデント(字下げ)をすべて合わせる必要がある。インデントを適切にしないと構文エラーになるか、思わぬ動きにつながり注意が必要である。またdef文では( )の後ろに:が必要となるので注意する。
Pythonの関数の命名ルールは、変数の命名ルールと基本的に同様である。関数の命名ルールは、①英語(大文字も小文字も可能)②数字(0~9)③_(アンダースコア)を使用する。ただし、関数の先頭に数字を用いるとエラー(SyntaxError: invalid syntax)となる。関数の引数と戻り値については、引数は関数に渡す値であり、関数へのインプット情報である。戻り値は関数から返される値であり、関数のアウトプット情報である。
関数プログラミング表現のバリアントを示す。
①
一般的な引数を渡す方法
def add_func(a,b):
return a + b
print(add_func(2,9)) #実行結果11
②
引数に渡す値を「引数名」で指定する方法
def add_func(a, b):
return a + b
answer =
add_func(b=9, a=2,)
print(answer) #実行結果11
③
複数の戻り値を設定する方法
戻り値を複数個指定することも可能で,(コンマ)で複数個の戻り値を指定する。ただし、def文の中における return は1つだけであり、戻り値はタプルで返される。
def calc_func(a, b):
return a+b, a-b , a*b , a/b
answer =
calc_func(2, 8,)
print(answer) #実行結果 (10, -6, 16, 0.25)
④
デフォルト引数を定義する方法
引数には、デフォルト値を設定することができ、引数に何も渡されなかった場合には、事前に定義することが可能である。つまり、次のコードのように、引数が指定されなかった場合には、デフォルトの引数が設定されており、デフォルト値を設定した引数には値を渡す必要がないことになる。さらに、値を渡さなくてもデフォルト値を設定しているため、構文エラーにはならない。
def func(name="スカイツリー"):
print(name)
func() #引数指定なしなので、デフォルトのスカイツリーが入る。
func("東京タワー") #引数に東京タワーを指定
実行結果
スカイツリー
東京タワー
なお、デフォルト引数とデフォルト値を持たない引数を同時に定義する場合には注意が必要。デフォルト引数は必ず最後の引数にする必要がある。
def func(height, name="Tokyo Tower"):
print(name, height)
func("333m")
#一部引数指定
func("634m","スカイツリー")
#引数にスカイツリーを指定
実行結果
Tokyo Tower
333m
スカイツリー 634m
*アスタリスク付き引数
関数を定義する際に引数を2つ指定した場合には、関数の実行時に必ず2つの引数を渡さなければならない。(4つの引数であれば引数を4つ渡さなければならない。)ただし、「引数」の先頭に * や ** を付与することで、引数には任意の数のパラメータを渡すことができるようになる。
この引数の数を任意に指定できる引数を「可変長引数」と呼び、Pythonでは慣例的に「*agrs」「**kwargs」として記述することになる。構文ルールとしては、引数の前に「*(アスタリスク)」を付けるだけで可変長引数であることを表現することができる。ただし、*を付けた引数が可変長引数であるということを分かりやすくするために *agrs や **kwargs と記述するのが慣例となっている。ただし、 *abc や **abc789 という任意の名称でも良いが、特にその名称に意味が無いような場合は *args や **kwargs の名称を用いるルールとなっている。
*argsのように、*(アスタリスク)を1つ付けた場合、複数の引数をタプルとして受け取る。
def
func1(*args):
print(args)
func1(1, 2,
3, 4, 5)
実行結果
(1, 2, 3,
4, 5)
"args"
は argument(日本語:引数) の複数形の略で、読み方は「アーグス」と読み。*args を普通の引数と同時に用いることも可能。
def
func2(number, name, *points):
print(number, name)
print(points)
func2(66,
'Yamaguchi', '10', '9' ,'7' ,'6' ,'8')
実行結果
66 Yamaguchi
('10', '9,
'7', '6', '8')
**kwargsのように引数の先頭に * を2つ付けた場合、複数の値を辞書(ディクショナリ)として受け取ることになる。
def func2(**points):
print(points)
func2(English='10',Math='9',Science='7',Social='6',Japanese='8')
実行結果
{'English':
'10', 'Math': '9', 'Science': '7', 'Social': '6', 'Japanese': '8'}
**kwargs を普通の引数と同時に用いることも可能で、読み方は、「クワーグス」または、「ケイダブル
アーグス」と読まれている。
def func2(number,
name, **points):
print(number, name)
print(points)
func2(66,'Yamaguchi',English='10',Math='9',Science='7',Social='6',Japanese='8')
実行結果
66 Yamaguchi
{'English':
'10', 'Math': '9', 'Science': '7', 'Social': '6', 'Japanese': '8'}