16. ユーザ定義関数

ユーザ定義関数とは

ビルトイン関数にない処理

ビルトイン関数で用意されていない処理は、オリジナルで関数を定義して処理しなければいけません。これをユーザ定義関数といいます。

数学の関数とプログラムの関数

プログラムでの関数は数学の関数のような考え方で、変数を与えて結果を返す機能のことをいいます。また、プログラムの関数のことをメソッドともいいます。

$$y = x + 5\tag{関数}$$ $$x = 2\tag{変数}$$ $$y = 7\tag{戻り値}$$

面倒な処理をまとめる

メソッドは複数の処理を1つにまとめて記述できるメリットがあります。関数を呼び出すだけで毎回決まった処理をするのに便利です。

引数と戻り値

メソッドは引数戻り値というキーワードがあり、引数はメソッドの入力値、戻り値は処理した結果を返す値のことです。

引数や戻り値は必須ではなく、メソッドによっては引数や戻り値を利用しない処理をすることもできます。

メソッド定義

メソッド定義の基本

引数で処理

$$y = x + 5$$

この式をメソッド名「calculate()」、引数「x」で定義します。

def calculate(x):
    y = x + 5
    return y

return で返す

引数「x」で計算した結果を、変数「y」に代入し、returnで返します。

メソッド名

メソッド定義は、任意のメソッド名に ( ) をつけ、メソッド名の前にキーワード defを記述します。

def メソッド名():

メソッドの処理

行末は : 区切り、その下にブロック領域として処理を記述します。

def メソッド名()
    # インデントしてブロック領域に処理
  • Pythonではブロック領域はインデントで判別します

「calculate」メソッドの定義は、つぎのようになります。

def calculate():
    # インデントしてブロック領域に処理

引数の定義

メソッドには入力値である引数を複数指定できます。引数の区切りは ,(カンマ)で区切ります。

def メソッド名(引数1, 引数2, ...):
    # インデントしてブロック領域に処理

calculate() の引数を「x」にした場合です。

function calculate(x)
    # インデントしてブロック領域に処理

メソッドの処理

引数を使った処理

ブロック領域に処理を記述します。引数「x」の計算結果を変数「y」に代入します。

functions.py
def calculate(x):
    y = x + 5

戻り値

プログラム処理した変数はreturnで戻り値「y」を返します。return しないと、メソッドを実行しても結果が返らないので注意してください。

functions.py
def calculate(x):
    y = x + 5
    # return で値を返す
    return y

メソッドの実行

メソッドを定義したらメソッド名で実行します。メソッドの実行結果は変数で取得できます。

結果 = メソッド名()

メソッドの実行確認

calculate() の実行結果を変数に代入して表示してみましょう。

functions.py
def calculate(x):
    y = x + 5
    return y

answer = calculate(2)
print(answer)
結果
7

データ型

メソッドの引数や戻り値にデータ型を指定できます。

def メソッド名(データ型:引数)->データ型:
    # 処理

calculate() の引数と戻り値はともにfloat型として定義します。

functions.py
def calculate(x:float)->float:
    y = x + 5
    return y

引数の応用

複数の引数

メソッドの引数は複数指定でき、それぞれの変数名を , (カンマ)で区切ります。

functions.py
def calculateTotalPrice(price:int, amount:int)->float:
    tax = 1.1
    totalPrice = price * amount * tax
    return totalPrice

totalPrice = calculateTotalPrice(200, 5)
print(totalPrice)
結果
1100

引数のデフォルト値

メソッド定義では、引数にデフォルト値を設定することができます。デフォルト値は引数に = で値を代入します。

def メソッド名(引数 = デフォルト値):
    # 処理

引数データの省略

デフォルト値を設定しておくと、メソッド実行で引数の値を省略でき、デフォルト値で処理されます。

メソッド名();

デフォルト値の定義とメソッド実行

購入価格のポイント数を計算するメソッドを定義します。ポイント還元率は「0.1」(10%)をデフォルトとします。

functions.py
def calculatePoint(price:int, rate:float=0.01)->float:
    point = price * rate
    return point

ポイント数を10%(デフォルト)と5%で計算します。

functions.py
# 引数を省略
point1 = calculatePoint(totalPrice)

# 引数を指定
point2 = calculatePoint(totalPrice, 0.05)

print(point1)
print(point2)
結果
11.0
55.0

静的解析ツール

VSCodeのプラグイン「PyLint」をインストールしておくと、プログラム内で警告が表示されます。

  • 厳密にチェックするため、警告が多くなる傾向があります

ローカル変数とスコープ

変数「x」「y」は関数の中で定義していますが、これをローカル変数といいます。 ローカル変数はメソッド外から参照できない(呼び出せない)ルールで、メソッドの { } 内の領域をスコープといいます。

def calculate(x:float)->float:
    # 関数のスコープ内のみ変数 x, y が有効
    y = x + 5;
}
# x, y は関数のスコープ外から参照できない
print(x)
print(y)

関数の応用

ユーザ定義関数を機能ごとに定義しておくと、引数を変えながら何度も再利用できプログラムしやすくなります。関数の応用として move() と moveMethod() を定義して実行してみましょう。

move() の定義と実行

move() はキャラクタ名と移動メッセージ表示します。キャラクタ名や移動方法の値はチェックしてメッセージを変えています。

def move(characterName:str, method:str = "")->str:
    message = ""
    if (method):
        message = f"{characterName}が{method}で移動しています"
    else:
        message = f"{characterName}は家にいます"
    return message

message = move("イヌ", "徒歩")
message = move("ネコ")
move("キリン", "自転車")
結果
イヌが徒歩で移動しています
ネコは家にいます
キリンが自転車で移動しています

演習

問題1

関数 say() を実行して「こんにちわ」と表示できるように、【あ】、【い】にコードをあてはめてプログラムを動かしてください。

【あ】 say(message:str)->str:
     return message

message =【い】("こんにちわ")
print(message)

問題2

以下の引数を代入して結果のように表示するように、関数を使ってプログラムしてみましょう。

引数
  • LINE
  • AU
  • Pay
結果
LINEPay
AUPay
PayPay

問題3

距離(km)と時間(h)を引数として、時速(km/h)を計算する関数を定義してみましょう。距離 250km、時間 4時間の速度(km/h)を表示してみましょう。

問題4

「グー」「チョキ」「パー」をランダムで表示するプログラムを関数を定義して作成してみましょう。

問題5

以下のプログラムを実行して結果がでるように、関数 auth() を定義してみましょう。

ADMIN_ID = "admin"
ADMIN_PW = "admin1234"

loginName = "admin"
password = ""
message1 = auth(login_name, password)

loginName = "user1"
password = "admin1234";
message2 = auth(login_name, password)

loginName = "admin"
password = "admin1234";
message3 = auth(login_name, password)

print(message1)
print(message2)
print(message3)
結果
パスワードを入力してください。
ログイン名またはパスワードが間違っています。
管理者ログイン成功!

Python超入門