Bu Python'da golf oynamak için bir ipucu.
Python golfünde, bir sunumun lambda olarak tanımlanan bir fonksiyon olması yaygındır. Örneğin,
f=lambda x:0**x or x*f(x-1)
x'in faktörünü hesaplar .
Lambda formatının iki büyük avantajı vardır :
- Bir klişe
f=lambda x:...
veyalambda x:...
daha kısadırdef f(x):...return...
yax=input()...print...
- Özyinelemeli bir çağrı, küçük bayt ek yükü ile döngü oluşturmak için kullanılabilir.
Ancak, lambdalar sadece tek bir ifadeye izin vermenin büyük bir dezavantajına sahiptir; Özellikle, bu hiçbir atama anlamına gelir c=chr(x+65)
. Bu, değerinin iki kez (veya daha fazla) referans alınması gereken uzun bir ifadeye sahip olduğunda sorunludur.
Gibi atamalar E=enumerate
, işlev dışında veya isteğe bağlı bir argüman olarak mümkündür, ancak işlev girişlerine bağlı olmadıklarında mümkündür. Tanımlama zamanında değerlendirildiğinde f=lambda n,k=min(n,0):...
girdi n
tanımlanmadığı için başarısız gibi isteğe bağlı argümanlar k
.
Sonuç olarak, bazen bir lambdada uzun bir ifadeyi tekrarlamayı emersiniz, çünkü alternatif uzun bir lambda değildir.
lambda s:s.strip()+s.strip()[::-1]
def f(s):t=s.strip();print t+t[::-1]
Kesim noktası, a veya geçiş yaptığınız yerden yaklaşık 11 karakterdir ( ayrıntılar ) . Bunu, yinelenen bir ifade için normal uzunluktaki 5 eşitlik noktası 5 ile karşılaştırın:def
program
range(a)+range(b)
r=range;r(a)+r(b)
print s[1:],s[1:]*2
r=s[1:];print r,r*2
Diğer dillerin geçici çözümleri var, örneğin Octave . Python için bilinen püf noktaları vardır, ancak bunlar uzun, tıknaz ve / veya sınırlı kullanım içindir. Bir lambdada atamayı simüle etmenin kısa, genel amaçlı bir yöntem Python golfünde devrim yaratacaktır.
Bir Python golfçüsünün bu sınırlamanın üstesinden gelmek ya da bunun üstesinden gelmek için yolları nelerdir? Bir lambdada iki kez tekrarlanan uzun bir ifade gördüklerinde akıllarında ne gibi fikirler olmalı?
Bu ipuçlarını soruyla amacım bu soruna derinlemesine dalmak ve:
- Bir lambda içinde sahte atama yapmak için golf geçici çözümlerini kataloglayın ve analiz edin
- Daha iyi yöntemler için yeni müşteri adayları keşfedin
Her cevap bir geçici çözümü veya potansiyel bir ipucunu açıklamalıdır.
lambda s:(s+s[::-1]).lower()
. Tabii bu asıl soruya cevap vermiyor.
strip
.