Estou tentando descobrir lambdas em Python. O lambda é um daqueles itens de linguagem "interessantes" que na vida real devem ser esquecidos?
Tenho certeza de que há alguns casos extremos nos quais isso pode ser necessário, mas, dada a obscuridade, o potencial de ser redefinido em versões futuras (minha suposição com base nas várias definições) e a clareza de codificação reduzida - caso isso ocorra ser evitado?
Isso me lembra transbordar (buffer overflow) dos tipos C - apontando para a variável superior e sobrecarregando para definir os outros valores de campo. Parece uma espécie de espetáculo técnico, mas um pesadelo para os codificadores de manutenção.
Respostas:
Você está falando sobre funções lambda ? Gostar
Essas coisas são realmente bastante úteis. O Python suporta um estilo de programação chamado programação funcional, onde você pode passar funções para outras funções para fazer coisas. Exemplo:
define
mult3
como[3, 6, 9]
, os elementos da lista original que são múltiplos de 3. Isso é mais curto (e, pode-se argumentar, mais claro) do queObviamente, nesse caso em particular, você poderia fazer o mesmo que uma compreensão de lista:
(ou mesmo como
range(3,10,3)
), mas existem muitos outros casos de uso mais sofisticados nos quais você não pode usar uma compreensão de lista e uma função lambda pode ser a maneira mais curta de escrever algo.Retornando uma função de outra função
Isso geralmente é usado para criar wrappers de função, como os decoradores do Python.
Combinando elementos de uma sequência iterável com
reduce()
Classificando por uma chave alternativa
Eu uso funções lambda regularmente. Demorei um pouco para me acostumar com eles, mas acabei percebendo que eles são uma parte muito valiosa da linguagem.
fonte
','.join(str(x) for x in [1,2,3,4,5,6,7,8,9])
lambda
funções podem ser anônimas (como estão em todos os seus exemplos). Se você está atribuindo umalambda
função a qualquer coisa, então você está fazendo errado e deve usardef
em vezlambda
é apenas uma maneira elegante de dizerfunction
. Além do nome, não há nada obscuro, intimidador ou enigmático. Ao ler a seguinte linha, substitualambda
porfunction
:Apenas define uma função de
x
. Algumas outras línguas, comoR
, dizem explicitamente:Entende? É uma das coisas mais naturais a se fazer em programação.
fonte
lambda
muito simples de entender. Obrigado!lambda
porfunction
em sua mente e adicionarreturn
antes da última expressãotype(lambda x: 3)
.lambda
expressões edef
instruções geramfunction
objetos; é apenas a sintaxe de umalambda
expressão que limita quais instâncias ela pode produzir.lambda
expressão não significa que o resultado de umalambda
expressão não seja uma função.O resumo de duas linhas:
lambda
chave do Python : desnecessária, ocasionalmente útil. Se você estiver fazendo algo remotamente complexo com ela, guarde-a e defina uma função real.fonte
Um lambda é parte de um mecanismo de abstração muito importante que lida com funções de ordem superior. Para obter um entendimento adequado de seu valor, assista às lições de alta qualidade de Abelson e Sussman e leia o livro SICP
Essas são questões relevantes nos negócios modernos de software e cada vez mais populares.
fonte
lambda
funções de primeira classe. Python tem umalambda
declaração extremamente limitada , mas possui funções totalmente de primeira classe. A única diferença que faz é que você precisa nomear as funções que deseja transmitir.lambdas são extremamente úteis na programação da GUI. Por exemplo, digamos que você esteja criando um grupo de botões e que deseja usar um único retorno de chamada paramaterizado em vez de um retorno de chamada único por botão. O Lambda permite fazer isso com facilidade:
(Nota: embora esta pergunta esteja especificamente perguntando
lambda
, você também pode usar functools.partial para obter o mesmo tipo de resultado)A alternativa é criar um retorno de chamada separado para cada botão, o que pode levar à duplicação do código.
fonte
value
é definido em um loop; no outro exemplo, o parâmetro sempre teve apenas um valor. Quando você adiciona algo comoarg=value
, está anexando o valor atual ao retorno de chamada. Sem ele, você vincula uma referência à variável no retorno de chamada. A referência sempre conterá o valor final da variável, pois o retorno de chamada ocorre algum tempo depois que o loop já terminou a execução.functools.partial()
que permite fazer isso com menos sujeira (e semlambda
).partial(my_callback, value)
vslambda arg=value: my_callback(arg)
- o lambda tem muito mais cruft (atribuição ao arg e depois uso) e fica menos claro qual é a intenção (você pode estar fazendo algo sutilmente diferente no lambda). As importações não são realmente um problema (você tem uma pilha de qualquer maneira e é uma vez por arquivo). O código é melhor julgado pelo quão bem ele lê epartial()
é muito mais fácil de ler do que o lambda.Duvido que lambda vá embora. Veja o post de Guido sobre finalmente desistir de tentar removê-lo. Veja também um esboço do conflito .
Você pode conferir esta postagem para obter mais informações sobre o negócio por trás dos recursos funcionais do Python: http://python-history.blogspot.com/2009/04/origins-of-pythons-functional-features.html
Meus dois centavos: Raramente o lambda vale tanto quanto a clareza. Geralmente, há uma solução mais clara que não inclui lambda.
fonte
No Python,
lambda
é apenas uma maneira de definir funções embutidas,e..
..é exatamente o mesmo.
Não há nada que você possa fazer com o lambda que você não possa fazer com uma função regular - as funções do Python são um objeto como qualquer outra coisa, e os lambdas simplesmente definem uma função:
Sinceramente, acho que a
lambda
palavra-chave é redundante no Python - nunca tive a necessidade de usá-las (ou vi uma usada onde uma função regular, uma compreensão de lista ou uma das muitas funções incorporadas poderiam ser melhor utilizadas)Para um exemplo completamente aleatório, do artigo "O lambda do Python está quebrado!" :
Eu diria que, mesmo que isso funcionasse, é horrível e "não-tônico", a mesma funcionalidade poderia ser escrita de inúmeras outras maneiras, por exemplo:
Sim, não é a mesma coisa, mas nunca vi uma causa em que a geração de um grupo de funções lambda em uma lista fosse necessária. Pode fazer sentido em outras linguagens, mas Python não é Haskell (ou Lisp, ou ...)
Editar:
Existem alguns casos em que o lambda é útil, por exemplo, geralmente é conveniente ao conectar sinais em aplicativos PyQt, como este:
Apenas fazer
w.textChanged.connect(dothing)
chamaria odothing
método com umevent
argumento extra e causaria um erro. Usar o lambda significa que podemos descartar o argumento de maneira organizada sem precisar definir uma função de quebra automática.fonte
a
que você definiu não são exatamente os mesmos. :) Eles diferem em__name__
campo, pelo menos ...Acho o lambda útil para uma lista de funções que fazem o mesmo, mas para circunstâncias diferentes.
Como as regras plurais do Mozilla :
Se você tivesse que definir uma função para todos, ficaria louco até o final.
Além disso, não seria bom com nomes de funções como
plural_rule_1
,plural_rule_2
etc. E você precisariaeval()
disso quando depender de um ID de função variável.fonte
Praticamente tudo o que você pode fazer
lambda
pode ser melhor com funções nomeadas ou expressões de lista e gerador.Consequentemente, na maioria das vezes você deve apenas um daqueles em praticamente qualquer situação (exceto, talvez, pelo código de rascunho escrito no intérprete interativo).
fonte
Uso Python há alguns anos e nunca me deparei com um caso em que precisei de lambda. Realmente, como o tutorial afirma, é apenas para açúcar sintático.
fonte
Não posso falar com a implementação específica do lambda em python, mas, em geral, as funções lambda são realmente úteis. Eles são uma técnica central (talvez até a técnica) de programação funcional e também são muito úteis em programas orientados a objetos. Para certos tipos de problemas, eles são a melhor solução, portanto, certamente não devem ser esquecidos!
Sugiro que você leia sobre os fechamentos e a função map (que se vincula aos documentos python, mas existe em quase todas as linguagens que suportam construções funcionais) para ver por que é útil.
fonte
Função Lambda é uma maneira não-burocrática de criar uma função.
É isso aí. Por exemplo, suponhamos que você tenha sua função principal e precise quadrado dos valores. Vamos ver a maneira tradicional e a maneira lambda de fazer isso:
Caminho tradicional:
A maneira lambda:
Veja a diferença?
As funções do Lambda vão muito bem com listas, como compreensão de listas ou mapa. De fato, a compreensão da lista é uma maneira "pitônica" de se expressar usando lambda. Ex:
Vamos ver o que cada elemento da sintaxe significa:
Isso é conveniente? Criando funções como esta. Vamos reescrevê-lo usando lambda:
Agora vamos usar o mapa, que é a mesma coisa, mas mais neutro em termos de idioma. O Maps usa dois argumentos:
(i) uma função
(ii) um iterável
E fornece uma lista na qual cada elemento é a função aplicada a cada elemento do iterável.
Então, usando o mapa, teríamos:
Se você dominar lambdas e mapeamento, terá um grande poder de manipular dados de maneira concisa. As funções do Lambda não são obscuras nem tiram a clareza do código. Não confunda algo difícil com algo novo. Depois de começar a usá-los, você ficará bem claro.
fonte
Uma das coisas boas sobre
lambda
isso, na minha opinião, é discreta: é uma maneira de adiar uma avaliação para formulários simples até que o valor seja necessário. Deixe-me explicar.Muitas rotinas de biblioteca são implementadas para permitir que determinados parâmetros sejam chamados (dos quais lambda é um). A idéia é que o valor real será calculado apenas no momento em que será usado (e não quando for chamado). Um exemplo (artificial) pode ajudar a ilustrar o ponto. Suponha que você tenha uma rotina que registraria um determinado registro de data e hora. Você deseja que a rotina use o horário atual menos 30 minutos. Você chamaria assim
Agora, suponha que a função real seja chamada apenas quando ocorrer um determinado evento e você deseja que o carimbo de data e hora seja calculado apenas nesse momento. Você pode fazer isso assim
Supondo que a
log_timestamp
lata possa manipular chamadas de chamada como essa, ela avaliará isso quando precisar e você receberá o carimbo de data / hora nesse momento.É claro que existem maneiras alternativas de fazer isso (usando o
operator
módulo, por exemplo), mas espero ter transmitido o ponto.Atualização : Aqui está um exemplo do mundo real um pouco mais concreto.
Atualização 2 : Eu acho que este é um exemplo do que é chamado de thunk .
fonte
Como mencionado acima, o operador lambda no Python define uma função anônima e, no Python, as funções são encerramentos. É importante não confundir o conceito de fechamento com o operador lambda, que é meramente metadona sintática para eles.
Quando eu comecei no Python, há alguns anos, usei muito lambdas, pensando que eram legais, juntamente com a compreensão da lista. No entanto, escrevi e tenho que manter um grande site escrito em Python, da ordem de vários milhares de pontos de função. Aprendi por experiência própria que os lambdas podem ser bons para prototipar as coisas, mas não oferecem nada sobre funções embutidas (encerramentos nomeados), exceto para salvar alguns toques de tecla, ou às vezes não.
Basicamente, isso se resume a vários pontos:
Isso é motivo suficiente para reuni-los e convertê-los em fechamentos nomeados. No entanto, tenho dois outros rancores contra fechamentos anônimos.
O primeiro rancor é simplesmente o fato de serem apenas mais uma palavra-chave desnecessária que atravessa o idioma.
O segundo rancor é mais profundo e no nível do paradigma, ou seja, eu não gosto que eles promovam um estilo de programação funcional, porque esse estilo é menos flexível que os estilos de passagem de mensagem, orientada a objetos ou procedimentais, porque o cálculo lambda não é de Turing. complete (felizmente em Python, ainda podemos romper essa restrição mesmo dentro de uma lambda). As razões pelas quais sinto que as lambdas promovem esse estilo são:
Há um retorno implícito, ou seja, eles parecem que "deveriam" ser funções.
Eles são um mecanismo alternativo de ocultação de estado para outro mecanismo mais explícito, mais legível, mais reutilizável e mais geral: métodos.
Tento muito escrever Python sem lambda e removê-las à vista. Eu acho que Python seria uma linguagem um pouco melhor sem lambdas, mas essa é apenas a minha opinião.
fonte
Y = lambda f: (lambda x: x(x))(lambda y: f(lambda *args: y(y)(*args)))
Na verdade, os lambdas são construções muito poderosas que derivam de idéias em programação funcional, e é algo que nunca será facilmente revisado, redefinido ou removido no futuro próximo do Python. Eles ajudam a escrever um código mais poderoso, pois permite passar funções como parâmetros, assim, a idéia de funções como cidadãos de primeira classe.
As lambdas tendem a ficar confusas, mas depois que um entendimento sólido é obtido, você pode escrever um código limpo e elegante como este:
A linha de código acima retorna uma lista dos quadrados dos números na lista. Claro, você também pode fazê-lo como:
É óbvio que o código anterior é mais curto, e isso é especialmente verdadeiro se você pretende usar a função map (ou qualquer função semelhante que utilize uma função como parâmetro) em apenas um local. Isso também torna o código mais intuitivo e elegante.
Além disso, como @David Zaslavsky mencionou em sua resposta, a compreensão da lista nem sempre é o caminho a percorrer, especialmente se sua lista precisa obter valores de alguma maneira matemática obscura.
Do ponto de vista mais prático, uma das maiores vantagens das lambdas para mim recentemente foi na GUI e na programação orientada a eventos. Se você der uma olhada nos retornos de chamada no Tkinter, todos eles tomam como argumentos o evento que os acionou. Por exemplo
Agora, e se você tivesse alguns argumentos para passar? Algo tão simples como passar 2 argumentos para armazenar as coordenadas de um clique do mouse. Você pode facilmente fazer assim:
Agora você pode argumentar que isso pode ser feito usando variáveis globais, mas você quer realmente se preocupar com gerenciamento de memória e vazamento, especialmente se a variável global for usada apenas em um local específico? Isso seria apenas um estilo de programação ruim.
Em resumo, as lambdas são impressionantes e nunca devem ser subestimadas. Os lambdas Python não são os mesmos que os lambdas LISP (que são mais poderosos), mas você pode realmente fazer muitas coisas mágicas com eles.
fonte
main
edo_something_cool
? O que acontece comx
ey
na função? Os valores passados parecem ser imediatamente substituídos? Como a função conheceevent
? Você poderia adicionar alguns comentários / explicações? Obrigadox
ey
como argumentos parado-something-cool
e seus valores estão sendo definidos na função para ilustrar como você pode usar lambdas para passar argumentos onde nenhum é esperado. Awidget.bind
função espera umevent
parâmetro que identifique o evento da GUI nesse widget específico. Eu recomendo a leitura no modelo de programação do Tkinter para maior clareza.x,y
e entendex=event.x
. Isso não substitui o valor que você passou? E como a função sabe o queevent
é? Não vejo onde você passa isso para a função. Ou é um método? Você também tem sinais de menos em um nome de função?x, y
, isso é apenas um exemplo para fins ilustrativos. Estou tentando mostrar o poder das lambdas, não de Tkinter. :)event
? nesse caso, seu lambda não deveria lerlambda event: do_something_cool(event,x,y)
?Lambdas estão profundamente ligadas ao estilo de programação funcional em geral. A idéia de que você pode resolver problemas aplicando uma função a alguns dados e mesclando os resultados é o que o Google usa para implementar a maioria de seus algoritmos.
Os programas escritos no estilo de programação funcional são facilmente paralelizados e, portanto, estão se tornando cada vez mais importantes nas modernas máquinas multinúcleo. Então, resumindo, NÃO, você não deve esquecê-los.
fonte
Primeiros parabéns que conseguiram descobrir lambda. Na minha opinião, é realmente uma construção poderosa para agir. A tendência atual para linguagens de programação funcionais é certamente um indicador de que ela não deve ser evitada nem será redefinida no futuro próximo.
Você só precisa pensar um pouco diferente. Tenho certeza que em breve você vai adorar. Mas tenha cuidado se você lida apenas com python. Como o lambda não é um fechamento real, ele é "quebrado" de alguma forma: pitões lambda são quebrados
fonte
Observe que isso não é uma condenação de nada. Todo mundo tem um conjunto diferente de coisas que não acontecem facilmente.
Não.
Não é obscuro. Nas duas últimas equipes em que trabalhei, todo mundo usava esse recurso o tempo todo.
Não vi propostas sérias para redefini-lo no Python, além de corrigir a semântica de fechamento alguns anos atrás.
Não está menos claro, se você estiver usando certo. Pelo contrário, ter mais construções de linguagem disponíveis aumenta a clareza.
Lambda é como buffer overflow? Uau. Não consigo imaginar como você está usando o lambda se você acha que é um "pesadelo de manutenção".
fonte
Eu uso lambdas para evitar duplicação de código. Isso tornaria a função facilmente compreensível, por exemplo:
Eu substituo isso por um temp lambda
fonte
Comecei a ler o livro de David Mertz hoje 'Text Processing in Python'. Embora ele tenha uma descrição bastante concisa dos exemplos de Lambda, os exemplos no primeiro capítulo combinados com a explicação no Apêndice A os fizeram pular da página para mim (finalmente) e, de repente, entendi seu valor. Isso não quer dizer que a explicação dele funcionará para você e eu ainda estou no estágio de descoberta, por isso não tentarei adicionar essas respostas além das seguintes: Eu sou novo no Python Eu sou novo no OOP Lambdas foram uma luta para mim Agora que li Mertz, acho que as compreendo e as vejo tão úteis quanto acho que permitem uma abordagem mais limpa da programação.
Ele reproduz o Zen de Python, cuja linha é simples, é melhor que complexa. Como programador não OOP, lendo código com lambdas (e até a lista de compreensões da semana passada), pensei: isso é simples? . Finalmente, percebi hoje que, na verdade, esses recursos tornam o código muito mais legível e compreensível do que a alternativa - que é invariavelmente um loop de algum tipo. Eu também percebi que, como as demonstrações financeiras, o Python não foi projetado para o usuário iniciante, mas para o usuário que deseja ser educado. Não acredito como essa linguagem é poderosa. Quando me ocorreu (finalmente) o objetivo e o valor das lambdas, eu queria criar cerca de 30 programas e começar a colocar lambdas sempre que apropriado.
fonte
Um caso útil para usar lambdas é melhorar a legibilidade das compreensões de listas longas . Neste exemplo,
loop_dic
é uma abreviação de clareza, mas imagineloop_dic
ser muito longo. Se você usasse apenas um valor simples que inclua, emi
vez da versão lambda desse valor, obteria umNameError
.Ao invés de
fonte
Posso dar um exemplo em que eu realmente precisava de um lambda sério. Estou criando um programa gráfico, em que o uso clica com o botão direito do mouse em um arquivo e atribui a ele uma das três opções. Acontece que no Tkinter (o programa de interface da GUI em que estou escrevendo isso), quando alguém pressiona um botão, ele não pode ser atribuído a um comando que recebe argumentos. Portanto, se eu escolher uma das opções e desejar que o resultado da minha escolha seja:
Então não é grande coisa. Mas e se eu precisar da minha escolha para ter um detalhe específico. Por exemplo, se eu escolher a opção A, ela chamará uma função que aceita algum argumento que depende da opção A, B ou C, o TKinter não suportaria isso. Lamda era a única opção para contornar isso, na verdade ...
fonte
def foo...
e depois passado emfoo
vez delambda
. É apenas mais código e você precisa criar um nome.Eu o uso com bastante frequência, principalmente como um objeto nulo ou para ligar parcialmente parâmetros a uma função.
Aqui estão alguns exemplos:
para implementar o padrão de objeto nulo:
para ligação de parâmetro:
digamos que eu tenho a seguinte API
Então, quando não quiser despejar rapidamente os dados recebidos em um arquivo, faço o seguinte:
fonte
eu uso
lambda
para criar retornos de chamada que incluem parâmetros. É mais limpo escrever um lambda em uma linha do que escrever um método para executar a mesma funcionalidade.Por exemplo:
em oposição a:
fonte
Como sou iniciante em python, para obter uma idéia clara do lambda, comparei-o com um loop 'for'; em termos de eficiência. Aqui está o código (python 2.7) -
fonte
timeit
módulo, que normalmente fornece resultados mais precisos do que subtraindotime.time()
valores.Lambda é um construtor de procedimentos. Você pode sintetizar programas em tempo de execução, embora o lambda do Python não seja muito poderoso. Observe que poucas pessoas entendem esse tipo de programação.
fonte