Python入門(7.関数型言語の機能)です。
Python[完全]入門を参考に執筆しました。
Pythonでは、無名関数(ラムダ式)を使うことで、簡単なコードブロックであれば名前をつけなくてもブロックを変数に代入して実行すべきところで実行することができる。
無名関数は以下のように記述する。
lambda x, y: (x + y) / 2
ラムダ式は他の言語にもあるし、無名関数はC#では昔デリゲートと呼ばれていた。Rubyのブロックに近い。C言語でも関数ポインタを関数の引数に与えることはできる。
map()関数は、リストのそれぞれの要素に、同じ処理を実行したリストを返す。
filter()関数は、リストから条件を満たすものだけをフィルターして抽出する。
以下はリストのそれぞれの要素に同じ処理を実行して、同じサイズのリストに結果となる要素をすべて格納してくれる、map()関数と無名関数を組み合わせた例。
orig = [1, 2, 3, 4, 5] bi = map(lambda x: x * 2, orig) print(bi) # [2, 4, 6, 8, 10]
zip()関数は、for文とともに使うことで、複数のリストからひとつひとつ要素を取り出すような反復処理を行うことができる。
names = ['クロ', 'シロ', 'タマ'] ages = [6, 8, 4] for n, a in zip(names, ages): print(n, 'は', a, '歳です。')
関数 | 説明 |
---|---|
iter() | イテレータを返す関数。 |
next() | イテレータから次の要素を取り出す関数。 |
enumerate() | 要素を取り出した時に、その要素が何番目の要素なのかを知るための関数。 |
詳しくは以下の書籍が参考になる。
Pythonのfor文は、リスト・タプル・辞書などのイテラブル(イテレータを実装したオブジェクト)に対して繰り返し処理をする構文であり、イテレータのための構文であるとも言える。
for文にリストなどのイテラブルを与えた場合、内部処理としてイテレータが実行されている。
イテレータさえ実装されていれば、どのようなオブジェクトであってもfor文で繰り返すことができる。
イテレータを実装するには、__iter__()メソッドと__next__()メソッドを実装し、__iter__()から__next__()を持つオブジェクトを返すようにする。
2023.01.22
yieldは、for文のような繰り返し処理と組み合わせて使うことが多い機能で、関数からfor文などに対して繰り返して1つずつ値を返し続けることができる。
for文で使う場合は、一度の繰り返しを行う時に、次のyieldの実行までを処理し、yieldで返された値をfor文のカウントごとに代入される変数に代入する。そして、次の繰り返しに進んだ時に、次のyieldまでを処理する。
言葉で説明すると難しいが、繰り返しの中でさまざまな処理を行いたい場合に、知っておくと便利である。for文を使わずに、自分でnext()メソッドを実行することもできる。
yieldはジェネレータと呼ばれる機能で、yieldがある関数はジェネレータ関数と呼ばれる。これをイテレータ(反復子)とともに用いることで、一回の繰り返しの呼び出しに対して、yieldまでを一回行うことができる。
後日注記:ジェネレータは、通常のイテレータと同様に反復処理でひとつひとつの要素にアクセスすることができるが、実際にリスト要素をデータとして持っているのではなく、呼び出されるたびに要素を自動作成して、yield returnでfor文に返すことができる。
詳しくは以下のリンクが参考になる。また、PythonだけではなくC#でも使える。
イテレータとジェネレータを参照のこと。
クロージャ・無名関数・関数オブジェクトも参照のこと。