71

sorted、sum などの組み込み関数を使用しているときに、次の使用法に気付きましたkey=lambda

ラムダとは?それはどのように機能しますか?

key=lambda を使用する他の関数は何ですか?

次のような他の重要な値はありますか?key=?

4

4 に答える 4

105

Alambdaは無名関数です。

>>> f = lambda: 'foo'
>>> print f()
foo

sorted()callable をパラメーター (多くの場合、keyキーワード パラメーター)として受け取るような関数でよく使用されます。lambda呼び出し可能なオブジェクトである限り、そこの代わりに既存の関数を提供することもできます。

sorted()関数を例にとります。指定された iterable をソートされた順序で返します。

>>> sorted(['Some', 'words', 'sort', 'differently'])
['Some', 'differently', 'sort', 'words']

ただし、大文字の単語を小文字の単語の前に並べ替えます。キーワードを使用すると、key各エントリを変更して、別の方法で並べ替えることができます。たとえば、次のように、並べ替える前にすべての単語を小文字にすることができます。

>>> def lowercased(word): return word.lower()
...
>>> lowercased('Some')
'some'
>>> sorted(['Some', 'words', 'sort', 'differently'], key=lowercased)
['differently', 'Some', 'sort', 'words']

def lowercased()そのために別の関数を作成する必要があり、行をsorted()式にインライン化できませんでした。

>>> sorted(['Some', 'words', 'sort', 'differently'], key=def lowercased(word): return word.lower())
  File "<stdin>", line 1
    sorted(['Some', 'words', 'sort', 'differently'], key=def lowercased(word): return word.lower())
                                                           ^
SyntaxError: invalid syntax

lambda一方、Aは、sorted()式のインラインで直接指定できます。

 >>> sorted(['Some', 'words', 'sort', 'differently'], key=lambda word: word.lower())
['differently', 'Some', 'sort', 'words']

ラムダは 1 つの式のみに制限され、その結果が戻り値になります。

Python ライブラリには、組み込み関数を含め、callable をキーワードまたは位置引数として受け取る場所がたくさんあります。ここで挙げるにはあまりにも多くの名前があり、多くの場合、それらは異なる役割を果たします。

于 2012-12-02T12:26:44.953 に答える
20

Python では、ラムダは無名関数(名前のない関数)を定義するために使用されるキーワードであり、ラムダ関数として知られているのはそのためです。

基本的に、引数を取ることができない/できない匿名関数を定義するために使用され、 data / expressionの値を返します。を見てみましょう。

>>> # Defining a lambda function that takes 2 parameters(as integer) and returns their sum
... 
>>> lambda num1, num2: num1 + num2 
<function <lambda> at 0x1004b5de8>
>>> 
>>> # Let's store the returned value in variable & call it(1st way to call)
... 
>>> addition = lambda num1, num2: num1 + num2
>>> addition(62, 5)
67
>>> addition(1700, 29)
1729
>>> 
>>> # Let's call it in other way(2nd way to call, one line call )
... 
>>> (lambda num1, num2: num1 + num2)(120, 1)
121
>>> (lambda num1, num2: num1 + num2)(-68, 2)
-66
>>> (lambda num1, num2: num1 + num2)(-68, 2**3)
-60
>>> 

それでは、 2 番目の質問の回答をさせてください。最初の答えも素晴らしいです。これは、別の例で説明する私自身の方法です。

次のようなアイテムのリスト(整数数値の内容を含む文字列)があるとします。

nums = ["2", 1, 3, 4, "5", "8", "-1", "-10"]

sorted()関数を使用してソートしたいので、何が起こるか見てみましょう。

>>> nums = ["2", 1, 3, 4, "5", "8", "-1", "-10"]
>>> sorted(nums)
[1, 3, 4, '-1', '-10', '2', '5', '8']
>>>

以下のように、私が望んでいたように、私が期待したものを与えてくれませんでした。

['-10', '-1', 1, '2', 3, 4, '5', '8']

これは、これを達成するために何らかの戦略が必要であることを意味します(sorted が文字列項目を int として扱うことができるようにするため)。これがkeyキーワード引数が使用される理由です。下の方を見てください。

>>> nums = ["2", 1, 3, 4, "5", "8", "-1", "-10"]
>>> sorted(nums, key=int)
['-10', '-1', 1, '2', 3, 4, '5', '8']
>>> 

キーの値としてラムダ関数を使用しましょう

>>> names = ["Rishikesh", "aman", "Ajay", "Hemkesh", "sandeep", "Darshan", "Virendra", "Shwetabh"]
>>> names2 = sorted(names)
>>> names2
['Ajay', 'Darshan', 'Hemkesh', 'Rishikesh', 'Shwetabh', 'Virendra', 'aman', 'sandeep']
>>> # But I don't want this o/p(here our intention is to treat 'a' same as 'A')
...
>>> names3 = sorted(names, key=lambda name:name.lower())
>>> names3
['Ajay', 'aman', 'Darshan', 'Hemkesh', 'Rishikesh', 'sandeep', 'Shwetabh', 'Virendra']
>>>

独自の関数 ( callable ) を定義し、それをkeyの値として提供できます。

親愛なるプログラマー、私はあなたのために以下のコードを書きました。それを理解し、あなたの説明にコメントしてください。分かりやすく説明していただけると幸いです(簡単です)。

>>> def validator(item):
...     try:
...         return int(item)
...     except:
...         return 0
... 
>>> sorted(['gurmit', "0", 5, 2, 1, "front", -2, "great"], key=validator)
[-2, 'gurmit', '0', 'front', 'great', 1, 2, 5]
>>>

役に立て幸いです。

于 2017-09-02T11:07:23.910 に答える
14

Lambda は任意の関数にすることができます。あなたが機能を持っていた場合

def compare_person(a):
         return a.age

Person のリスト (それぞれが age 属性を持つ) を次のように並べ替えることができます。

sorted(personArray, key=compare_person)

このように、リストは年齢の昇順で並べ替えられます。

Python にはそのような関数をその場で定義するための気の利いたラムダ キーワードがあるため、パラメータはラムダと呼ばれます。関数 compare_person を定義して sorted に渡す代わりに、次のように書くこともできます。

sorted(personArray, key=lambda a: a.age)

これは同じことをします。

于 2012-12-02T12:32:39.667 に答える