To jest wskazówka dotycząca gry w golfa w Pythonie.
W golfie w Pythonie podporządkowanie jest funkcją zdefiniowaną jako lambda. Na przykład,
f=lambda x:0**x or x*f(x-1)
Format lambda ma dwie duże zalety :
- Płyta kotła
f=lambda x:...
lublambda x:...
jest krótsza niżdef f(x):...return...
lubx=input()...print...
- Wywołanie rekurencyjne może być użyte do zapętlenia z niewielkim narzutem bajtowym.
Jednak lambdas mają tę wadę, że pozwalają tylko na jedno wyrażenie, bez instrukcji. W szczególności oznacza to brak zadań takich jak c=chr(x+65)
. Jest to problematyczne, gdy ktoś ma długie wyrażenie, do którego wartości należy odwoływać się dwukrotnie (lub więcej).
Takie przypisania E=enumerate
są możliwe poza funkcją lub jako opcjonalny argument, ale tylko wtedy, gdy nie zależą od danych wejściowych funkcji. Argumenty opcjonalne, takie jak f=lambda n,k=min(n,0):...
niepowodzenie, ponieważ dane wejściowe n
nie zostały zdefiniowane, gdy k
są oceniane w czasie definicji.
W rezultacie czasami ssie się powtarzanie długiego wyrażenia w lambda, ponieważ alternatywą jest długa nie-lambda.
lambda s:s.strip()+s.strip()[::-1]
def f(s):t=s.strip();print t+t[::-1]
Punkt rentowności wynosi około 11 znaków ( szczegóły ), po których przełączasz się na a def
lub program
. Porównaj to ze zwykłym punktem rentowności o długości 5, aby uzyskać powtarzające się wyrażenie:
range(a)+range(b)
r=range;r(a)+r(b)
print s[1:],s[1:]*2
r=s[1:];print r,r*2
Inne języki mają obejścia, na przykład Octave . Istnieją znane triki dla Pythona, ale są one długie, niezgrabne i / lub mają ograniczone zastosowanie. Krótka, uniwersalna metoda symulacji przypisania u lambdy zrewolucjonizuje grę w golfa w Pythonie.
W jaki sposób golfista Python może pokonać to ograniczenie lub obejść go? Jakie potencjalne pomysły powinni mieć na uwadze, gdy widzą długi wyraz powtórzony dwukrotnie w lambda?
Moim celem w tym pytaniu jest zanurzenie się głęboko w ten problem i:
- Kataloguj i analizuj obejścia gry w golfa w celu sfałszowania zadania w lambda
- Odkryj nowe potencjalne szanse na lepsze metody
Każda odpowiedź powinna wyjaśniać obejście lub potencjalną potencjalną szansę.
lambda s:(s+s[::-1]).lower()
. Oczywiście to nie odpowiada na rzeczywiste pytanie.
strip
.