関数とは
ここまでPythonの様々な変数や制御文について学習してきました。変数と制御文だけで比較的複雑な処理を作成できるようになるのですが、処理が大きくなると様々な問題が出てきます。
- 同じ処理を何回も書く必要がある
- 処理がバラバラで読みづらい
こういった問題は関数を使用することで解決することができます。関数とは処理をひとつのブロックにまとめたもので、1回作れば何度も同じ処理を呼び出すことができます。また、一連の処理をまとまって記述することができるため可読性を向上させることができます。
関数の定義
それではPythonの関数を使ってみましょう。Pythonの関数の定義はdef文を使用します。
処理
def文の次の行からブロックが始まるため、一段落インデントをさげて処理内容を記述します。
def sample_function(x, y): z = x + y return z z = sample_function(1, 2) print(z)
単一のスクリプトの場合、上から処理が実行されるため、関数を呼び出す処理は、関数の後に記述してください。
例えば、以下のように関数の記述の前に呼び出し処理を実行すると、NameErrorが発生します。
z = sample_function(1, 2) print(z) def sample_function(x, y): z = x + y return z
実行すると、以下のエラーが発生します。
$ python sample.py Traceback (most recent call last): File "sample.py", line 2, in <module> z = sample_function(1, 2) NameError: name 'sample_function' is not defined
引数
引数の指定方法
関数を呼び出す際、pythonでは引数の指定方法が2つあります。
1つはオーソドックスに順番に指定する方法です。2つ目は、キーワード引数と呼ばれ、引数名=値の形式で引数の順序に関係なく指定することができます。
サンプルで確認してみましょう。
def sample_function(arg1, arg2): print(arg1, arg2) sample_function('a', 'b') # 順番に引数を指定する sample_function(arg1='c', arg2='d') # キーワードを指定する sample_function(arg2='e', arg1='f') # キーワードの場合は順番通りでなくてもよい
関数を3回呼び出しています。コード中のコメントで書いたとおり、キーワード引数の場合は順番どおりでなくても問題なく動くことが確認できます。
デフォルト引数
また、関数定義の引数にデフォルト値を設定すると、その引数を省略することが可能となります。
def sample_function(arg1, arg2='x', arg3='y'): print(arg1, arg2, arg3) sample_function('a', 'b', 'c') # 引数を全部していする sample_function('a', arg2='b') # 3番目を省略する sample_function('a') # 2,3番目を省略する
上のサンプルでは、デフォルト引数が設定された引数を省略して呼び出しています。
可変長引数
pythonの関数の柔軟な特徴として可変数引数が挙げられます。これは、関数定義で引数の数を任意に指定できる書き方のことです。
処理
引数のリストは引数シーケンスへ、キーワード引数が引数辞書に格納されます。この説明だけでは何のことかわからないと思いますので、サンプルで確認してみましょう。
まずはアスタリスク1つの引数シーケンスの説明からです。
def sample_function(arg1, *arg2): print(arg1, arg2) sample_function('a', 'b', 'c', 'd') # a ('b', 'c', 'd')が出力される
2番目以降に列挙した引数が可変長にタプルとして格納されていることが確認できます。
次はアスタリスク2つの引数辞書です。
def sample_function(arg1, **arg2): print(arg1, arg2) sample_function('a', key1='x', key2='y', key3='z') # a {'key1': 'x', 'key2': 'y', 'key3': 'z'}が出力される
キーワード引数が可変長に辞書として格納されていることが確認できます。
シーケンスと辞書を組み合わせても問題ありません。
def sample_function(arg1, *arg2, **arg3): print(arg1, arg2, arg3) sample_function('a', 'b', 'c', 'd', key1='x', key2='y', key3='z') # a ('b', 'c', 'd') {'key1': 'x', 'key2': 'y', 'key3': 'z'}が出力される
戻り値
戻り値を指定する場合はreturnを用います。なお、returnを使用しない場合はNoneが返される、ということも覚えておきましょう。
また、pythonでは複数の値をreturnで指定することができます。呼び出し側はカンマ区切りで返却値を取得します。
def sample_function1(): """ 数値を返却 """ return 1 def sample_function2(): """ 何も返さない関数 """ pass def sample_function3(): """ 複数の値を返却 """ return 3, 'b' x = sample_function1() print(x) # 1が出力される y = sample_function2() print(y) # Noneが出力される a, b = sample_function3() print(a, b) # 3 bが出力される