Python
 Computer >> コンピューター >  >> プログラミング >> Python

Pythonのラムダ式でフィボナッチ数列を生成する2つの方法

フィボナッチ数列は、自然界の多くの現象を説明することでも知られる、非常に有名な数学的数列です。0と1から始まり、「直前の2項の合計」を次の項として加えていくことで数列が伸びていきます。本記事では、Pythonのラムダ式(無名関数)を使って、指定した個数のフィボナッチ数列を生成する2つの方法を紹介します。

方法1:sum関数とmap関数を組み合わせる

まずはmap関数を使い、リストの各要素にラムダ関数を適用する方法です。リストのスライスで直前の2項を取り出してsumで合計し、その結果をリストに追加していきます。range関数で生成する項数を制御するのがポイントです。

サンプルコード

def fibonacci(count):
    listA = [0, 1]

    any(map(lambda _: listA.append(sum(listA[-2:])),
            range(2, count)))

    return listA[:count]

print(fibonacci(8))

実行結果

上記のコードを実行すると、次の出力が得られます。

[0, 1, 1, 2, 3, 5, 8, 13]

補足:mapは遅延評価されるため、そのままでは処理が実行されません。ここではany()でイテレータを強制的に評価させ、ラムダ内のappendを確実に実行しています。最後にlistA[:count]で先頭から指定個数だけ切り出して返します。

方法2:reduce関数を使う

次に、functools.reduceとラムダ関数を組み合わせる方法です。reduceは累積的に処理を適用するため、初期値[0, 1]に対して「末尾の2項の合計を新たな項として追加する」という操作を繰り返すことで、数列を一気に構築できます。

サンプルコード

from functools import reduce

fib_numbers = lambda y: reduce(lambda x, _: x + [x[-1] + x[-2]], range(y - 2), [0, 1])

print(fib_numbers(8))

実行結果

上記のコードを実行すると、次の出力が得られます。

[0, 1, 1, 2, 3, 5, 8, 13]

補足:ここではラムダが2段階で使われています。外側のラムダyが引数(項数)を受け取り、内側のラムダx + [x[-1] + x[-2]]が現在のリストの末尾2項の合計を追加していきます。range(y - 2)により、初期値の2項分を除いた回数だけ繰り返される仕組みです。

まとめ

どちらの方法もラムダ式を活かした簡潔な実装ですが、可読性やデバッグのしやすさを重視するなら、通常のforループやジェネレーターを使った書き方も検討する価値があります。用途に応じて使い分けるとよいでしょう。

  1. Pythonのscikit-learnを使って画像の輪郭を検出する方法

    scikit-learn(通称:sklearn)は、機械学習アルゴリズムを実装するために使用されるPythonのライブラリです。オープンソースとして公開されているため、無料で利用できます。このライブラリは、NumPy・SciPy・Matplotlibという3つのライブラリを基盤として構築されています。画像から輪郭を抽出する際には、「マーチングスクエア法(marching squares)」と呼ばれる手法が用いられます。具体的には、skimageライブラリのmeasureモジュールに含まれる「find_contours」関数を使用します。この関数では、配列内の値が線形補間されるため、出力画像にお

  2. PythonとOpenCVを使って画像内の円を検出する方法

    OpenCVはPython向けにcv2ライブラリを提供しており、コンピュータビジョンにおけるさまざまな形状解析に活用できます。本記事では、OpenCVを使って画像の中から「円」を検出する方法を解説します。円の検出にはcv2.HoughCircles()関数を使用します。この関数は、ハフ変換(Hough Transform)を用いてグレースケール画像から円を検出するものです。以下の例では、入力画像を読み込んだ後、そのコピーを作成し、ハフ変換を適用することで画像内の円を検出して出力します。構文cv2.HoughCircles(image, method, dp, minDist)各引数の意味は次の