もっと便利に使いやすく

【Python関数応用】条件によって呼び出す関数を変える処理

2023年9月19日追記しました

Pythonのプログラミングにおいて、関数を定義し呼び出すことは日常茶飯事です。

このとき、

条件によって呼び出す関数が変えられたらいいな

そう思ったことはありませんか?

特定の条件に基づいて異なる関数を呼び出すことができれば、さまざまな処理が可能になります。

この記事は、Pythonの関数の定義や呼び出し方が分かれば理解できるように説明しています。

段階的な説明をしていますが、ちょっと難しい…と感じる方は、ぜひご質問ください。

なお、本記事の内容を動画でも解説しています。

関数はオブジェクトである

いきなり難しいことを見出しにしてしまいました。

要は「数値や文字列などの値と同じように、関数も変数に代入したり関数の引数に渡すことができるよ」という意味です。

理屈は分からなくても、まずはやってみましょう!

簡単な例題を用意しました。

def hello():
    print('こんにちは')

hello()

このスクリプトは、helloという関数を用意し、関数が呼び出されたら「こんにちは」と出力するものです。

hello()と記述することで、helloという関数を呼び出す(実行)しています。

実行結果は「こんにちは」となりますね。

hello関数を呼び出す実行結果

それでは、関数を実行する方法として、「関数名を変数に代入して実行する」というやり方を見てみましょう。

def hello():
    print('こんにちは')

msg = hello
msg()

msgという変数に、helloという名前を代入します。
そのmsg変数に()を付けると、hello()関数が実行されるので、実行結果は「こんにちは」となりますね。

関数名を変数に代入して実行する図

これによって、「関数もオブジェクトである」といえます。

(この辺の理屈が分からなければ、読み飛ばして次に進んでください。)

なお、hello関数の他にgoodbye関数も定義し、msg変数にgoodbyeを代入すると、goodbye関数が呼び出されるということも確認しましょう。

def hello():
    print('こんにちは')

def goodbye():
    print('さようなら')

msg = goodbye
msg()

実行結果は「さようなら」となりますね。

複数の関数を定義し、そのうちのいずれの関数でも変数に代入できるという図

ここまでのまとめ。

ここまでのまとめ図

条件によって呼び出す関数を変える処理の基本

では、基本的なスクリプトの書き方について解説します。

基本的な関数の定義

まずは、条件によって呼び出す2つの関数を定義しましょう。

def func_a():
    return "関数Aが呼ばれました"

def func_b():
    return "関数Bが呼ばれました"

定義した関数は、それぞれ異なるメッセージを返すだけのシンプルなものです。

if文を使用して関数を選択

次に、if文を使用して、条件に基づいて上記の関数を選択する方法を見ていきましょう。

def choose_function(condition):
    if condition:
        return func_a()
    else:
        return func_b()

このchoose_functionは、引数としてconditionを受け取り、その値が真であればfunc_aを、偽であればfunc_bを呼び出します。

実際に関数を呼び出す

以下のコードで、choose_functionを使って関数を呼び出してみましょう。

result = choose_function(True)
print(result)

この例では、conditionTrueを渡しているため、”関数Aが呼ばれました”というメッセージが出力されます。

ここまでのコードをまとめると、以下のようになります。

def func_a():
    return "関数Aが呼ばれました"

def func_b():
    return "関数Bが呼ばれました"

def choose_function(condition):
    if condition:
        return func_a()
    else:
        return func_b()

result = choose_function(True)
print(result)

以上が、条件によって呼び出す関数を変える処理の基本です。

使い方の実例「条件による関数の切り替え」

理屈が分かったところで、これがどのような場面で使われるのか?実例を交えて確認しましょう。

条件によって呼び出す関数を変えたいことってありませんか?

私の環境では良くあるのですが、そのような場合にとても役に立ちます。

以下の例で確認しましょう。

年齢と数量を入力するスクリプトを用意します。

入力された年齢によって、単価を変えて計算する関数を定義します。

計算結果は、「年齢による単価」×「数量」として出力されるようにします。

# 年齢によって計算する関数を変える

def calc(func, count):
    price = func(count)
    return price

def child(count):
    return 400 * count

def adult(count):
    return 1200 * count

age = int(input('年齢を入れてください'))
count = int(input('購入する数を入れてください'))

if age < 20:
    price = calc(child, count)
else:
    price = calc(adult, count)

print(f'{age}歳の人は、{price}円です')

この例では、20歳未満の場合「単価400円」で計算します。

20歳以上の場合「1200円」として計算しています。

inputメソッドで年齢を入力してもらいますが、その値をif文で判定し、20歳未満ならcalc関数に渡す引数を「child」と「count」にしています。

年齢が20歳以上ならcalc関数に渡す引数を「adult」と「count」にしています。

calc関数では、受け取った引数のうち一つ目の引数を「func」に入れることで、該当する関数を実行しています。

つまり、20歳未満ならchild関数が呼び出されます。

また、20歳以上ならadult関数が呼び出されるという仕組みです。

条件によって呼び出す関数を使い分けるスクリプト例

その他の実例

上記の例では、必ずしも関数にする必要はありません。

単にif文で処理を分岐させる方が良いでしょう。

しかし、実際にはそれぞれの分岐ごとに「処理することが多い」という場合、呼び出す関数を変えるという処理が有効です。

その一例をご紹介します。

def admin_action():
    return "管理者専用のアクションを実行しました。"

def user_action():
    return "一般ユーザーのアクションを実行しました。"

def execute_action(role):
    if role == "admin":
        return admin_action()
    elif role == "user":
        return user_action()
    else:
        return "無効なロールです。"

result = execute_action("admin")
print(result)

上の例では、ユーザーの権限によってできること(処理)を変えたい場合に有効な処理です。

admin(管理者)なら管理者しかできないことをadmin_action関数内に記述すれば良いです。

user(一般)ならできることを制限してuser_action関数内に記述すれば良いです。

パスワードが有効か、無効か、によっても処理内容を分岐させても良いでしょう。

単純に「管理者ページ」か「ユーザーページ」に遷移させるだけなら、if文で分岐させても良いですが、それぞれの権限によって処理内容が複雑に発生する場合には関数を分けて呼び出すことが有効です。

まとめ

今回は「条件によって呼び出す関数を変える処理」について解説しました。

でも、簡単な処理であれば、わざわざ関数にして呼び出さなくても良いですよね。

if文で条件によって処理を変えれば良いだけです。
(下図は比較です)

必ずしも関数にする必要はないことを説明する図

今日の内容では、関数内の処理が1行だけなので「わざわざ関数にしなくていいじゃん」と思われたかもしれません。

しかし、ここで紹介したかったことは、「条件によって呼び出す関数を切り替えることができる!」ということです。

状況により使い分けられると良いですね。

それでは、ステキなPythonライフを!

ABOUT ME
papa3
某教育機関で現役の講師をしながら、ブログとYouTubeでプログラミングの情報を発信しています。個人でもウェブアプリケーション開発と運営をしながら本業収入<副業を目指しています!

COMMENT

メールアドレスが公開されることはありません。 が付いている欄は必須項目です