ラベル ユーザー定義関数 の投稿を表示しています。 すべての投稿を表示
ラベル ユーザー定義関数 の投稿を表示しています。 すべての投稿を表示

2021年9月12日日曜日

【ユーザー定義関数def】デフォルトの引数値とキーワード引数

 ユーザー定義関数defは呼び出しの際に引数を渡すが、必ず値を渡す必須の引数と、必要に応じて値を渡すオプショナルな引数がある。オプショナルな引数にはデフォルトの引数値を設定し、値が渡されなかった場合はデフォルト値を用いる。


1. デフォルトの引数値

 関数定義def文で引数に値を設定するとデフォルト値になる。関数呼び出し文で引数が指定されない場合はデフォルト値が用いられる。これを使うと必須の引数と必要に応じて設定するオプショナルな引数に分けることができる。
例として三角形の描画する関数'triangle'を定義する場合。頂点の位置x,yと辺の長さedgeを必須の引数として、def文で値を設定しない。線の色はcolor=(255, 255, 255)、つまり白をデフォルトの引数値として設定する。線の太さthickness=4として4pixelをデフォルトの引数値として設定する。
呼び出し文では必須の引数x, y, edgeのみ与え、color, thicknessについては値を渡さずデフォルトの引数値を用いる。

import cv2
import numpy as np
import math

img = np.zeros((300, 400, 3), np.uint8)

def triangle(x, y, edge, color=(255, 255, 255), thickness=3):
    pts = np.array([[x, y],
                    [int(x-edge), int(y+edge*math.sqrt(3))],
                    [int(x+edge), int(y+edge*math.sqrt(3))]])
    cv2.polylines(img, [pts], True, color, thickness, cv2.LINE_AA)
    
triangle(170, 50, 80)  
cv2.imwrite('triangle.png', img)

実行結果




関数'triangle'の引数color, thicknessを指定した場合。青の太さ12pixelで描画される。

import cv2
import numpy as np
import math

img = np.zeros((300, 400, 3), np.uint8)

def triangle(x, y, edge, color=(255, 255, 255), thickness=3):
    pts = np.array([[x, y],
                    [int(x-edge), int(y+edge*math.sqrt(3))],
                    [int(x+edge), int(y+edge*math.sqrt(3))]])
    cv2.polylines(img, [pts], True, color, thickness, cv2.LINE_AA)
    
triangle(170, 50, 80, (255, 0, 0), 12)  
cv2.imwrite('triangle.png', img)

実行結果




2. キーワード引数

 特定のオプション引数のみに値を設定する場合には関数定義文で用いられる引数名(キーワード)を用いて値を設定する。
三角形描画関数'triangle'において、オプション引数のうち線の太さを指定する引数'thickkness'のみに値を設定する場合。

import cv2
import numpy as np
import math

img = np.zeros((300, 400, 3), np.uint8)

def triangle(x, y, edge, color=(255, 255, 255), thickness=3):
    pts = np.array([[x, y],
                    [int(x-edge), int(y+edge*math.sqrt(3))],
                    [int(x+edge), int(y+edge*math.sqrt(3))]])
    cv2.polylines(img, [pts], True, color, thickness, cv2.LINE_AA)
    
triangle(170, 50, 80, thickness=18)  
cv2.imwrite('triangle.png', img)

実行結果




3. リファレンス

Python チュートリアル > 4. その他の制御フローツール > 4.7. 関数定義についてもう少し > 4.7.1. デフォルトの引数値
Python チュートリアル > 4. その他の制御フローツール > 4.7. 関数定義についてもう少し > 4.7.2. キーワード引数

使用バージョン:Python 3.8.8

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