【Python】レッスン3-04:関数を使いこなそう

記事内に商品プロモーションを含む場合があります

この記事で学べる知識:関数の受け渡し

この記事の練習問題で使用する知識:
レッスン1の知識、比較演算子と論理演算子条件分岐(if-else文)条件分岐(elif文)条件分岐(match文)繰り返し処理(for文)繰り返し処理(while文)繰り返しの制御、エラーメッセージ例外処理の基礎関数の定義と使用戻り値とデフォルト引数スコープの概念関数の受け渡し無名関数

<<前の問題 問題集Top 次の問題>>

Pythonの「関数の受け渡し」とは

この章ではPythonにおける「関数の受け渡し」の意味や使い方を学習します。必要ない方はここをクリックして練習問題へ飛びましょう。



Pythonでは関数を変数に代入したり、別の関数に引数として渡すことができます。この「関数の受け渡し」は非常に柔軟で強力な機能です。

関数を自由に操作できることでコードの再利用性が高まり、効率的なプログラムの作成が可能になります。

今回はこの関数の受け渡しについて詳しく解説します。

関数の受け渡しとは?

Pythonでは関数は「ファーストクラスオブジェクト」として扱われており、他のオブジェクトと同じように操作が可能です。

これによって関数を動的に操作したり、プログラムの中で柔軟に利用することができます。

関数を変数に代入する例

まずは関数を変数に代入して使う例を紹介します。

# 関数の定義
def greet(name):
    return f"Hello, {name}!"

# 関数を変数に代入
greet_var = greet

# 関数を呼び出す
print(greet_var("Alice"))

このコードを実行すると以下のように出力されます。

Hello, Alice!

この例では、greetという関数をgreet_varという変数に代入しています。

この時点で変数greet_varと関数greet()は同じものとなり、変数greet_varを使って挨拶の出力ができるようになります。

このように関数はそのまま変数に代入でき、変数経由で関数を呼び出すことが可能です。

関数を他の関数の引数にする例

次に、関数を他の関数の引数として渡す例を紹介します。

# 関数の定義
def greet(name):
    return f"Hello, {name}!"

# 関数を引数として渡す関数
def call_function(func, name):
    return func(name)

# 引数として関数を渡す
print(call_function(greet, "Bob"))

このコードを実行すると以下のように出力されます。

Hello, Bob!

この例では、greet関数をcall_functionという別の関数の引数として渡しています。

call_functionは受け取った関数をfuncとして実行し、結果を返します。このようにして、関数を引数として他の関数に渡すことで、動的に関数を実行することが可能になります。

関数名の後に()があるかないかの違い

関数を呼び出す際に、関数名の後に()がある場合とない場合で挙動が異なります。以下にその違いを説明します。

関数名の後に()がある場合

関数が実行され、結果が返されます。つまり()を使うことで、その場で関数を呼び出し、関数の戻り値を取得します。

# 関数を定義
def hello():
    return "Hello, World!"

# 関数を実行
print(hello())  # 実行結果: "Hello, World!"

上記の例では、hello()()によって関数が実行され、その戻り値である”Hello, World!”が出力されます。

関数名の後に()がない場合

関数自体がオブジェクトとして扱われ、実行されません。

関数を変数に代入したり、他の関数に引数として渡すためには、この状態であることが必要です。

# 関数を定義
def hello():
    return "Hello, World!"

# 関数自体を参照
func_var = hello  # helloを関数オブジェクトとして代入
print(func_var)   # 実行結果: <function hello at 0x...>

上記の例では、hello()が付いていないため関数は実行されず、そのオブジェクトがfunc_varに代入されます。

まとめ

関数の受け渡しは、Pythonの柔軟性を引き出す重要なテクニックです。

関数を変数に代入したり、他の関数に引数として渡すことで、プログラムの再利用性や可読性を向上させることができます。

また関数名の後に()があるかどうかで、関数の実行と関数の参照が異なる点に注意が必要です。これを理解することで、より効率的に関数を活用できるようになります。




練習問題3-4:関数の受け渡しを練習しよう

2つの数を加算する関数を変数に代入し、その変数を使って関数を呼び出してみましょう。

さらに、その関数を別の関数の引数として渡して、関数を動的に実行するようにしましょう。

この問題の要件

以下の要件に従ってコードを完成させてください。

  • add_numbersという名前で、2つの数を受け取って加算する関数を作成すること。
  • add_numbers関数をadd_varという変数に代入し、その変数を使って関数を呼び出し、2つの数を加算して結果を表示すること。
  • call_functionという関数を定義し、2つの数と関数を引数として受け取り、渡された関数を実行して結果を返すこと。
  • call_functionを使って、add_var関数を引数として渡し、2つの数を加算して結果を表示すること。

