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

Pythonのループ内でラムダ式を作成する方法をわかりやすく解説

Pythonでは、ループ処理の中でラムダ式(無名関数)をリストとしてまとめて作成できます。ただし、単純にlambdaをループ内で定義すると、変数の参照タイミングによって意図しない結果になることがあります。本記事では、正しく動作する2つの方法を具体例とともに解説します。

方法1:関数でラムダを返す

まずは、ラムダ式を返す関数を定義し、リスト内包表記で呼び出す方法です。

def square(x):
    return lambda: x * x

listOfLambdas = [square(i) for i in [1, 2, 3, 4, 5]]

for f in listOfLambdas:
    print(f())

実行結果

1
4
9
16
25

この方法では、関数squareが呼び出されるたびに新しいスコープが生成され、その時点でのxの値がラムダ式に固定されます。そのため、各ラムダがそれぞれ異なる値を正しく保持します。

方法2:デフォルト引数を使う(カリー化)

次に、関数型プログラミングの手法である「カリー化」の考え方を応用し、ラムダ式のデフォルト引数を利用する方法です。

listOfLambdas = [lambda i=i: i * i for i in range(1, 6)]

for f in listOfLambdas:
    print(f())

実行結果

1
4
9
16
25

ポイントはlambda i=i:の部分です。Pythonのデフォルト引数は関数が定義された時点で評価されるため、ループ中の各iの値がその場でラムダ式に結び付けられます。これにより、後から変数の値が変わっても影響を受けません。

注意点:遅延評価による落とし穴

もしlambda: i * iのようにデフォルト引数を使わずに書くと、すべてのラムダ式は同じ変数iへの参照を共有します。ループ終了後にはiが最後の値(この例では5)になっているため、実行結果はすべて「25」となってしまいます。

# 意図しない動作の例
listOfLambdas = [lambda: i * i for i in range(1, 6)]
for f in listOfLambdas:
    print(f())  # すべて 25 が出力される

まとめ

ループ内でラムダ式を作成する場合は、以下のいずれかの方法を使いましょう。

  • ラムダ式を返す関数を経由して、各値を独立したスコープに閉じ込める
  • デフォルト引数(lambda i=i:)を使って、定義時の値を固定する

どちらの方法でも、各ラムダ式がそれぞれ異なる値を正しく扱えるようになります。

  1. Pythonで仮想環境を作成する方法|virtualenvの導入から使い方まで徹底解説

    Pythonの仮想環境とはPythonの仮想環境とは、その環境内にインストールされたライブラリ、パッケージ、スクリプトが、他の仮想環境やOS自体にインストールされたデフォルトのPython環境から隔離される仕組みです。開発者にとって仮想環境は非常に有用であり、実務ではほぼ必須といえる存在です。プロジェクトごとに必要なライブラリや依存関係は異なるため、あるプロジェクトの依存関係を他のプロジェクトから分離しておくことで、多くのメリットが得られます。例えば、同じライブラリの異なるバージョンを必要とする2つのプロジェクトがあるとします。デフォルトの状態では、両方のバージョンのライブラリが同じディレクト

  2. PythonのforループでTkinterボタンを作成する方法

    TkinterのButtonウィジェットは、アプリケーションの実行中にイベントを処理し、さまざまなアクションを実行するうえで非常に便利な機能です。Tkinterのボタンは、Button(parent, text, option...) コンストラクタを使用して作成できます。このコンストラクタを活用することで、ループ処理の中で複数のボタンを効率的に生成することも可能です。 サンプルコード 以下の例では、Pythonの for ループを使用して、指定した範囲内に複数のボタンを作成します。 #必要なライブラリをインポート from tkinter import * from tkinter imp