Depois de ler tudo que pude encontrar sobre lambda, ainda não entendi como fazer o que eu quero.
Todos usam o exemplo:
lambda x, y : x + y
Por que você precisa indicar x
e y
antes de :
? Além disso, como você faz com que ele retorne vários argumentos?
por exemplo:
self.buttonAdd_1 = Button(self, text='+', command=lambda : self.calculate(self.buttonOut_1.grid_info(), 1))
Isso funciona muito bem. Mas o código a seguir não:
self.entry_1.bind("<Return>", lambda : self.calculate(self.buttonOut_1.grid_info(), 1))
Isso produz o erro:
TypeError: () não aceita argumentos (1 fornecido)
fonte
(train["pred_idx_cos"],train["target"]).apply(lambda x,y: get_result(x, y))
e parece que não funciona. Por favor, salve minha alma da névoa da programação processualAcredito que o bind sempre tenta enviar um parâmetro de evento. Experimentar:
self.entry_1.bind("<Return>", lambda event: self.calculate(self.buttonOut_1.grid_info(), 1))
Você aceita o parâmetro e nunca o usa.
fonte
Porque é uma definição de função e precisa saber quais parâmetros a função aceita e em que ordem. Ele não pode apenas olhar para a expressão e usar os nomes das variáveis nela, porque alguns desses nomes você pode querer usar para os valores das variáveis locais ou globais existentes, e mesmo se fizesse isso, não saberia em que ordem deve esperar obtê-los.
Sua mensagem de erro significa que Tk está chamando seu lambda com um argumento, enquanto seu lambda é escrito para não aceitar nenhum argumento. Se você não precisa do argumento, aceite um e não o use. ( Demosthenex tem o código , eu o teria postado, mas fui derrotado).
fonte
Você poderia, na verdade, em algumas situações (quando você tem apenas um argumento), não colocar xey antes de ":".
>>> flist = [] >>> for i in range(3): ... flist.append(lambda : i)
mas o i no lambda será vinculado pelo nome, então,
>>> flist[0]() 2 >>> flist[2]() 2 >>>
diferente do que você pode querer.
fonte