32.関数

プログラミング言語では
一定の処理を一まとめにしたものを「関数」と読んでいます。

関数の作り方

def 関数名(引数):
    return 戻り値

関数を定義して見ましょう。

In [1]:
# 関数の定義
def abc(aaa=0):
    print(aaa)
    return 1

# 関数の実行
print(abc())
print(abc(2))
0
1
2
1

引数の変数名の後にイコールをつけて値を代入しておくと、
引数が指定されなかった場合に、初期値として使われる値になります。

戻り値は関数の実行結果です。
変数に格納したりする事もできます。

In [2]:
# 関数の実行結果が変数に格納される
a = abc(3)
print(a)
3
1

戻り値や引数は設定しなくても関数として定義できます。

In [3]:
def defg():
    print('dd')

defg()
dd

特に値を戻す必要がなければ
return 無しで戻り値をなくしても大丈夫です。

関数の結果を用いて次に処理を行いたい場合は
return を付けて値を戻すようにします。

引数は何個でもつけることができますが、
あまり多すぎると使うときに困ると思います。

なので5-6個くらいに納めた方が良いかと思います。
それ以上になるようであれば処理を改めたほうが良いでしょう。

関数を定義するときに引数を定義したら、
使うときもその引数の分だけ
指定することが必要になりますが、
関数によっては引数で処理を
変えたりしたいというニーズもあったりします。

そんな時は引数に  **をつけると
引数をタプル型や辞書型で受け取ることができます。

In [4]:
def aaa1(**karg):
    print(karg)

# 関数の引数に辞書型を渡す
aaa1(aws=[1,2])
{'aws': [1, 2]}
In [5]:
def aaa2(arg1, arg2, arg3):
    print(arg1)
    print(arg2)
    print(arg3)
    
lis = ['one', 'two', 'three']
# 関数の実行にリストをタプル型にして渡す。
aaa2(*lis)
one
two
three

ただしこの場合は引数の数と合わなければなりません。

In [6]:
lis2 = ['one', 'two', 'three','four']
# 引数の数と渡す数が合わ無いとエラーになる。
aaa2(*lis2)
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-6-545521add84a> in <module>()
      1 lis2 = ['one', 'two', 'three','four']
      2 # 引数の数と渡す数が合わ無いとエラーになる。
----> 3 aaa2(*lis2)

TypeError: aaa2() takes 3 positional arguments but 4 were given

関数の使い方としては、複数行にまたがる処理が
2回以上行われる場合は、関数化していった方が
コードがスッキリして見やすく、
メンテナンスもしやすくなります。

同じような処理を2度書くくらいであれば、全体を見直して
簡略化、省力化ができる部分を書き直してゆく、という感じで
関数を作っていくのが良いと思います。

関数は別名メソッドとも読んでいます。
プログラミングでは必須になる概念のため
必ず覚えておいてください。