なんだかGoodVibes

日々の勉強メモです。

【Python】関数の定義に関するいろいろ

こんにちは。
本日はPythonメモです。

概要

以前、関数の定義について以下の記事を記載しました。

【Python】関数を定義してみる - なんだかGoodVibes

関数の定義を行う際、
他にもいろいろなことができるので
本記事では関数定義でできることについて記載したいと思います。


位置引数

呼び出し側で指定した引数の値が
先頭から順に対応する位置の仮引数に代入されます。
これを位置引数と言います。

def my_print(level, title, message):
    print('level = ' + level)
    print('title = ' + title)
    print('message = ' + message)

my_print('Info', 'Greeting', 'Hello Bob!')

実行結果は以下です。

level = Info
title = Greeting
message = Hello Bob!


キーワード引数

仮引数の名前を指定して実引数を指定する方法をキーワード引数といいます。
この場合、引数の順番は異なっていても問題ありません。

def my_print(level, title, message):
    print('level = ' + level)
    print('title = ' + title)
    print('message = ' + message)

my_print(message='Hello Bob!', level='Info', title='Greeting')

実行結果は以下です。

level = Info
title = Greeting
message = Hello Bob!


デフォルト引数

関数内で使用するデフォルトの値を設定します。
デフォルト引数を指定する場合、
デフォルト値を指定していない引数の前でデフォルト値を設定するとエラーになるので注意です。

def my_print_default(level, title, message='Hello Bob!'):
    print('level = ' + level)
    print('title = ' + title)
    print('message = ' + message)

my_print_default(level='Info', title='Greeting')

実行結果は以下です。

level = Info
title = Greeting
message = Hello Bob!


可変個数の引数を設定する

引数の前に「*」をつけることで
その引数はタプルとして可変個数受け取ることができます。

def my_print_tuple(name, *tuple):
    print(name + ':', tuple)

my_print_tuple('color', 'red', 'blue', 'black')

実行結果は以下です。

color: ('red', 'blue', 'black')


引数を辞書として受け取る

引数の定義に「**」を使用すると、引数を1個の辞書として受け取ります。
引数の名前が辞書のキー、引数の値が辞書の値となります。

def my_print_dic(**dic):
    print(dic)

my_print_dic(red='Apple', green='Melon', yellow='Lemon')

実行結果は以下です。

{'red': 'Apple', 'green': 'Melon', 'yellow': 'Lemon'}


関数内関数

名前の通り、関数内に定義する関数のことです。

def my_calculate(num1, num2):
    def inner(n1, n2):
        return n1 + n2
    print(inner(num1, num2))

my_calculate(1, 2)

実行結果は以下です。

3

関数内関数は、クロージャとして機能します。
クロージャとは、関数の外側の変数を記憶することができる関数のことです。
以下のサンプルでは、create_messageによって
greetingの値を記憶したinnerが生成されます。

def create_message(greeting):
    def inner():
        return "Bob said. '%s'" % greeting
    return inner

m1 = create_message('Hello.')
m2 = create_message('How Are You.')

print(m1())
print(m2())

m1m2はそれぞれ自分が生成されたときに使われていた
greetingの値を記憶しています。

実行結果は以下です。

Bob said. 'Hello.'
Bob said. 'How Are You.'



以上です。