Pythonの関数型機能の起源
Pythonの初期のユーザーは、リスト操作や関数適用をより効率的に行う機能を求めていた。
これにより、map関数やlambda式が標準ライブラリに導入された。
当初は「lambda」という用語が採用されたが、その後の発展でいくつかの制約が生じた。
現在ではリスト内包表記などに取って代わられつつあるが、Pythonの機能開発に貢献している。
Pythonの設計者であるGuido van Rossum氏が、Pythonの「関数型プログラミング」の機能がどのようにして実装されたのかについて、その経緯を振り返る記事です。多くの人がPythonを関数型言語の影響を受けたものだと捉えがちですが、実際には、ユーザーからの要望に応える形で、LispやSchemeといった関数型言語に見られる機能が徐々にPythonに導入されたとのことです。
リスト操作のニーズと初期実装
Pythonの初期のユーザーの中には、リストに対する操作、特にリストの各要素に関数を適用して新しいリストを作成するような操作を効率的に行いたいという要望を持つ人が多くいました。LispやSchemeといった関数型言語では、このような操作が標準で提供されていますが、初期のPythonでは、ユーザー自身が関数を定義して実装する必要がありました。そこで、Pythonコミュニティは`map`関数のようなものを自作し、リスト操作を代替していました。しかし、この際に関数を別途定義する必要がある点が不満の声も上がったそうです。
匿名関数の導入と`lambda`演算子
Lispのような言語では、関数をその場で定義できるため、より簡潔なコードでリスト操作を実現できます。Pythonでも同様の機能を実現するために、匿名関数を作成するアイデアが検討され、Mark Lutz氏やTim Peters氏によってコードが提案されました。しかし、これらの方法はコード文字列を`exec`関数で処理する必要があり、複雑で非効率的でした。そこで、1994年1月に、標準ライブラリに`map`、`filter`、`reduce`関数が追加され、さらに匿名関数を作成するための`lambda`演算子が導入されました。これはPythonの初期段階において重要な貢献であり、現在ではAmrit Prem氏による貢献として記録されているとのことです。
`lambda`という名称と機能の限界
`lambda`という名称は、より適切な代替案が見つからなかったため、採用されたそうです。しかし、`lambda`は当初、匿名関数を定義するための構文的なツールとして意図されていました。そのため、他の関数型言語に慣れたユーザーは、Pythonの`lambda`の機能が限定的であると感じることがあります。特に、`lambda`式が囲んでいるスコープの変数を参照できないという制限は、多くの不満を引き起こしました。この制限は、Pythonの設計思想と密接に関連しているものの、関数型プログラミングの経験者にとっては理解しがたい点とのことです。
まとめ
Pythonの関数型プログラミングの機能は、ユーザーの要望に応える形で徐々に導入されてきた経緯があります。`lambda`演算子の導入は、その過程における重要なマイルストーンでしたが、その名称や機能には、現在も議論の余地があるようです。今回のGuido氏による振り返りは、Pythonの進化の過程を理解する上で貴重な示唆を与えてくれます。
原文の冒頭を表示(英語・3段落のみ)
I have never considered Python to be heavily influenced by functional languages, no matter what people say or think. I was much more familiar with imperative languages such as C and Algol 68 and although I had made functions first-class objects, I didn't view Python as a functional programming language. However, earlier on, it was clear that users wanted to do much more with lists and functions.
A common operation on lists was that of mapping a function to each of the elements of a list and creating a new list. For example:
def square(x):
※ 著作権に配慮し、引用は冒頭3段落までです。続きは元記事をご覧ください。