Eu venho do fundo OOP e tentando aprender python. Eu estou usando a max
função que usa uma expressão lambda para retornar a instância do tipo Player
com o máximo totalScore
entre a lista players
.
def winner():
w = max(players, key=lambda p: p.totalScore)
A função retorna corretamente a instância do tipo Player
com o máximo totalScore
. Estou confuso sobre as três coisas a seguir:
- Como a
max
função funciona? Quais são os argumentos que está tomando? Eu olhei para a documentação, mas não entendi. - Qual é o uso da palavra-chave
key
na função max? Eu sei que também é usado no contexto dasort
função - Significado da expressão lambda? Como lê-los? Como eles funcionam?
Todas essas são questões conceituais muito nobres, mas me ajudarão a entender a linguagem. Ajudaria se você pudesse dar exemplos para explicar. obrigado
python max lambda
e talvez seja realmente mais útil para novos usuários.Respostas:
lambda
é uma função anônima, é equivalente a:Agora
max
se torna:Porém, como
def
declarações são declarações compostas, elas não podem ser usadas onde uma expressão é necessária, é por isso que às vezeslambda
são usadas.Observe que isso
lambda
é equivalente ao que você colocaria em uma declaração de retorno de adef
. Portanto, você não pode usar instruções dentro de alambda
, apenas expressões são permitidas.O que
max
faz?Portanto, ele simplesmente retorna o objeto que é o maior.
Como
key
funciona?Por padrão, no Python 2
key
compara itens com base em um conjunto de regras com base no tipo de objetos (por exemplo, uma string é sempre maior que um número inteiro).Para modificar o objeto antes da comparação ou para comparar com base em um atributo / índice específico, use o
key
argumentoExemplo 1:
Um exemplo simples, suponha que você tenha uma lista de números em forma de sequência, mas deseja comparar esses itens pelo valor inteiro.
Aqui,
max
os itens são comparados usando seus valores originais (as strings são comparadas lexicograficamente para que você obtenha'2'
como saída):Para comparar os itens pelo valor inteiro, use
key
um simpleslambda
:Exemplo 2: Aplicando
max
a uma lista de tuplas.Por padrão
max
, os itens serão comparados pelo primeiro índice. Se o primeiro índice for o mesmo, ele comparará o segundo índice. Como no meu exemplo, todos os itens têm um primeiro índice exclusivo, então você recebe isso como resposta:Mas e se você quiser comparar cada item pelo valor no índice 1? Simples: use
lambda
:Comparando itens em um iterável que contém objetos de tipos diferentes :
Lista com itens mistos:
No Python 2, é possível comparar itens de dois tipos diferentes :
Mas no Python 3 você não pode mais fazer isso :
Mas isso funciona, pois estamos comparando a versão inteira de cada objeto:
fonte
lengths = map(lambda word: len(word), words)
ondewords=['It', 'is', 'raining', 'cats', 'and', 'dogs']
vejo que o lambda está repetindo todas as palavras da lista. Sempre faz isso?max
notlambda
(key
arg é opcional), e durante a iteração, cada item é passado para a função especificada emkey
e o valor retornado é usado para comparação.max(lis, key=lambda x:int(x))
pode ser simplificado comomax(lis, key=int)
. Python tem uma função interna, int (). Da mesma forma, você pode usar outras funções internas comokey
argumento. Por exemplo, você pode obter a mais longa seqüência delis=['a', 'aa', 'aaa']
pormax(lis, key=len)
max
,min
,sorted
etc corretamente. Além disso, mencioneimax(lis, key=int)
no final. :-)Versão fortemente simplificada de
max
:Em relação ao lambda:
fonte
Ele procura o item "maior" em um iterável. Eu presumo que você pode procurar o que é isso, mas se não, é algo que você pode fazer um loop, ou seja, uma lista ou string.
Key
é uma função lambda que informamax
quais objetos no iterável são maiores que outros. Diga se você estava classificando algum objeto que você mesmo criou, e não algo óbvio, como números inteiros.Essa é uma pergunta maior. Em termos simples, um lambda é uma função que você pode transmitir e ter outras partes do código que o usam. Veja isso por exemplo:
Isso leva dois objetos,
a
eb
, e uma funçãof
. Ele chamaf()
cada objeto e os adiciona. Então veja esta chamada:sum()
pega2
e chama a expressão lambda nela. Entãof(a)
torna-se2 * 2
, que se torna 4. Em seguida, faz issob
e soma os dois.Em termos não tão simples, as lambdas vêm do cálculo lambda, que é a idéia de uma função que retorna uma função; um conceito matemático muito legal para expressar computação. Você pode ler sobre isso aqui e entendê- lo aqui .
Provavelmente é melhor ler um pouco mais sobre isso, pois as lambdas podem ser confusas e não é imediatamente óbvio o quanto elas são úteis. Confira aqui .
fonte
max
A função é usada para obter o máximo de umiterable
.Os iteradores podem ser listas, tuplas, objetos de ditado, etc. Ou até objetos personalizados, como no exemplo que você forneceu.
Então,
key=func
basicamente nos permite passar um argumento opcionalkey
para a função em cuja base o iterador / argumentos fornecidos são classificados e o máximo é retornado.lambda
é uma palavra-chave python que atua como uma pseudo função. Então, quando você passa umplayer
objeto para ele, ele retornaráplayer.totalScore
. Assim, o iterável passado para a funçãomax
será classificado de acordo com okey
total de pontuação dosplayer
objetos dados e retornaráplayer
quem tiver o máximototalScore
.Se nenhum
key
argumento for fornecido, o máximo será retornado de acordo com as ordens padrão do Python.Exemplos -
fonte
De acordo com a documentação :
O que isto está dizendo é que, no seu caso, você está fornecendo uma lista, neste caso
players
. Amax
função irá percorrer todos os itens da lista e compará-los entre si para obter um "máximo".Como você pode imaginar, com um objeto complexo como
player
determinar seu valor para comparação é complicado, então você recebe okey
argumento para determinar como amax
função decidirá o valor de cada umplayer
. Nesse caso, você está usando uma função lambda para dizer "para cada ump
emplayers
getp.totalscore
e usar isso como seu valor para comparação".fonte
max
é uma função incorporada que recebe o primeiro argumento aniterable
(como lista ou tupla)O argumento da palavra-chave
key
tem seu valor padrão,None
mas aceita a função para avaliar, considere-o como wrapper que avalia iterável com base na funçãoConsidere este exemplo de dicionário:
Ex:
Como você pode ver se você apenas passa o iterável sem kwarg (uma função para
key
), ele está retornando o valor máximo da chave (em ordem alfabética)Ex. Em vez de encontrar o valor máximo da chave em ordem alfabética, pode ser necessário encontrar a chave máxima pelo comprimento da chave:
Neste exemplo, a função lambda está retornando o comprimento da chave que será iterada, portanto, ao avaliar os valores em vez de considerar alfabeticamente, ela acompanhará o comprimento máximo da chave e retornará a chave que possui o comprimento máximo
Ex.
neste exemplo, a função lambda está retornando o valor da chave de dicionário correspondente que possui o valor máximo
fonte