関数という処理のまとまりを作るとコードが読みやすく、再利用しやすくなる。
目次
defで関数を作成しよう
関数という処理のまとまりをつくっておくと役立ちます。
- コードの処理内容が分かりやすい
- 関数として、特定のコードのまとまりを再利用しやすい
関数をうまく作るとコードを書くのも楽になり、バグも減ります。
関数については、初めのうちは関数をどこで調べても理解できませんでした。
わからない人は一つづつ確認していくと良いです。
細かい言葉は抜きで、実際の例を見るのが一番だと思います。
関数の例
関数なしの状態から徐々に関数っぽく変形していきます。
関数なしでプログラムを作成
まずは、関数なしで、aとbを足し合わせる簡単なプログラムを作成します。
#変数aとbを定義する
a=1
b=2
#処理内容
a+b
print(a+b) #表示するためにprintする
---実行結果---
3
aとbを足し合わせるだけの簡単なプログラムです。
1. 関数化する
まずは、ただまとまりを作るだけを意識して上記のプログラムを関数化します。
関数は「def 関数名(引数):」で定義します。
def add_function(): #defは関数作成します。 add_funcitonは関数名です。
a = 1
b = 2
a+b
print(a+b)
---実行結果----
何も出力されない。
add_function()という名前の関数を作成しましたが、このプログラムを実行しても先程とは違って何も出力されません。
(関数の処理内容はインデントを下げて記述して区別してます)
実行するには関数を呼び出す必要がある
上の内容は実は関数を定義しただけで、実行はしていません。
関数を実行するには関数を呼び出さなければなりません。
def add_function(): #defは関数作成します。 add_funcitonは関数名です。
a = 1
b = 2
a+b
print(a+b)
add_function() #関数名を書くことで関数が呼びだされて実行される
---実行結果----
3
これでグループ化できました。
def add_function():
a = 1
b = 2
a+b
print(a+b)
def sub_function():
a = 20
b = 10
a-b
print(a-b)
#関数を呼び出し
add_function()
sub_function()
add_function()
---実行結果---
3
10
3
上記のように関数名を書けば自由に再利用できます。
関数の出力を再利用したい
しかし、上記のadd_function()は3をprintするだけで汎用性がありません。
とりあえず、add_function()の3を使って別の計算につかいましょう。
add_functionを呼び出してafに代入、関数の値をprint(af)で確認して、afと100を足して103を得ようとします。
def add_function():
a = 1
b = 2
a+b
print(a+b)
af = add_function() #afにadd_function()の値を代入する
print(af)
print(af + 100)
---実行結果---
3 #af = add_function()
None #print(af)
TypeError: unsupported operand type(s) for +: 'NoneType' and 'int' # print(af + 100)
なんと計算できませんでした。print(af)・add_function()にはNoneで何も入っていないので100を足せないというエラーがでています。
関数の出力を再利用する 戻り値 returnを利用する
add_functionは3という数字を画面にうつしているだけで、add_function()の値としてはでていません。
関数の出力を再利用するには「戻り値」という形で出力をするように関数を定義します。
add_function_return()という関数を用意して、retrun 「実行結果値」を設定します。
def add_function():
a = 1
b = 2
a+b
print(a+b)
def add_function_return():
a = 1
b = 5
return a+b
af_noret = add_function() #前回の
af_ret = add_function_return() #returnで戻り値設定
print(af_noret)
print(af_ret)
---実行結果---
3 #af_noret = add_function() #実行するだけで画面に出てくる
None #print(af_noret)
6 #print(af_ret)
return a+bで戻り値を設定しているので、add_function_return()を実行したときにはretrun a+bの内容が保持されます。
add_function_retrun()の戻り値を使って計算してみましょう。
def add_function_return():
a = 1
b = 5
return a+b
af_ret = add_function_return() #関数を呼び出してaf_retに戻り値(retrun a+b)を代入
print(af_ret + 100) #6+100を計算表示
---実行結果---
106
関数らしく変数を入れ替える(引数を利用)
関数といえば
$$y(出力)=x^2+1(処理)$$
というように、代入するxの値によって様々な出力が得られるものです。
add_function_return()の例では、変数a, bの値が1,5で固定ではなく、関数呼び出し時にこちらで選べると便利です。
これには「引数」を使います。
関数の引数はdef function(引数1, 引数2,….)というように設定します。引数1や引数2はa, bなどとして、その関数内で利用します。
def add_function_return(a,b):
return a+b #関数中のa=10, b=20の関数定義は不要
print(add_function_return(100,200)) #関数呼び出しのときにa,bに入る値をいれる(100→a,200→b)
print(add_function_return())
---実行結果---
300
引数を使えば、単に6を出力するだけの関数から、aとbに任意の値の足し算をしてくれる関数に変わりました。
これだけだと微妙ですが、もっと複雑な関数なら使えそうですよね?
add_function_retrun関数は、引数を設定しなくてもaとbを関数外に定義すれば自由にa,bを入れ替えられます。
def add_function_return():
return a+b
a = 100
b= 200
print(add_function_return())
---実行結果---
300
実行結果は同じですね。
関数外で定義されたaとbは「グローバル変数」といってどこでも参照できる変数で、関数内のreturn a+bもグローバル変数を参照して100+200=300をしています。
グローバル変数はいろいろなところで設定すると意図しないところで代入されてバグの原因になるので、価をカエルようなものに使わないほうがよいでしょう。
def add_function_return(a,b):
return a+b
a = 10
b= 20
print(add_function_return(100,200))
---実行結果---
300
引数を設定しつつ、グローバル変数を設定している場合は引数指定が優先されます。
いろんな関数の例
#レストランの料金をリストとして定義する
price_list = [100,200,300,400,500]
#割り勘の人数
num = 4
#料金の合計を計算する関数
def calc_price(price_list):
'''料金の合計を計算する関数'''
total = 0
for price in price_list:
total += price
return total
#料金を割り勘する関数
def split_price(price_list, num):
total = calc_price(price_list)
return total / num
# 料金の平均を出す関数
def average_price(price_list):
total = calc_price(price_list)
return total / len(price_list)
print(calc_price(price_list)) #1
print(split_price(price_list, 4)) #2
print(average_price(price_list)) #3
#割り勘値段を合計の関数から算出
print(calc_price(price_list) / num) #4
#料金の平均を合計の関数から算出
print(calc_price(price_list) / len(price_list)) #5
#関数calc_priceの説明を確認する
help(calc_price) #6
実行結果
1500 #1
375.0 #2
300.0 #3
375.0 #4
300.0 #5
## 6 →
Help on function calc_price in module __main__:
calc_price(price_list)
料金の合計を計算する関数
## ←