Ini adalah pertanyaan kiat untuk bermain golf di Python.
Dalam bermain golf Python, lazimnya pengiriman adalah fungsi yang didefinisikan sebagai lambda. Sebagai contoh,
f=lambda x:0**x or x*f(x-1)
Format lambda memiliki dua keuntungan besar :
- Pelat
f=lambda x:...
ataulambda x:...
lebih pendek daridef f(x):...return...
ataux=input()...print...
- Panggilan rekursif dapat digunakan untuk mengulang dengan overhead byte kecil.
Namun, lambdas memiliki kelemahan besar yaitu hanya mengizinkan satu ekspresi, tanpa pernyataan. Secara khusus, ini berarti tidak ada tugas yang disukai c=chr(x+65)
. Ini bermasalah ketika seseorang memiliki ekspresi panjang yang nilainya perlu direferensikan dua kali (atau lebih).
Tugas seperti E=enumerate
dimungkinkan di luar fungsi atau sebagai argumen opsional, tetapi hanya jika mereka tidak bergantung pada input fungsi. Argumen opsional seperti f=lambda n,k=min(n,0):...
gagal karena input n
belum didefinisikan ketika k
dievaluasi pada waktu definisi.
Hasilnya adalah bahwa kadang-kadang Anda menyedot pengulangan ekspresi panjang dalam lambda karena alternatifnya adalah non-lambda yang panjang.
lambda s:s.strip()+s.strip()[::-1]
def f(s):t=s.strip();print t+t[::-1]
Titik impas adalah sekitar 11 karakter ( detail ), yang lalu Anda beralih ke a def
atau program
. Bandingkan ini dengan titik impas panjang biasanya 5 untuk ekspresi berulang:
range(a)+range(b)
r=range;r(a)+r(b)
print s[1:],s[1:]*2
r=s[1:];print r,r*2
Bahasa lain memiliki solusi, Oktaf misalnya . Ada trik yang dikenal untuk Python, tetapi mereka panjang, kikuk, dan / atau penggunaan terbatas. Metode pendek, tujuan umum untuk mensimulasikan tugas dalam lambda akan merevolusi golf Python.
Apa cara bagi pegolf Python untuk mengatasi atau mengatasi keterbatasan ini? Gagasan potensial apa yang harus mereka pikirkan ketika mereka melihat ekspresi panjang diulang dua kali dalam lambda?
Tujuan saya dengan pertanyaan tips ini adalah untuk menyelam jauh ke dalam masalah ini dan:
- Katalog dan analisis solusi golf untuk tugas palsu di dalam lambda
- Jelajahi petunjuk baru untuk metode yang lebih baik
Setiap jawaban harus menjelaskan solusi atau petunjuk potensial.
lambda s:(s+s[::-1]).lower()
. Tentu saja ini tidak menjawab pertanyaan yang sebenarnya.
strip
.