2020年3月21日土曜日

【ユーザー定義関数def】ユーザー定義関数の作り方

 同じ処理を何度も実行する場合などその処理をひとかたまりの関数にして呼び出すことで効率化できる。Pythonにあらかじめ用意されている組み込み関数に対して、このようなユーザーが作成する関数をユーザー定義関数という。


1. ユーザー定義関数の書式

 ユーザー定義関数の書式は以下の通り。def文で関数を定義し関数内の命令はブロックとしてインデントする。呼び出しは関数名()。

# 関数定義
def 関数名():
    命令
    
# 関数の呼び出し
関数名()


'OK'と表示する関数を呼び出す例。

# 関数okを定義
def ok():
    print('OK')
    
# 関数okを呼び出す
ok()

実行結果

OK


 関数を定義する前に呼び出そうとするとエラーとなる。関数定義def文は呼び出しより前に書く。

# 関数okを呼び出す
ok()

# 関数okを定義
def ok():
    print('OK')

実行結果

name 'ok' is not defined


2. 引数を渡す場合

 関数に値を渡しその値を関数内で使う場合は引数を使う。書式は以下の通り。引数1,2・・・を渡して関数内で使う。

# 関数定義
def 関数名(引数1,引数2・・・):
    命令
    
# 関数の呼び出し
関数名(引数1,引数2・・・)


関数に数字を2つ渡して合計を出力する例。13がa、2がbに渡され関数内で処理される。

def add_a_b(a, b):
    print(a + b)
    
add_a_b(13, 2)

実行結果

15


関数呼び出し文で与える引数は変数でも可。x,yがa,bに渡され関数で処理される。

def add_a_b(a, b):
    print(a + b)

x = 13
y = 2

add_a_b(x, y)

実行結果

15


 関数と呼び出し文の引数の数が一致しないとエラーとなる。次の例では関数は2つの引数を要求しているが呼び出し文では1つしか渡していないのでエラーになる。

def add_a_b(a, b):
    print(a + b)

x = 13
y = 2

add_a_b(x)

実行結果

add_a_b() missing 1 required positional argument: 'b'


3. 戻り値を取得する場合

関数内で処理した結果を戻り値として得る場合にはreturn文を使う。変数に関数を代入する形で関数の呼び出しと戻り値の取得を行う。

# 関数定義
def 関数名():
    命令
    return 戻り値
    
# 関数の呼び出し、戻り値の取得
変数 = 関数名()


 returnを使う例。関数内で処理した結果cを戻り値として変数zに代入する。

def add_a_b(a, b):
    c = a + b
    return c

z = add_a_b(13, 2)
print(z)

実行結果

15


 戻り値が複数ある場合、1つの変数zに代入するとタプルとなる。

def calc_a_b(a, b):
    c = a + b
    d = a * b
    e = '計算結果'
    return c, d, e
    
z = calc_a_b(13, 2)
print(z)

実行結果

(15, 26, '計算結果')


 任意の値を取り出すのであればインデックスを用いる。

def calc_a_b(a, b):
    c = a + b
    d = a * b
    e = '計算結果'
    return c, d, e
    
z = calc_a_b(13, 2)
print(z[1])

実行結果

26


 戻り値が複数の場合、戻り値の数だけの変数に代入すれば値を1つずつ取得できる。

def calc_a_b(a, b):
    c = a + b
    d = a * b
    e = '計算結果'
    return c, d, e
    
x,y,z = calc_a_b(13, 2)
print(z)

実行結果

'計算結果'


4. 無名関数lambda(ラムダ)

無名関数lambdaを用いることでdef文で関数を定義せずに関数を使うことが可能。書式は以下の通り

変数 = lambda 引数: 式

# 引数が複数の場合
変数 = lambda 引数1, 引数2・・・:式


 無名関数lambdaの例。引数eのd乗を実行する関数を変数sに代入し、sに引数v、wを与えて実行することで2の4乗の計算が実行される。

s = lambda d, e: d**e

v = 2
w = 4

print(s(v, w))

実行結果

16


 リストなどのイテラブルオブジェクト全体に対する処理をmap関数と組み合わせて実施する場合lambdaがよく使われる。map関数は

map(関数, イテラブルオブジェクト)

の書式を取り、「イテラブルオブジェクト全体に関数の処理をする」関数。map関数の引数にlambda関数を取ることでユーザー定義関数でイテラブルオブジェクトを処理することが可能。map関数はリストなどのイテラブルオブジェクトではなくイテレータを返すため、内容を見るためにはlist関数でリストに変換するなどする。

リストの各要素を二乗するlambdaの例。

prices = [2, 5, 12]
payment = map(lambda i: i * i, prices)
print(list(payment))

実行結果

[4, 25, 144]


5. リファレンス

Python チュートリアル > 4. その他の制御フローツール > 4.6. 関数を定義する
Python チュートリアル > 4. その他の制御フローツール > 4.7. 関数定義についてもう少し

使用バージョン:Python 3.7.0

0 件のコメント:

コメントを投稿