新しいアカウントで始めました。

身の回りの出来事や写真が中心です。

Pythonで関数の引数に、無名関数(lambda)も使える

2021-09-09 08:43:24 | Python

上の図前半は前のものです。この程度であれば、Nottori(lambda式)にする必要性がわからないですが…。


コメント (2)    この記事についてブログを書く
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする
« C言語の関数型のポインタを試... | トップ | Rubyで手こずってました。map »
最新の画像もっと見る

2 コメント

コメント日が  古い順  |   新しい順
ラムダ式 (cametan_42)
2021-09-09 23:57:54
> この程度であれば、Nottori(lambda式)にする必要性がわからないですが…。

そうですね(笑)。

実際、Cとかに詳しい人程、ラムダ式が良く分からなくなる傾向があるんですよ(笑)。
そもそも、Cだと、前にも書きましたが、ローカル関数さえ扱えないので、実はCに慣れれば慣れるほどラムダ式の存在が不可思議になるようです。

Pythonで一番簡単な例は「自作sum関数を作るにはどうする?」って辺りでしょうか。
sumは

>>> sum([1, 2, 3, 4, 5, 6, 7, 8, 9, 10])
55
>>>

ですが。
一から作るんじゃなくって、組み込みの高階関数とラムダ式を使えばどうなるか、と言うお題があったとして。
もっともスマートなのはfunctoolsに含まれるreduceを用いる事です。

>>> import functools
>>> functools.reduce(lambda x, y: x + y, [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], 0)
55
>>>

reduceってのは関数型言語では有名な「畳込み関数」と言われる高階関数です。
これ、ちょっと初見は動作が分かりづらいんですが、

reduce(関数, イテラブル, 初期値)

と言う記述で、第一引数の関数に「ラムダ式を使って良い」と言う事ですね。
その関数は2引数が基本で、イテラブルの先頭と初期値にその関数を適用して初期値に代入、次にイテラブルの二番目の値と初期値に関数を適用・・・とイテラブルの末尾まで計算を続けていきます。
このreduceを利用すると、階乗の計算、なんかもすぐ書けます。

>>> def factorial(lst):
   return functools.reduce(lambda x, y: x * y, lst)

>>> factorial([1, 2, 3, 4, 5, 6, 7, 8, 9, 10])
3628800
>>>

for文を使って書くよりもシンプルに書けますね。

他にもPythonの組み込み高階関数にはmapとかfilter等があります。両者ともラムダ式と相性が良い。
また、関数型言語の練習にはこれらmapとかfilterを「自作する」と言う問題がしばしばあります。
なお、mapやfilter的な効果をもっと統一的に扱う目的で導入されたのがしばしば言ってる「リスト内包表記」です。
返信する
cametan_42さん、コメントありがとうございます (isam)
2021-09-10 06:57:26
Pythonの解説書を読んでいるような、それ以上の蘊蓄を感じます。コメントを取り出して、綴って置きたくなります。
 クジラ飛行机さんの「Pythonの教科書」では、mapとfilterの説明に移っていきますが、全編で言えると思いますが、例が単純でそれがなにか役に立つの?と思えるのは、読み方が浅いのでしょうかね。
返信する

コメントを投稿

ブログ作成者から承認されるまでコメントは反映されません。

Python」カテゴリの最新記事