ただし、以下のような実行結果となるコードを書くこと。

*****↓↓正解コードの実行結果の例↓↓*****

30
40

この問題を解くヒント

1からコードを組み立てることが難しい場合は、以下のヒントを開いて参考にしましょう。

ヒント1【コードの構成を見る】

正解のコードは上から順に以下のような構成となっています。
(※下記の□はコード内のインデントを表しています)

1:関数add_numbersの定義
  □戻り値として、2つの数の和を返す
2:関数add_numbersをadd_varという変数に代入
3:変数add_varを使って2つの数を加算し、その結果を表示
4:関数call_functionの定義
  □引数として関数と2つの数を受け取り、その関数を実行して結果を返す
5:call_functionにadd_var関数と2つの数を引数として渡し、結果を表示

ヒント2【穴埋め問題にする】

以下のコードをコピーし、コメントに従ってコードを完成させて下さい。

# 関数の定義。2つの数の和を計算する関数
"""【穴埋め問題1】
ここに2つの引数を受け取り、それらの和を返す関数add_numbersを定義してください。
"""

# 関数を変数に代入する(関数の受け渡しの例)
"""【穴埋め問題2】
ここにadd_numbers関数をadd_varに代入するコードを書いてください。
"""

# 変数に代入された関数を使って2つの数を加算して表示
print(add_var(10, 20))  # 実行結果: 30

# 関数を引数として別の関数に渡す例
"""【穴埋め問題3】
ここに関数と2つの数を引数として受け取り、それを実行して結果を返す関数call_functionを定義してください。
"""

# call_functionを使って、add_var関数を引数として渡す
print(call_function(add_var, 15, 25))  # 実行結果: 40

 

このヒントを見てもまだ回答を導き出すのが難しいと感じる場合は、先に正解のコードと解説を見て内容を理解するようにしましょう。



解答例と解説

この問題の一つの正解例とそのコードの解説を以下に示します。

正解コードの例

例えば以下のようなプログラムが考えられます。

# 関数の定義。2つの数の和を計算する関数
def add_numbers(a, b):
    return a + b

# 関数を変数に代入する(関数の受け渡しの例)
add_var = add_numbers

# 変数に代入された関数を使って2つの数を加算して表示
print(add_var(10, 20))  # 実行結果: 30

# 関数を引数として別の関数に渡す例
def call_function(func, a, b):
    # 渡された関数を呼び出し、その結果を返す
    return func(a, b)

# call_functionを使って、add_var関数を引数として渡す
print(call_function(add_var, 15, 25))  # 実行結果: 40

正解コードの解説

このコードは、Pythonの「関数の受け渡し」を学ぶための基本的な例です。

コードをブロックごとに分けて説明していきます。

関数の定義

def add_numbers(a, b):
    return a + b

ここではadd_numbersという関数を定義しています。

この関数は2つの引数 ab を受け取り、それらの合計を計算して返します。

関数の受け渡し(変数に関数を代入)

add_var = add_numbers

ここではadd_numbersという関数をadd_varという変数に代入しています。

Pythonでは関数もオブジェクトとして扱われるため、関数そのものを変数に代入して、その変数を使って関数を呼び出すことができます。

この操作が「関数の受け渡し」の一例です。

変数に代入された関数の呼び出し

print(add_var(10, 20))  # 実行結果: 30

add_varadd_numbersを代入した変数なので、add_var(10, 20)という形で関数を呼び出せます。

これにより10 + 20が計算され、結果として30が出力されます。関数名を直接使わずに関数を呼び出せることが、関数を変数に代入する利点です。

関数を引数として渡す

def call_function(func, a, b):
    return func(a, b)

この関数 call_function は引数として関数 func と 2つの数値 ab を受け取ります。

関数を引数として渡すことで動的に関数を実行することができます。

この場合、func(a, b)が呼び出され、結果が返されます。

関数を引数に渡して実行

print(call_function(add_var, 15, 25))  # 実行結果: 40

ここではcall_functionに先ほど定義したadd_varを関数として渡しています。

このように関数を他の関数の引数に渡すことで、その関数を実行し、15 + 25が計算されて40が出力されます。

これが「関数の受け渡し」のもう一つの例です。

<<前の問題 問題集Top 次の問題>>

この記事への質問・コメント

この記事を作成するにあたりAIを活用しています。

問題ないことは確認していますが、もし間違いや表現の違和感などありましたら、ご指摘頂けると大変助かります。






    Python記事トップへ戻る
    トップページへ戻る