Python |マスターラムダ関数、4つはそうではありません!

(AIスキルを向上させるためにマシン学習アルゴリズムとPython学習にスターを付ける)

元のアドレス:これらの4つの禁止事項を使用したPythonLambda関数のマスター
原作者:Yong Cui、Ph.D。
からの翻訳:ナゲッツ翻訳プロジェクト
この記事への恒久的なリンク:* https://github.com/xitu/gold-miner/blob/master/article/2020/master-python-lambda-functions-with-these-4-donts.md *
翻訳者:loststarプルーフリーダー:luochen1992

Lambda関数は、Pythonの匿名関数です。小さな仕事を完了する必要がある場合、ローカル環境でそれらを使用すると、仕事が便利になります。一部の人々はそれらを略してラムダと呼び、それらの構文は次のとおりです。

lambda arguments: expression

lambdaキーワードを使用して、ラムダ関数を作成し、その後にパラメーターのリストとコロンで区切られた単一の式を作成できます。たとえば、 lambda x:2 * xは任意の入力数値に2を掛けることであり、 lambda x、y:x + yは2つの数値の合計を計算することです。構文はかなり簡単ですよね?

ラムダ関数が何であるかを知っていると仮定して、この記事はラムダ関数を正しく使用する方法に関するいくつかの一般的なガイドラインを提供することを目的としています。

1. 値を返さない

構文を見ると、ラムダ関数で何も返さなかったことがわかります。これは、ラムダ関数に含めることができる式が1つだけであるためです。ただし、 returnキーワードを使用すると、以下に示すように、規定の構文に準拠しないステートメントが構成されます。

>>> integers =[(3,-3),(2,3),(5,1),(-4,4)]>>>sorted(integers, key=lambda x: x[-1])[(3,-3),(5,1),(2,3),(-4,4)]>>>sorted(integers, key=lambda x:return x[-1])... 
 File "<input>", line 1sorted(integers, key=lambda x:return x[-1])^
SyntaxError: invalid syntax

エラーは、式とステートメントを区別できないことが原因である可能性があります。たとえば、 return trywith、および ifを含むステートメントは特別なアクションを実行します。ただし、式とは、数値や他のPythonオブジェクトなどの値に計算できる式を指します。

ラムダ関数を使用すると、単一の式が値として計算され、 sorted関数によるソートなどの後続の計算に参加します。

2. より良いオプションを忘れないでください

ラムダ関数の最も一般的な使用シナリオは、上記の sorted()max()などのいくつかの組み込みユーティリティ関数で keyの実際のパラメーターとして使用することです。状況に応じて、他の代替方法を使用できます。次の例を考えてみましょう。

>>> integers =[-4,3,7,-5,-2,6]>>>sorted(integers, key=lambda x:abs(x))[-2,3,-4,-5,6,7]>>>sorted(integers, key=abs)[-2,3,-4,-5,6,7]>>> scores =[(93,100),(92,99),(95,94)]>>>max(scores, key=lambda x: x[0]+ x[1])(93,100)>>>max(scores, key=sum)(93,100)

データサイエンスの分野では、多くの人がパンダライブラリを使用してデータを処理します。以下に示すように、ラムダ関数を使用して、 map()関数を介して既存のデータから新しいデータを作成できます。 pandasは以下をサポートしているため、ラムダ関数の使用に加えて、算術関数を直接使用することもできます。

>>> import pandas as pd
>>> data = pd.Series([1,2,3,4])>>> data.map(lambda x: x +5)06172839
dtype: int64
>>> data +506172839
dtype: int64

3. 変数に割り当てないでください

ラムダ関数を単純な関数を宣言する別の方法と間違える人を見たことがあります。誰かが次のようにそれを行っているのを見たことがあるかもしれません。

>>> doubler = lambda x:2* x
>>> doubler(5)10>>>doubler(7)14>>>type(doubler)<class'function'>

ラムダ関数に名前を付けることの唯一の効果は、ラムダ関数が実際に他の関数と同じ関数であることを示すための教育目的である可能性があります-それらは呼び出すことができ、特定の関数を持つことができます。さらに、ラムダ関数を変数に割り当てるべきではありません。

ラムダ関数に名前を付ける際の問題は、デバッグの直感性が低下することです。通常の defキーワードで作成された他の関数とは異なり、ラムダ関数には名前がないため、匿名関数と呼ばれることもあります。次の簡単な例を考えて、微妙な違いを見つけてください。

>>> inversive0 = lambda x:1/ x
>>> inversive0(2)0.5>>>inversive0(0)Traceback(most recent call last):
 File "<input>", line 1,in<module>
 File "<input>", line 1,in<lambda>
ZeroDivisionError: division by zero
>>> def inversive1(x):...return1/ x
...>>> inversive1(2)0.5>>>inversive1(0)Traceback(most recent call last):
 File "<input>", line 1,in<module>
 File "<input>", line 2,in inversive1
ZeroDivisionError: division by zero

これに関連して、ラムダ関数を複数回使用する場合、ベストプラクティスは、docstringの使用を許可する defで定義された通常の関数を使用することです。

4. リストの理解を忘れないでください

ラムダ関数を map filterなどの高次関数と一緒に使用することを好む人もいます。次の使用例を検討してください。

>>> # 番号のリストを作成する
>>> numbers =[2,1,3,-3]>>> #ラムダ関数でマップ関数を使用する
>>> list(map(lambda x: x * x, numbers))[4,1,9,9]>>> #ラムダ関数でフィルター関数を使用する
>>> list(filter(lambda x: x %2, numbers))[1,3,-3]

ラムダ関数の代わりに、より読みやすいリスト内包表記を使用できます。以下に示すように、リスト内包表記を使用して同じリストオブジェクトを作成します。ご覧のとおり、リスト内包表記と比較して、ラムダ関数で mapまたは filter関数を使用する方が面倒です。したがって、高次の関数を含むリストを作成するときは、リスト内包表記の使用を検討する必要があります。

>>> # Use list comprehensions
>>>[ x * x for x in numbers][4,1,9,9]>>>[x for x in numbers if x %2][1,3,-3]

結論として ##

この記事では、ラムダ関数を使用するときに発生する可能性のある4つの一般的な間違いを確認しました。これらのエラーを回避することにより、コードでラムダ関数を正しく使用できるようになります。

ラムダ関数を使用するための大まかなルールは、それを単純に保ち、ローカルで1回だけ使用することです。

Recommended Posts

Python |マスターラムダ関数、4つはそうではありません!
07.Python3関数
Python関数
pythonの関数
python関数、クラス、モジュール、パッケージ