Esta é uma pergunta de dicas para jogar golfe em Python.
No golfe em Python, é comum que um envio seja uma função definida como um lambda. Por exemplo,
f=lambda x:0**x or x*f(x-1)
calcula o fatorial de x.
O formato lambda tem duas grandes vantagens :
- O boilerplate de
f=lambda x:...
oulambda x:...
é mais curto que odef f(x):...return...
oux=input()...print...
- Uma chamada recursiva pode ser usada para fazer um loop com pouca sobrecarga de bytes.
No entanto, as lambdas têm a grande desvantagem de permitir apenas uma única expressão, sem instruções. Em particular, isso significa que não há tarefas como c=chr(x+65)
. Isso é problemático quando se tem uma expressão longa cujo valor precisa ser referenciado duas vezes (ou mais).
Atribuições como E=enumerate
são possíveis fora da função ou como argumento opcional, mas somente se elas não dependerem das entradas da função. Argumentos opcionais como f=lambda n,k=min(n,0):...
falha porque a entrada n
não foi definida quando k
é avaliada no momento da definição.
O resultado é que, às vezes, você aspira repetir uma expressão longa em uma lambda porque a alternativa é uma longa não lambda.
lambda s:s.strip()+s.strip()[::-1]
def f(s):t=s.strip();print t+t[::-1]
O ponto de equilíbrio é de cerca de 11 caracteres ( detalhes ), após o qual você alterna para um def
ou program
. Compare isso com o ponto de equilíbrio usual de comprimento 5 para uma expressão repetida:
range(a)+range(b)
r=range;r(a)+r(b)
print s[1:],s[1:]*2
r=s[1:];print r,r*2
Outros idiomas têm soluções alternativas, oitava por exemplo . Existem truques conhecidos para o Python, mas eles são longos, desajeitados e / ou de uso limitado. Um método curto e de uso geral para simular a atribuição em um lambda revolucionaria o golfe em Python.
Quais são as maneiras de um jogador de golfe Python superar ou contornar essa limitação? Que idéias potenciais eles devem ter em mente quando vêem uma expressão longa repetida duas vezes em uma lambda?
Meu objetivo com esta pergunta de dicas é mergulhar profundamente nesse problema e:
- Catalogue e analise soluções alternativas de golfe para atribuições falsas dentro de uma lambda
- Explore novos leads para melhores métodos
Cada resposta deve explicar uma solução alternativa ou potencial lead.
lambda s:(s+s[::-1]).lower()
. Claro que isso não responde à pergunta real.
strip
.