Pythonの関数を引数に渡す方法を初心者向けにやさしく解説!高階関数の使い方も完全ガイド
生徒
「Pythonでは、関数を他の関数に渡すことってできるんですか?」
先生
「はい、できます。関数を引数として渡すことで、柔軟なプログラムが書けるようになりますよ。これを『高階関数』といいます。」
生徒
「高階関数って初めて聞きました…。難しそうですが、何に使うんですか?」
先生
「では、具体例を使いながら、初心者の方でもわかりやすく説明していきましょう!」
1. Pythonで関数を引数に渡すってどういうこと?
Python(パイソン)では、数値や文字列と同じように、「関数(処理のまとまり)」そのものを変数に代入したり、他の関数の引数(材料)として渡したりすることができます。
プログラミング未経験の方には、「料理のレシピ」をイメージすると分かりやすいでしょう。友達に「カレーの作り方」という手順(関数)を渡し、友達はその手順に従って調理を実行する、という流れと同じです。
まずは、関数を変数に入れて、別の名前で呼び出す簡単な仕組みを見てみましょう。
# 「こんにちは」と表示するだけのシンプルな関数
def say_hello():
print("こんにちは!")
# 関数を「message」という変数に代入する(()は付けない)
message = say_hello
# 変数に()を付けると、元の関数が実行される
message()
このように、Pythonにおいて関数は「オブジェクト(データの一種)」として扱われます。この「関数をデータとして扱える」という性質があるからこそ、別の関数へ「処理の内容」を丸ごとプレゼントすることができるのです。
この仕組みを利用すると、一つの土台となるプログラムに対して、「あとから中身の処理だけを差し替える」といった柔軟なプログラミングが可能になります。
2. 高階関数(こうかいかんすう)とは?
高階関数(こうかいかんすう)とは、次のどちらかを満たす関数のことです。
- 関数を引数に取る
- 関数を戻り値として返す
少し難しく聞こえますが、たとえば以下のような例で使います。
3. 関数を引数に渡すシンプルな例
まずは簡単な例を見てみましょう。足し算をする関数を別の関数に渡して使うコードです。
def add(x, y):
return x + y
def calculator(func, a, b):
return func(a, b)
result = calculator(add, 5, 3)
print(result)
8
addという関数をcalculatorという関数に渡して使っています。
ポイント:関数名に () をつけずに渡すことで「関数そのもの」を渡しています。
4. 関数を引数として使う意味とは?
一見するとまわりくどく感じるかもしれませんが、「処理の中身を変えたいとき」にとても便利です。
たとえば、計算の種類(足し算・引き算・かけ算など)を変えたいときに、関数を引数にすることで、処理を柔軟に切り替えられます。
def subtract(x, y):
return x - y
print(calculator(add, 10, 4)) # 足し算
print(calculator(subtract, 10, 4)) # 引き算
14
6
このように、calculatorというひとつの関数だけで、いろいろな処理ができるようになります。
5. 関数は「データ」として扱える
Pythonでは、関数も数字や文字と同じように「データのひとつ」として扱えます。
つまり、変数に入れたり、リストにまとめたりすることができます。
def hello():
print("こんにちは")
say = hello
say() # 変数から関数を呼び出し
こんにちは
say = helloのように、関数名をそのまま変数に代入すると、あとでその変数から関数を実行できます。
6. 実生活にたとえると…
関数を引数に渡すという考え方は、一見むずかしく感じますが、日常生活に置きかえるとイメージしやすくなります。
たとえば、友達に「おにぎりの作り方」をメモで渡して、その友達が自分の材料で作るようなイメージです。
「レシピ(=関数)」を渡すことで、作り手(=関数を使う人)が自由に使えるようになります。
7. 実践:複数の関数を一括で呼び出す
関数をリストにして、一つずつ実行することもできます。たとえば、複数のあいさつを順番に表示するコードです。
def hello():
print("こんにちは")
def goodbye():
print("さようなら")
def thanks():
print("ありがとう")
greetings = [hello, goodbye, thanks]
for g in greetings:
g()
こんにちは
さようなら
ありがとう
このように、関数を「処理の部品」として組み合わせて使うことで、効率的なコードが書けるようになります。
8. よくある間違い:()をつけてしまう
関数を引数に渡すとき、()をつけてしまうと、関数を実行してその結果だけを渡してしまいます。
def greet():
print("こんにちは")
def wrapper(func):
func()
wrapper(greet) # 正しい
wrapper(greet()) # 間違い(先に実行されてしまう)
こんにちは
Traceback(エラー)
greet()と書くと、その場で実行されてしまうため、関数そのものを渡したい場合は () を付けないように注意しましょう。
9. なぜ初心者にも関数の引数渡しを学ぶべきか?
関数を引数に渡す技術は、Pythonの基礎であり、今後学ぶ「条件分岐」「ループ」「データ処理」などでも大切な考え方です。
また、よく使われるPythonの標準関数(map, filter, sortedなど)でも、高階関数の使い方が活かされています。
最初は難しく感じても、繰り返し例を見ることで自然と身につくので、まずはシンプルな例から慣れていきましょう。
まとめ
ここまで、Pythonにおける「関数を引数に渡す方法」や「高階関数」の基礎について詳しく解説してきました。 プログラミングを始めたばかりの頃は、「関数そのものを渡す」という概念が少し不思議に感じられるかもしれません。 しかし、Pythonにおいて関数は「第一級オブジェクト」と呼ばれ、数値や文字列と同じように自由に扱うことができる非常に強力なツールです。
高階関数を使いこなすための重要ポイント
関数を引数として渡す際の最大のメリットは、プログラムの「再利用性」と「柔軟性」が飛躍的に向上することです。 特定の処理(ロジック)を外から注入できるようにしておくことで、一つの関数を多目的に使い回すことが可能になります。 ここで、これまでに学んだ内容を振り返り、さらに理解を深めるための応用的なサンプルプログラムを見てみましょう。
応用:リストの各要素に独自の処理を適用する
実務でもよく使われる、リスト内のデータに対して「引数で渡された処理」を順番に適用する例を紹介します。 このように、データ(数値など)と処理(関数)を切り離して考えるのがPythonらしい書き方の第一歩です。
def apply_operation(numbers, func):
"""
数値のリストと関数を受け取り、各要素に関数を適用した新しいリストを返す
"""
result = []
for num in numbers:
result.append(func(num))
return result
def square(n):
"""2乗にする関数"""
return n * n
def double(n):
"""2倍にする関数"""
return n * 2
# データの準備
my_numbers = [1, 2, 3, 4, 5]
# 2乗する処理を渡す
squared_list = apply_operation(my_numbers, square)
print(f"2乗の結果: {squared_list}")
# 2倍する処理を渡す
doubled_list = apply_operation(my_numbers, double)
print(f"2倍の結果: {doubled_list}")
2乗の結果: [1, 4, 9, 16, 25]
2倍の結果: [2, 4, 6, 8, 10]
この apply_operation 関数は、中身で何をするかを知りません。
単に「受け取った関数 func を実行する」という役割に徹しています。
そのため、後から「3倍にする関数」や「10を加える関数」を作っても、apply_operation 自体を書き換える必要がないのです。
これが「柔軟な設計」の正体です。
エラーを未然に防ぐ!注意点の再確認
記事の中でも触れましたが、初心者が最も陥りやすい罠は、関数を渡す際に () を付けてしまうことです。
- func: 関数という「箱(レシピ)」そのものを指す。
- func(): 関数を実行して出てきた「中身(料理)」を指す。
引数として渡したいのは「箱」の方ですので、実行結果を渡してしまわないよう、コードを書くときは常に意識してみてください。
これからのステップアップ
関数を引数に取る感覚がつかめてきたら、次は lambda(ラムダ式)や、Pythonの標準機能である map(), filter() といった組み込み関数を学習してみるのがおすすめです。
これらはすべて、今回学んだ「関数を引数に渡す」仕組みの上に成り立っています。
最初は難しく感じても、実際に手を動かしてコードを書いていくうちに、「あ、こういうことか!」と腑に落ちる瞬間が必ずやってきます。
焦らず、一つひとつの挙動を楽しみながら学んでいきましょう。
生徒
先生、まとめのコードを見て「関数を部品として入れ替える」という意味がやっと分かってきました! apply_operation 関数を変えずに、動作だけを変えられるのはすごく便利ですね。
先生
その通りです!素晴らしい気づきですね。プログラムが大きくなればなるほど、一部を修正したときに他の場所が壊れないように作る必要があります。関数を引数で渡す設計は、そのための強力な武器になるんですよ。
生徒
でも、ついつい square() みたいにカッコを書いてしまいそうです……。これって、どうやって気をつければいいんでしょうか?
先生
慣れるまでは、「今、私は『処理を予約』しているのか、それとも『今すぐ実行』したいのか」を自分に問いかけてみるといいですよ。引数で渡すときは、後で使ってもらうための「予約」なので、カッコは不要なんです。
生徒
なるほど、「予約」ですね!イメージしやすいです。他にも map とか filter とかも関係していると聞きました。次はそれを使って、もっと短くてカッコいいコードを書いてみたいです!
先生
意欲的で素晴らしいですね。Pythonの標準ライブラリには、関数を引数に取る便利な機能がたくさんあります。今回学んだ基礎があれば、それらの公式ドキュメントを読んだときも、スッと理解できるようになっているはずですよ。一緒に頑張りましょう!
生徒
はい!ありがとうございました。まずは自分で「3倍にする関数」を自作して、さっきのプログラムに組み込んで動かしてみます!