Dies ist eine Tippfrage zum Golfen in Python.
Beim Python-Golfen ist es üblich, dass eine Vorlage eine als Lambda definierte Funktion ist. Beispielsweise,
f=lambda x:0**x or x*f(x-1)
berechnet die Fakultät von x.
Das Lambda-Format hat zwei große Vorteile :
- Die Kesselplatte von
f=lambda x:...
oderlambda x:...
ist kürzer als die vondef f(x):...return...
oderx=input()...print...
- Ein rekursiver Aufruf kann verwendet werden, um eine Schleife mit geringem Byte-Overhead auszuführen.
Lambdas haben jedoch den großen Nachteil, dass sie nur einen einzigen Ausdruck zulassen, keine Aussagen. Insbesondere bedeutet dies keine Zuordnungen wie c=chr(x+65)
. Dies ist problematisch, wenn ein langer Ausdruck vorhanden ist, auf dessen Wert zweimal (oder öfter) verwiesen werden muss.
Zuweisungen wie E=enumerate
sind außerhalb der Funktion oder als optionales Argument möglich, jedoch nur, wenn sie nicht von den Funktionseingaben abhängen. Optionale Argumente wie f=lambda n,k=min(n,0):...
fail, da die Eingabe n
nicht definiert wurde, wenn sie k
zum Definitionszeitpunkt ausgewertet wird.
Das Ergebnis ist, dass Sie manchmal einen langen Ausdruck in einem Lambda wiederholen, weil die Alternative ein langwieriges Nicht-Lambda ist.
lambda s:s.strip()+s.strip()[::-1]
def f(s):t=s.strip();print t+t[::-1]
Die Gewinnschwelle beträgt ungefähr 11 Zeichen ( Details ), nach denen Sie zu einem def
oder wechseln program
. Vergleichen Sie dies mit dem üblichen Break-Even der Länge 5 für einen wiederholten Ausdruck:
range(a)+range(b)
r=range;r(a)+r(b)
print s[1:],s[1:]*2
r=s[1:];print r,r*2
Andere Sprachen haben Workarounds, zum Beispiel Octave . Es gibt bekannte Tricks für Python, aber sie sind langwierig, klobig und / oder nur eingeschränkt verwendbar. Eine kurze, universelle Methode zur Simulation der Zuordnung in einem Lambda würde das Python-Golfen revolutionieren.
Wie kann ein Python-Golfer diese Einschränkung überwinden oder umgehen? Welche potenziellen Ideen sollten sie in Betracht ziehen, wenn sich ein langer Ausdruck in einem Lambda zweimal wiederholt?
Mein Ziel mit dieser Frage ist es, tief in dieses Problem einzutauchen und:
- Katalogisieren und analysieren Sie Golf-Workarounds, um die Zuordnung innerhalb eines Lambdas zu fälschen
- Entdecken Sie neue Leads für bessere Methoden
Jede Antwort sollte eine Problemumgehung oder einen möglichen Hinweis enthalten.
lambda s:(s+s[::-1]).lower()
. Dies beantwortet natürlich nicht die eigentliche Frage.
strip
.