(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つだけであるためです。ただし、 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
、 try
、 with
、および if
を含むステートメントは特別なアクションを実行します。ただし、式とは、数値や他のPythonオブジェクトなどの値に計算できる式を指します。
ラムダ関数を使用すると、単一の式が値として計算され、 sorted
関数によるソートなどの後続の計算に参加します。
ラムダ関数の最も一般的な使用シナリオは、上記の 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
ラムダ関数を単純な関数を宣言する別の方法と間違える人を見たことがあります。誰かが次のようにそれを行っているのを見たことがあるかもしれません。
>>> 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
inversive0
)、 Traceback
エラーメッセージは、ラムダ関数に問題があることを示すメッセージのみを表示します。Traceback
は問題のある関数(つまり inversive1
)を明確に促します。これに関連して、ラムダ関数を複数回使用する場合、ベストプラクティスは、docstringの使用を許可する def
で定義された通常の関数を使用することです。
ラムダ関数を 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