web-dev-qa-db-fra.com

Quelle est la clé = lambda

En utilisant certaines fonctions intégrées comme triées, somme ... J'ai remarqué l'utilisation de key=lambda

Qu'est-ce que lambda? Comment ça marche?

Quelles autres fonctions utilisent key = lambda?

Y a-t-il d'autres valeurs clés comme, key=?

40
Thiru

A lambda est une fonction anonyme:

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

Il est souvent utilisé dans des fonctions telles que sorted() qui prennent un callable comme paramètre (souvent le paramètre de mot clé key). Vous pouvez également fournir une fonction existante au lieu d'un lambda, tant qu'il s'agit d'un objet appelable.

Prenons l'exemple sorted() . Il retournera l'itérable donné dans l'ordre trié:

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

mais cela trie les mots en majuscules avant les mots en minuscules. En utilisant le mot clé key, vous pouvez modifier chaque entrée afin qu'elle soit triée différemment. On pourrait mettre en minuscule tous les mots avant de trier, par exemple:

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

Nous avons dû créer une fonction distincte pour cela, nous n'avons pas pu aligner la ligne def lowercased() dans l'expression 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

Un lambda d'autre part, peut être spécifié directement, en ligne dans l'expression sorted():

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

Les lambdas sont limités à une seule expression, dont le résultat est la valeur de retour.

Il y a beaucoup d'endroits dans la bibliothèque Python, y compris les fonctions intégrées, qui prennent un appelable comme mot-clé ou argument positionnel. Il y en a trop pour les nommer ici, et ils jouent souvent un rôle différent .

69
Martijn Pieters

Lambda peut être n'importe quelle fonction. Donc, si vous aviez une fonction

def compare_person(a):
         return a.age

Vous pouvez trier une liste de personnes (chacune ayant un attribut d'âge) comme ceci:

sorted(personArray, key=compare_person)

De cette façon, la liste serait triée par âge dans l'ordre croissant.

Le paramètre est appelé lambda car python a un astucieux mots-clés lambda pour définir de telles fonctions à la volée. Au lieu de définir une fonction compare_person et de la transmettre à triée, vous pouvez également écrire:

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

qui fait la même chose.

9
cemper93

En Python, lambda est un mot-clé utilisé pour définir fonctions anonymes (fonctions sans nom) et c'est pourquoi on les appelle fonctions lambda.

Fondamentalement il est utilisé pour définir fonctions anonymes qui peuvent/ne peuvent pas prendre argument (s) et renvoie la valeur de données/expression. Voyons un exemple.

>>> # 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
>>> 

Maintenant, permettez-moi de donner une réponse à votre 2e question. La réponse 1st est également excellente. C'est ma propre façon d'expliquer avec un autre exemple.

Supposons que nous ayons une liste d'éléments (entiers et chaînes avec un contenu numérique) comme suit,

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

et je veux le trier en utilisant la fonction sorted (), permet de voir ce qui se passe.

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

Cela ne m'a pas donné ce que je attend comme je voul comme ci-dessous,

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

Cela signifie que nous avons besoin de stratégie (pour que le tri puisse traiter nos éléments de chaîne comme des entiers) pour y parvenir. C'est pourquoi l'argument de mot clé key est utilisé. Veuillez regarder celui ci-dessous.

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

Permet d'utiliser la fonction lambda comme une valeur de clé

>>> 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']
>>>

Vous pouvez définir votre propre fonction (appelable) et la fournir comme valeur clé.

Chers programmeurs, j'ai écrit le code ci-dessous pour vous, essayez juste de comprendre et commentaire votre explication. Je serais heureux de voir votre explication (c'est simple).

>>> 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]
>>>

I j'espère ce serait tile.

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

En fait, les codes ci-dessus peuvent être:

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

Selon https://docs.python.org/2/library/functions.html?highlight=sorted#sorted , key spécifie la fonction d'un argument utilisé pour extraire une clé de comparaison de chaque élément de liste: key = str.lower. La valeur par défaut est None (comparez directement les éléments).

3
Yang Wang