1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Python `functools.partial`を使って関数をカリー化する

Posted at

はじめに

関数型プログラミングの世界では、「カリー化」という概念が重要な役割を果たしています。カリー化とは、複数の引数を取る関数を、単一の引数を取る関数のチェーンに変換する技術です。Pythonでは、functools.partialを使用してこの概念を実装できます。

image.png

カリー化とは?

カリー化は、数学者ハスケル・カリーにちなんで名付けられました。この技術を使うと、複数の引数を取る関数を、一連の単一引数関数に変換できます。

例えば、2つの引数を取る関数 f(x, y) があるとします。これをカリー化すると、f(x)(y) という形になります。つまり、最初の引数 x を与えると、新しい関数が返され、その関数に y を与えると最終的な結果が得られます。

functools.partialの紹介

Pythonのfunctoolsモジュールには、partialという便利な関数があります。これを使用すると、既存の関数の一部の引数を固定した新しい関数を作成できます。

functools.partialを使ったカリー化の実装

それでは、functools.partialを使って関数をカリー化する方法を見てみましょう。

from functools import partial

def add(x, y):
    return x + y

# add関数をカリー化
def curry_add(x):
    return partial(add, x)

# 使用例
add_5 = curry_add(5)
result = add_5(3)
print(result)  # 出力: 8

# さらに例を追加
add_10 = curry_add(10)
print(add_10(7))  # 出力: 17
print(curry_add(2)(3))  # 出力: 5

この例では、2つの引数を取るadd関数をカリー化しています。curry_add関数はxを引数に取り、partial(add, x)を返します。これにより、xが固定された新しい関数が生成されます。

より複雑な例

次に、3つの引数を取る関数をカリー化してみましょう。

from functools import partial

def multiply(x, y, z):
    return x * y * z

def curry_multiply(x):
    def curry_y(y):
        return partial(multiply, x, y)
    return curry_y

# 使用例
multiply_by_2 = curry_multiply(2)
multiply_by_2_and_3 = multiply_by_2(3)
result = multiply_by_2_and_3(4)
print(result)  # 出力: 24

# さらに例を追加
print(curry_multiply(2)(3)(4))  # 出力: 24
print(curry_multiply(5)(2)(3))  # 出力: 30

この例では、3つの引数を取るmultiply関数をカリー化しています。curry_multiply関数は2段階のカリー化を行い、各段階で1つずつ引数を固定していきます。

カリー化の利点

  1. 部分適用: 引数の一部を固定した新しい関数を簡単に作成できます。
  2. 柔軟性: 複雑な関数を、より単純で再利用可能な関数に分解できます。
  3. 関数合成: カリー化された関数は、他の関数と組み合わせやすくなります。

まとめ

image.png

functools.partialを使用したカリー化は、Pythonで関数型プログラミングの概念を実装する強力な方法です。これにより、コードの再利用性と柔軟性が向上し、より表現力豊かなプログラミングが可能になります。

カリー化は、特に複雑な関数を扱う際や、関数型プログラミングのパラダイムを活用したい場合に非常に有用です。Pythonのfunctools.partialを使いこなすことで、エレガントで効率的なコードを書くことができるでしょう。

参考情報

  1. Python公式ドキュメント - functools.partial

    • functools.partialの公式ドキュメントです。使用方法や詳細な説明が記載されています。
  2. PEP 309 -- Partial Function Application

    • Pythonで部分適用を実現するための提案書です。functools.partialの背景や設計思想について理解を深めることができます。
  3. The Python Standard Library - Functional Programming Modules

    • Pythonの関数型プログラミングモジュールに関する公式ドキュメントです。functools以外の関連モジュールについても学ぶことができます。
1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?