Je viens de fond OOP et j'essaye d'apprendre le python. J'utilise la max
fonction qui utilise une expression lambda pour renvoyer l'instance de type Player
ayant le maximum totalScore
dans la liste players
.
def winner():
w = max(players, key=lambda p: p.totalScore)
La fonction renvoie correctement une instance de type Player
ayant un maximum totalScore
. Je ne comprends pas les trois choses suivantes:
- Comment fonctionne la
max
fonction? Quels sont les arguments qu'il prend? J'ai regardé la documentation mais je n'ai pas compris. - À quoi sert le mot-clé
key
dans la fonction max? Je sais qu'il est également utilisé dans le contexte de lasort
fonction - Signification de l'expression lambda? Comment les lire? Comment travaillent-ils?
Ce sont toutes des questions conceptuelles très noobish mais qui m'aideront à comprendre la langue. Il serait utile que vous donniez des exemples à expliquer. Merci
python max lambda
et peut-être peut-être en fait plus utile pour les nouveaux utilisateurs.Réponses:
lambda
est une fonction anonyme, elle équivaut à:def func(p): return p.totalScore
Devient maintenant
max
:Mais comme les
def
instructions sont des instructions composées, elles ne peuvent pas être utilisées lorsqu'une expression est requise, c'est pourquoi les instructions sont parfoislambda
utilisées.Notez que cela
lambda
équivaut à ce que vous mettriez dans une instruction return d'undef
. Ainsi, vous ne pouvez pas utiliser d'instructions dans unlambda
, seules les expressions sont autorisées.Que fait
max
-on?Ainsi, il renvoie simplement l'objet qui est le plus grand.
Comment ça
key
marche?Par défaut, dans Python 2
key
compare les éléments en fonction d'un ensemble de règles basées sur le type des objets (par exemple, une chaîne est toujours supérieure à un entier).Pour modifier l'objet avant la comparaison, ou pour comparer en fonction d'un attribut / index particulier, vous devez utiliser l'
key
argument.Exemple 1:
Un exemple simple, supposons que vous ayez une liste de nombres sous forme de chaîne, mais que vous souhaitiez comparer ces éléments par leur valeur entière.
>>> lis = ['1', '100', '111', '2']
Ici
max
compare les éléments en utilisant leurs valeurs d'origine (les chaînes sont comparées lexicographiquement afin que vous les obteniez'2'
en sortie):>>> max(lis) '2'
Pour comparer les éléments par leur valeur entière, utilisez
key
un simplelambda
:>>> max(lis, key=lambda x:int(x)) # compare `int` version of each item '111'
Exemple 2: application
max
à une liste de tuples.>>> lis = [(1,'a'), (3,'c'), (4,'e'), (-1,'z')]
Par défaut
max
, comparera les éléments par le premier index. Si le premier index est le même, il comparera le deuxième index. Comme dans mon exemple, tous les éléments ont un premier index unique, vous obtiendrez donc ceci comme réponse:>>> max(lis) (4, 'e')
Mais que se passe-t-il si vous souhaitez comparer chaque élément par la valeur à l'index 1? Simple: utilisez
lambda
:>>> max(lis, key = lambda x: x[1]) (-1, 'z')
Comparaison d'éléments dans un itérable contenant des objets de type différent :
Liste avec des éléments mixtes:
lis = ['1','100','111','2', 2, 2.57]
Dans Python 2, il est possible de comparer des éléments de deux types différents :
>>> max(lis) # works in Python 2 '2' >>> max(lis, key=lambda x: int(x)) # compare integer version of each item '111'
Mais dans Python 3, vous ne pouvez plus faire cela :
>>> lis = ['1', '100', '111', '2', 2, 2.57] >>> max(lis) Traceback (most recent call last): File "<ipython-input-2-0ce0a02693e4>", line 1, in <module> max(lis) TypeError: unorderable types: int() > str()
Mais cela fonctionne, car nous comparons la version entière de chaque objet:
>>> max(lis, key=lambda x: int(x)) # or simply `max(lis, key=int)` '111'
la source
lengths = map(lambda word: len(word), words)
oùwords=['It', 'is', 'raining', 'cats', 'and', 'dogs']
je vois que le lambda itère sur chaque mot de la liste. Fait-il toujours cela?max
notlambda
(key
arg est facultatif), et pendant l'itération, chaque élément est passé à la fonction spécifiée danskey
et la valeur renvoyée est ensuite utilisée pour la comparaison.max(lis, key=lambda x:int(x))
peut être simplifié commemax(lis, key=int)
. Python a une fonction intégrée, int (). De même, vous pouvez utiliser toute autre fonction intégrée commekey
argument. Par exemple, vous pouvez obtenir la plus longue chaîne delis=['a', 'aa', 'aaa']
parmax(lis, key=len)
max
,min
,sorted
etc correctement. De plus, je l'ai mentionnémax(lis, key=int)
à la fin. :-)Version fortement simplifiée de
max
:def max(items, key=lambda x: x): current = item[0] for item in items: if key(item) > key(current): current = item return current
Concernant lambda:
>>> ident = lambda x: x >>> ident(3) 3 >>> ident(5) 5 >>> times_two = lambda x: 2*x >>> times_two(2) 4
la source
Il recherche l'élément "le plus grand" dans un itérable. Je suppose que vous pouvez rechercher ce que c'est, mais sinon, c'est quelque chose sur lequel vous pouvez faire une boucle, c'est-à-dire une liste ou une chaîne.
Key
est une fonction lambda qui diramax
quels objets de l'itérable sont plus grands que les autres. Dites si vous triez un objet que vous avez créé vous-même, et non quelque chose d'évident, comme des entiers.C'est en quelque sorte une question plus vaste. En termes simples, un lambda est une fonction que vous pouvez transmettre et que d'autres morceaux de code utilisent. Prenons ceci par exemple:
def sum(a, b, f): return (f(a) + f(b))
Cela prend deux objets,
a
etb
et une fonctionf
. Il appellef()
chaque objet, puis les ajoute ensemble. Alors regardez cet appel:>>> sum(2, 2, lambda a: a * 2) 8
sum()
prend2
et appelle l'expression lambda dessus. Ainsif(a)
devient2 * 2
, qui devient 4. Il fait alors ceci pourb
, et ajoute les deux ensemble.En termes pas si simples, les lambdas proviennent du calcul lambda, qui est l'idée d'une fonction qui renvoie une fonction; un concept mathématique très cool pour exprimer le calcul. Vous pouvez lire à ce sujet ici , et fait comprendre qu'il ici .
Il est probablement préférable de lire un peu plus à ce sujet, car les lambdas peuvent être déroutants et il n'est pas immédiatement évident à quel point ils sont utiles. Vérifiez ici .
la source
max
est utilisée pour obtenir le maximum d'un fichieriterable
.Les itérateurs peuvent être des listes, des tuples, des objets dict, etc. Ou même des objets personnalisés comme dans l'exemple que vous avez fourni.
max(iterable[, key=func]) -> value max(a, b, c, ...[, key=func]) -> value With a single iterable argument, return its largest item. With two or more arguments, return the largest argument.
Donc,
key=func
fondamentalement , le nous permet de passer un argument optionnelkey
à la fonction sur la base de laquelle l'itérateur donné / les arguments sont triés et le maximum est retourné.lambda
est un mot-clé python qui agit comme une pseudo fonction. Ainsi, lorsque vous lui passez l'player
objet, il reviendraplayer.totalScore
. Ainsi, l'itérable passé à function triera enmax
fonction dukey
totalScore desplayer
objets qui lui sont donnés & retournera celuiplayer
qui a le maximumtotalScore
.Si aucun
key
argument n'est fourni, le maximum est renvoyé selon les ordres Python par défaut.Exemples -
max(1, 3, 5, 7) >>>7 max([1, 3, 5, 7]) >>>7 people = [('Barack', 'Obama'), ('Oprah', 'Winfrey'), ('Mahatma', 'Gandhi')] max(people, key=lambda x: x[1]) >>>('Oprah', 'Winfrey')
la source
Selon la documentation :
Ce que cela signifie, c'est que dans votre cas, vous fournissez une liste, dans ce cas
players
. Ensuite, lamax
fonction parcourra tous les éléments de la liste et les comparera les uns aux autres pour obtenir un "maximum".Comme vous pouvez l'imaginer, avec un objet complexe tel que la
player
détermination de sa valeur à des fins de comparaison est délicat, on vous donne donc l'key
argument pour déterminer comment lamax
fonction décidera de la valeur de chacunplayer
. Dans ce cas, vous utilisez une fonction lambda pour dire "pour chacunp
dansplayers
getp.totalscore
et utilisez-le comme valeur de comparaison".la source
max
est une fonction intégrée qui prend le premier argument etiterable
(comme une liste ou un tuple)L'argument mot-clé
key
a sa valeur par défautNone
mais il accepte la fonction à évaluer, considérez-le comme un wrapper qui évalue l'itération en fonction de la fonctionConsidérez cet exemple de dictionnaire:
d = {'aim':99, 'aid': 45, 'axe': 59, 'big': 9, 'short': 995, 'sin':12, 'sword':1, 'friend':1000, 'artwork':23}
Ex:
>>> max(d.keys()) 'sword'
Comme vous pouvez le voir si vous ne passez que l'itérable sans kwarg (une fonction à
key
), il renvoie la valeur maximale de la clé (par ordre alphabétique)Ex. Au lieu de trouver la valeur maximale de la clé par ordre alphabétique, vous devrez peut-être trouver la clé maximale par longueur de clé:
>>>max(d.keys(), key=lambda x: len(x)) 'artwork'
dans cet exemple, la fonction lambda renvoie la longueur de la clé qui sera itérée par conséquent tout en évaluant les valeurs au lieu de considérer par ordre alphabétique, elle gardera une trace de la longueur maximale de la clé et retournera la clé qui a la longueur maximale
Ex.
>>> max(d.keys(), key=lambda x: d[x]) 'friend'
dans cet exemple, la fonction lambda renvoie la valeur de la clé de dictionnaire correspondante qui a la valeur maximale
la source