Ceci est une question de astuce pour jouer au golf en Python.
En golf Python, il est courant qu'une soumission soit une fonction définie comme un lambda. Par exemple,
f=lambda x:0**x or x*f(x-1)
calcule la factorielle de x.
Le format lambda présente deux grands avantages :
- Le passe-partout de
f=lambda x:...
oulambda x:...
est plus court que ledef f(x):...return...
oux=input()...print...
- Un appel récursif peut être utilisé pour effectuer une boucle avec une légère surcharge d'octet.
Cependant, les lambdas ont le gros inconvénient de ne permettre qu'une seule expression, aucune déclaration. En particulier, cela ne signifie aucune tâche comme c=chr(x+65)
. C'est problématique quand on a une expression longue dont la valeur doit être référencée deux fois (ou plus).
Des assignations comme E=enumerate
sont possibles en dehors de la fonction ou en tant qu'argument optionnel, mais uniquement si elles ne dépendent pas des entrées de la fonction. Des arguments facultatifs tels que f=lambda n,k=min(n,0):...
fail, car l’entrée n
n’a pas été définie lorsqu’elle k
est évaluée au moment de la définition.
Le résultat est que, parfois, vous aspirez à répéter une longue expression dans un lambda parce que l'alternative est un long non-lambda.
lambda s:s.strip()+s.strip()[::-1]
def f(s):t=s.strip();print t+t[::-1]
Le seuil de rentabilité est d'environ 11 caractères ( détails ), au-delà duquel vous passez en a def
ou program
. Comparez ceci au seuil de rentabilité habituel de longueur 5 pour une expression répétée:
range(a)+range(b)
r=range;r(a)+r(b)
print s[1:],s[1:]*2
r=s[1:];print r,r*2
D'autres langues ont des solutions de contournement, Octave par exemple . Il existe des astuces connues pour Python, mais elles sont longues, maladroites et / ou à usage limité. Une méthode courte et polyvalente pour simuler une assignation dans un lambda révolutionnerait le golf Python.
Quels sont les moyens pour un golfeur Python de surmonter ou de contourner cette limitation? Quelles idées potentielles devraient avoir à l'esprit lorsqu'ils voient une longue expression répétée deux fois dans un lambda?
Mon objectif avec cette question de conseils est de plonger profondément dans ce problème et:
- Cataloguez et analysez les solutions de contournement au golf pour créer une fausse affectation dans un lambda
- Explorez de nouvelles pistes pour de meilleures méthodes
Chaque réponse doit expliquer une solution de contournement ou une piste potentielle.
lambda s:(s+s[::-1]).lower()
. Bien sûr, cela ne répond pas à la question.
strip
.