ホームページ >バックエンド開発 >Python チュートリアル >Pythonでよく使われる最も不思議な関数! lambda関数について徹底まとめ!

Pythonでよく使われる最も不思議な関数! lambda関数について徹底まとめ!

WBOY
WBOY転載
2023-04-12 23:13:091425ブラウズ

Pythonでよく使われる最も不思議な関数! lambda関数について徹底まとめ!

Python の Lambda 関数とは

ラムダ関数は、任意の数のパラメータを受け入れることができる匿名関数 (つまり、名前が定義されていない) です。同じ関数でも、式を評価して返すだけという点が異なります。

Python のラムダ関数は、次の構文を使用して表現されます:

ラムダ パラメーター: 式

ラムダ関数は 3 つの要素で構成されます:

    #キーワード ラムダ: 通常の関数の def に似ています
  • パラメータ: 通常の関数と同じように、位置パラメータとキーワード パラメータの受け渡しをサポートします
  • テキスト: 固定パラメータを使用した式の処理
ラムダ関数のパラメータは通常の関数とは異なり括弧で囲む必要がないことに注意してください。ラムダ関数にパラメータが2つ以上ある場合はカンマで区切ります

lambda を使用します。この関数は短い式 (理想的には 1 行) のみを評価し、それを 1 回だけ評価します。つまり、将来この関数を再利用することはありません。一般的に言えば、ラムダ関数をパラメータとして高階関数 (他の関数をパラメータとして受け入れる関数) (filter()、map()、reduce() などの Python 組み込み関数など) に渡します。など。

Python Lambda 関数の仕組み

簡単な Lambda 関数の例を見てみましょう:

lambda x: x + 1

出力:

<function __main__.<lambda>(x)>

上記ラムダ関数はパラメータを受け取り、それを 1 ずつインクリメントし、結果を返します。

これは、def キーワードと return キーワードを備えた次の通常の関数の単純なバージョンです:

def increment_by_one(x):
 return x + 1

これまでのラムダ関数function lambda x: x 1 は関数 Object を 1 つだけ作成しますが、そのパラメーター x に値 (引数) を指定しなかったため、何も返しません。まず変数を代入し、ラムダ関数に渡して、今回の結果を見てみましょう:

a = 2
print(lambda x: a + 1)

出力:

<function <lambda> at 0x00000250CB0A5820>

ラムダ関数は期待どおりの値を返しません 3. 代わりに、関数オブジェクト自体とそのメモリ位置が返されますが、これはラムダ関数を呼び出す正しい方法ではないことがわかります。ラムダ関数にパラメータを渡し、それを実行して結果を返すには、次の構文を使用する必要があります:

(lambda x: x + 1)(2)

Output:

3

ラムダ関数のパラメータは括弧で囲まれていませんが、 , これを呼び出すときは、ラムダ関数の構造全体とそれに渡す引数を括弧で囲みます。

上記のコードでもう 1 つ注意すべき点は、ラムダ関数を使用すると、関数の実行を作成できることです。関数の直後に実行して結果を受け取ります。これは、関数実行の即時呼び出し (または IIFE) と呼ばれます。

複数のパラメーターを持つラムダ関数を作成できます。その場合、関数定義内のパラメーターをカンマで区切ります。このようなラムダ関数を実行するときは、対応するパラメーターを同じ順序でリストし、コンマで区切ります。

(lambda x, y, z: x + y + z)(3, 8, 1)

Output:

12

ラムダ関数を使用して条件付き操作を実行することもできます。以下は、単純な if-else 関数のラムダ シミュレーションです。

print((lambda x: x if(x > 10) else 10)(5))
print((lambda x: x if(x > 10) else 10)(12))

出力:

10
12

複数の条件 (if-elif-...-else) がある場合は、それらをネストする必要があります。 :

(lambda x: x * 10 if x > 10 else (x * 5 if x < 5 else x))(11)

Output:

110

ただし、上記の書き方だとコードが読みにくくなります

この場合、 if-elif-...- を付けた普通の関数となります。 else 条件セットはラムダ関数よりも良い選択です。実際、上記の例のラムダ関数は次のように記述できます:

def check_conditions(x):
 if x > 10:
 return x * 10
 elif x < 5:
 return x * 5
 else:
 return x
check_conditions(11)

Output:

110

上記の関数は対応するラムダ関数よりも多くの行を追加しますが、より読みやすくなっています。

ラムダ関数を変数に代入し、その変数を通常の関数として呼び出すことができます:

increment = lambda x: x + 1
increment(2)

出力:

3

ただし、Python コード スタイルの PEP 8 に従っています。ルール、これは悪い習慣です。

    代入ステートメントを使用すると、明示的な def ステートメントに比べてラムダ式が提供できる唯一の利点が失われます (つまり、より大きな式に埋め込むことができます)
したがって、今後使用するために関数を保存する必要がある場合は、ラムダ関数を変数に割り当てるのではなく、同等の通常の関数を定義する方が良いです

Python での Lambda 関数のアプリケーション

filter() 関数を使用した Lambda

#Python の filter() 関数には 2 つのパラメータが必要です:

フィルタ条件を定義する関数
  • フィルタ条件を定義する関数
  • function run

関数を実行すると、フィルター オブジェクトを取得します:

lst = [33, 3, 22, 2, 11, 1]
filter(lambda x: x > 10, lst)

出力:

<filter at 0x250cb090520>

フィルター オブジェクトから新しいイテレータを取得するため、元のイテレータ内のすべての項目が事前定義された条件を満たしている場合、フィルター オブジェクトを Python 標準ライブラリの対応する関数 (list ()、tuple()、set ()、frozenset()、またはsorted()) に渡す必要があります (ソートされたリスト)

