今まで見てきた関数はPython自体に元々ある関数(組み込み関数)でしたが、今回は自分で作る関数を見ていきます。
使用頻度の高い処理を関数としてあらかじめ定義することで、プログラムの重複コードを避けることができ、コードが短くなり、修正も簡単になります。
Pythonはの関数は、変数に代入できたり、引数にできたり、戻り値にできますので、関数を使いこなすことで、複雑なプログラムを書けるようになります。
関数を定義
def 関数名(仮引数):
何かの処理
return 変数か値を戻す
定義した関数を使う。
returnした戻り値を変数に格納します。
変数 = 関数名(実引数)
※引数(ひきすう)は二種類あって、仮引数とは関数定義に使用される引数のことで、実引数とは関数を使用するときに渡される引数のことです。
関数の例
例えばtestという名の関数を作ります。
1 2 3 4 5 6 7 8 |
def test(a,b): c = a + b return c # 実引数に5と3を入れてtest関数を呼び、戻り値を変数dに入れます d = test(5,3) # d をprint print(d) |
結果
8
引数とreturnがない場合。
1 2 3 4 5 6 |
# 例えばtest2という名の関数を作ります。 def test2(): print("こんにちは") # test2関数を呼び出します test2() |
結果
こんにちは
仮引数のデフォルト値
addという名の関数を作成。
仮引数bにはデフォルト値「10」を設定
1 2 3 4 5 6 7 8 9 |
def add(a, b=10): print(a+b) #実引数1つでadd関数を呼び出す #この10は仮引数 a に代入される add(10)#結果は20 #実引数2つでadd関数を呼び出す add(10,20)#結果は30 |
可変長引数
仮引数は「アスタリスク」をつけることで任意の個数の引数を受け取ることができます。
アスタリスク1つの場合(タプル型にして受ける)。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
# aは固定、*argsは数が不明 def func(a,*args): print(a) # タプル型になる print(args) # aに1、argsは空 func(1) # aに1、argsに2 func(1,2) # aに1、argsに2から10まで func(1,2,3,4,5,6,7,8,9,10) # これはエラー # func() |
結果
1
()
1
(2,)
1
(2, 3, 4, 5, 6, 7, 8, 9, 10)
アスタリスク2つの場合(辞書型にして受ける)。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
# aは固定、**argsは数が不明 def func(a,**args): print(a) # 辞書型になる print(args) # aに1、argsは空 func(1) # aに1、argsにキーワードつきで値を入れる func(1,b=2) # aに1、argsに2から10まで func(1,b=2,c=3,d=4,e=5,f=6,g=7,h=8,i=9,j=10) # これはエラー # func() |
結果
1
{}
1
{‘b’: 2}
1
{‘b’: 2, ‘c’: 3, ‘d’: 4, ‘e’: 5, ‘f’: 6, ‘g’: 7, ‘h’: 8, ‘i’: 9, ‘j’: 10}
複数個の値を返す
Pythonは複数同時代入ができるので、関数から複数の値を返し、それを受けることができます。
1 2 3 4 5 6 7 8 9 |
def func(x, y): a = x + y b = x - y return a,b,(a,b) a,b,c = func(5,2) print(a) print(b) print(c) |
結果
7
3
(7, 3)
関数を変数に代入
Pythonの関数は変数に入れられますので下のようなことができます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
# 関数を定義 def add(a,b): return a+b print(add(1,2)) # 変数aに代入 a = add print(a(3,4)) # 違う関数を定義 def func(a,b,c): # aは関数 return a(b,c) print(func(a,5,6)) |
結果
3
7
11
変数のスコープ
グローバル変数、ローカル変数の違いについて見ていきます。スコープとは変数が有効な範囲という意味です。
グローバル変数は、関数内からも見えるのですが、変更するには関数内で変数を global 宣言しないとできません。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 |
# グローバル変数 a = 100 # 関数1 def func1(): # グローバル変数aをそのまま使う場合 return a + 50 b = func1() print(b) # 関数2 def func2(): # 関数内でaを定義したのでaはローカル変数 a = 10 return a + 50 b = func2() print(b) # 関数3 def func3(): # グローバル変数aを変更したつもりだが、これはローカル変数を定義しただけ a = 120 func3() print(a) # 関数4 def func4(): # 関数内でグローバル変数を変更したい場合は global を使う global a a = 200 func4() print(a) |
結果
150
60
100
200
※グローバル変数にリストや辞書などを入れた場合は、global宣言しなくても要素の編集はできます。
バブルソート
Pythonには組み込みのソート関数とメソッドがあるので、自分でソート関数を作らなくてもよいのですが、勉強のために基本的なソートを考えてみます。
隣同士を比較して、左が大きければ交換という処理を繰り返して、最終的に小さい順に並べ替えるバブルソートのアルゴリズムです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
def bubble_sort(a): n = len(a) for i in range(n-1,0,-1): for j in range(i): print(f"{a[j]}と{a[j+1]}を比較") # 左の方が大きければ交換 if a[j] > a[j+1]: a[j],a[j+1] = a[j+1],a[j] print(f" 交換 {a}") else: print(f" 交換なし {a}") return a nums = [3,10,6,2] print(f"ソート前 {nums}") print(f"ソート後 {bubble_sort(nums)}") |
結果
ソート前 [3, 10, 6, 2]
3と10を比較
交換なし [3, 10, 6, 2]
10と6を比較
交換 [3, 6, 10, 2]
10と2を比較
交換 [3, 6, 2, 10]
3と6を比較
交換なし [3, 6, 2, 10]
6と2を比較
交換 [3, 2, 6, 10]
3と2を比較
交換 [2, 3, 6, 10]
ソート後 [2, 3, 6, 10]
3行目のrangeですが、第3引数に-1を指定しているので逆順になります。例えばrange(10,0,-1)なら[10, 9, 8, 7, 6, 5, 4, 3, 2, 1]となります。