Esta es una pregunta de consejos para jugar golf en Python.
En el golf de Python, es común que un envío sea una función definida como lambda. Por ejemplo,
f=lambda x:0**x or x*f(x-1)
calcula el factorial de x.
El formato lambda tiene dos grandes ventajas :
- La repetitiva de
f=lambda x:...
olambda x:...
es más corta que ladef f(x):...return...
ox=input()...print...
- Se puede usar una llamada recursiva para hacer un bucle con una pequeña sobrecarga de bytes.
Sin embargo, las lambdas tienen el gran inconveniente de permitir solo una sola expresión, sin declaraciones. En particular, esto significa que no hay tareas como c=chr(x+65)
. Esto es problemático cuando uno tiene una expresión larga cuyo valor necesita ser referenciado dos veces (o más).
Las asignaciones como E=enumerate
son posibles fuera de la función o como argumento opcional, pero solo si no dependen de las entradas de la función. Argumentos opcionales como f=lambda n,k=min(n,0):...
error porque la entrada n
no se ha definido cuando k
se evalúa en el momento de la definición.
El resultado es que a veces apestas repetir una expresión larga en una lambda porque la alternativa es una larga no lambda.
lambda s:s.strip()+s.strip()[::-1]
def f(s):t=s.strip();print t+t[::-1]
El punto de equilibrio es de aproximadamente 11 caracteres ( detalles ), pasado el cual cambia a un def
o program
. Compare esto con el punto de equilibrio habitual de longitud 5 para una expresión repetida:
range(a)+range(b)
r=range;r(a)+r(b)
print s[1:],s[1:]*2
r=s[1:];print r,r*2
Otros idiomas tienen soluciones alternativas, por ejemplo , Octave . Hay trucos conocidos para Python, pero son largos, torpes y / o de uso limitado. Un método breve y de propósito general para simular la asignación en una lambda revolucionaría el golf de Python.
¿Cuáles son las formas para que un golfista de Python supere o evite esta limitación? ¿Qué ideas potenciales deberían tener en mente cuando ven una expresión larga repetida dos veces en una lambda?
Mi objetivo con esta pregunta de consejos es profundizar en este problema y:
- Cataloga y analiza soluciones de golf para falsificar tareas dentro de una lambda
- Explore nuevos clientes potenciales para obtener mejores métodos
Cada respuesta debe explicar una solución alternativa o potencial cliente potencial.
lambda s:(s+s[::-1]).lower()
. Por supuesto, esto no responde la pregunta real.
strip
.