数値のリストをフィルターして 10 より大きい数値のみを選択し、昇順でソートされたリストを返しましょう:

lst = [33, 3, 22, 2, 11, 1]
sorted(filter(lambda x: x > 10, lst))

出力:

[11, 22, 33]

元のオブジェクトと同じ型の新しい反復可能なオブジェクトを作成する必要はありません。さらに、この操作の結果を変数に保存できます。

lst = [33, 3, 22, 2, 11, 1]
tpl = tuple(filter(lambda x: x > 10, lst))
tpl

Output:

(33, 22, 11)

带有 map() 函数的 Lambda

我们使用 Python 中的 map() 函数对可迭代的每个项目执行特定操作。它的语法与 filter() 相同:一个要执行的函数和一个该函数适用的可迭代对象。

map() 函数返回一个 map 对象,我们可以通过将该对象传递给相应的 Python 函数来从中获取一个新的迭代:list()、tuple()、set()、frozenset() 或 sorted()

与 filter() 函数一样,我们可以从 map 对象中提取与原始类型不同类型的可迭代对象,并将其分配给变量。

下面是使用 map() 函数将列表中的每个项目乘以 10 并将映射值作为分配给变量 tpl 的元组输出的示例:

lst = [1, 2, 3, 4, 5]
print(map(lambda x: x * 10, lst))
tpl = tuple(map(lambda x: x * 10, lst))
tpl

Output:

<map object at 0x00000250CB0D5F40>
(10, 20, 30, 40, 50)

map() 和 filter() 函数之间的一个重要区别是第一个函数总是返回与原始函数相同长度的迭代。因此由于 pandas Series 对象也是可迭代的,我们可以在 DataFrame 列上应用 map() 函数来创建一个新列:

import pandas as pd
df = pd.DataFrame({'col1': [1, 2, 3, 4, 5], 'col2': [0, 0, 0, 0, 0]})
print(df)
df['col3'] = df['col1'].map(lambda x: x * 10)
df

Output:

col1col2
0 1 0
1 2 0
2 3 0
3 4 0
4 5 0
col1col2col3
0 1 010
1 2 020
2 3 030
3 4 040
4 5 050

当然要在上述情况下获得相同的结果,也可以使用 apply() 函数:

df['col3'] = df['col1'].apply(lambda x: x * 10)
df

Output:

col1col2col3
0 1 010
1 2 020
2 3 030
3 4 040
4 5 050

我们还可以根据某些条件为另一列创建一个新的 DataFrame 列,对于下面的代码,我们可以互换使用 map() 或 apply() 函数:

df['col4'] = df['col3'].map(lambda x: 30 if x < 30 else x)
df

Output:

col1col2col3col4
0 1 01030
1 2 02030
2 3 03030
3 4 04040
4 5 05050

带有 reduce() 函数的 Lambda

reduce() 函数与 functools Python 模块相关,它的工作方式如下:

  • 对可迭代对象的前两项进行操作并保存结果
  • 对保存的结果和可迭代的下一项进行操作
  • 以这种方式在值对上进行,直到所有项目使用可迭代的

该函数与前两个函数具有相同的两个参数:一个函数和一个可迭代对象。但是与前面的函数不同的是,这个函数不需要传递给任何其他函数,直接返回结果标量值:

from functools import reduce
lst = [1, 2, 3, 4, 5]
reduce(lambda x, y: x + y, lst)

Output:

15

上面的代码展示了我们使用 reduce() 函数计算列表总和时的作用

需要注意的是,reduce() 函数总是需要一个带有两个参数的 lambda 函数,而且我们必须首先从 functools Python 模块中导入它

Python 中 Lambda 函数的优缺点

优点

  • 评估单个表达式的理想选择,应该只评估一次
  • 它可以在定义后立即调用
  • 与相应的普通语法相比,它的语法更紧凑
  • 它可以作为参数传递给高阶函数,例如 filter()、map() 和 reduce()

缺点

  • 它不能执行多个表达式
  • 它很容易变得麻烦,可读性差,例如当它包括一个 if-elif-...-else 循环
  • 它不能包含任何变量赋值(例如,lambda x: x=0 将抛出一个语法错误)
  • 我们不能为 lambda 函数提供文档字符串

总结

总而言之,我们已经详细讨论了在 Python 中定义和使用 lambda 函数的许多方面:

  • lambda 函数与普通 Python 函数有何不同
  • Python 中 lambda 函数的语法和剖析
  • 何时使用 lambda 函数
  • lambda 函数的工作原理
  • 如何调用 lambda 函数
  • 调用函数执行(IIFE)的定义
  • 如何使用 lambda 函数执行条件操作,如何嵌套多个条件,以及为什么我们应该避免它
  • 为什么我们应该避免将 lambda 函数分配给变量
  • 如何将 lambda 函数与 filter() 函数一起使用
  • 如何将 lambda 函数与 map() 函数一起使用
  • 我们如何在 pandas DataFrame 中使用
  • 带有传递给它的 lambda 函数的 map() 函数 - 以及在这种情况下使用的替代功能
  • 如何将 lambda 函数与 reduce() 函数一起使用
  • 普通 Python 上使用 lambda 函数的优缺点

希望今天的讨论可以使 Python 中看似令人生畏的 lambda 函数概念更清晰、更易于应用,更希望小伙伴们能够喜欢,喜欢就点个赞吧!

以上がPythonでよく使われる最も不思議な関数! lambda関数について徹底まとめ!の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事は51cto.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。