operator_func、Callableとlambdaの実用例まとめ
特徴(ポイント)
- operator_func には「どんな計算をするか(処理内容)」を指定
- 関数側は引数の数と型だけ宣言し、実際の計算方法は呼び出し時にoperator_funcで自由に指定
- 例:入力:整数2つ、出力:整数1つ(
operator_func: Callable[[int, int], int]) - 型ヒント(Callable)とlambda式を組み合わせて、直感的かつ安全に記述
Pythonの魅力のひとつは、**「関数を引数として渡せる」**ことです。
これにより、計算処理を柔軟に切り替えたり、汎用的なコードを書くことができます。
本記事では、**型ヒント(Callable)と無名関数(lambda)**を使った実用例を紹介します。
1. 1変数の関数を渡すパターン
引数が1つの場合は、こう書きます。
pythonCopyEditfrom typing import Callable
def bar(operator_func: Callable[[int], int]) -> None:
print(operator_func(5)) # 例: 5×5=25
bar(lambda x: x * x) # 2乗(5→25)
bar(lambda x: abs(x)) # 絶対値(-3→3)
bar(lambda x: x + 100) # 100加算(7→107)
Callable[[int], int]…「int型の引数1つ → int型の戻り値」の関数を受け取るlambda x: ...で好きな処理をその場で渡せる
その他1変数例
pythonCopyEdit# 偶数ならそのまま、奇数なら+1
bar(lambda x: x if x % 2 == 0 else x + 1)
# 3の倍数か判定(1 or 0を返す)
bar(lambda x: 1 if x % 3 == 0 else 0)
2. 2変数の関数を渡すパターン
次は2つの整数を受け取る関数を引数にする例です。
pythonCopyEditdef foo(operator_func: Callable[[int, int], int]) -> None:
# operator_funcは「int, intを受け取りintを返す」関数
print(operator_func(3, 4)) # 例: 3×4=12
foo(lambda x, y: x * y) # 出力: 12
Callable[[int, int], int]…「int型の引数2つ → int型の戻り値」の関数を受け取るlambda x, y: ...で好きな計算をその場で渡せる
さまざまな2変数の例
pythonCopyEdit# 加算
foo(lambda x, y: x + y) # 3+4=7
# 差分
foo(lambda x, y: x - y) # 3-4=-1
# 最大値
foo(lambda x, y: max(x, y)) # 3と4の大きい方→4
# 最小値
foo(lambda x, y: min(x, y)) # 小さい方→3
# べき乗
foo(lambda x, y: x ** y) # 3の4乗→81
# 整数除算
foo(lambda x, y: x // y) # 3//4→0
3. 関数を自作して渡すパターン
lambda式だけでなく、普通にdefで定義した関数も渡せます。
pythonCopyEditdef multiply(x: int, y: int) -> int:
return x * y
foo(multiply) # 3*4=12
4. 応用:型ヒントで柔軟性アップ
- 戻り値をfloatにしたいなら
Callable[[int, int], float]などもOK。 - 引数がない関数なら
Callable[[], int]もOK。
まとめ
- Callableを使うと「どんな型の関数を渡せるか」を明示できて、型安全!
- lambdaと組み合わせれば、その場で好きな処理が渡せて便利!
- 1変数でも2変数でも、やりたい演算に合わせて使い分けよう
参考:今回紹介したサンプルのまとめ
pythonCopyEditfoo(lambda x, y: x + y) # 3+4=7
foo(lambda x, y: x - y) # 3-4=-1
foo(lambda x, y: max(x, y)) # 3と4の大きい方→4
bar(lambda x: x * x) # 5の2乗→25
bar(lambda x: abs(x)) # -3→3
「関数を引数で渡す」テクニックは、Pythonプログラミングの幅を大きく広げてくれます。ぜひいろんな演算で試してみてください!


コメント