Đây là một câu hỏi mẹo để chơi gôn trong Python.
Trong chơi gôn Python, thông thường, một bài nộp là một hàm được định nghĩa là lambda. Ví dụ,
f=lambda x:0**x or x*f(x-1)
tính giai thừa của x.
Định dạng lambda có hai ưu điểm lớn :
- Bản tóm tắt của
f=lambda x:...
hoặclambda x:...
ngắn hơndef f(x):...return...
hoặcx=input()...print...
- Một cuộc gọi đệ quy có thể được sử dụng để lặp với ít chi phí byte.
Tuy nhiên, lambdas có nhược điểm lớn là chỉ cho phép một biểu thức duy nhất, không có tuyên bố. Đặc biệt, điều này có nghĩa là không có bài tập như thế nào c=chr(x+65)
. Đây là vấn đề khi một người có một biểu thức dài mà giá trị của nó cần được tham chiếu hai lần (hoặc nhiều hơn).
Các phép gán như E=enumerate
có thể bên ngoài hàm hoặc như một đối số tùy chọn, nhưng chỉ khi chúng không phụ thuộc vào các đầu vào hàm. Các đối số tùy chọn như f=lambda n,k=min(n,0):...
thất bại vì đầu vào n
chưa được xác định khi k
được đánh giá tại thời điểm xác định.
Kết quả là đôi khi bạn không muốn lặp lại một biểu thức dài trong lambda bởi vì sự thay thế là một non-lambda dài.
lambda s:s.strip()+s.strip()[::-1]
def f(s):t=s.strip();print t+t[::-1]
Điểm hòa vốn là khoảng 11 ký tự ( chi tiết ), qua đó bạn chuyển sang một def
hoặc program
. So sánh điểm này với điểm hòa vốn thông thường có độ dài 5 cho biểu thức lặp lại:
range(a)+range(b)
r=range;r(a)+r(b)
print s[1:],s[1:]*2
r=s[1:];print r,r*2
Các ngôn ngữ khác có cách giải quyết, ví dụ như Octave . Có những thủ thuật đã biết đối với Python, nhưng chúng dài, cồng kềnh và / hoặc sử dụng hạn chế. Một phương pháp ngắn, đa mục đích để mô phỏng bài tập trong lambda sẽ cách mạng hóa việc chơi gôn Python.
Các cách để một người chơi gôn Python vượt qua hoặc khắc phục giới hạn này là gì? Những ý tưởng tiềm năng nào họ nên có trong đầu khi họ thấy một biểu hiện dài được lặp lại hai lần trong lambda?
Mục tiêu của tôi với câu hỏi mẹo này là đi sâu vào vấn đề này và:
- Danh mục và phân tích cách giải quyết chơi golf để chuyển nhượng giả trong lambda
- Khám phá khách hàng tiềm năng mới để có phương pháp tốt hơn
Mỗi câu trả lời nên giải thích một cách giải quyết hoặc tiềm năng.
lambda s:(s+s[::-1]).lower()
. Tất nhiên điều này không trả lời câu hỏi thực tế.
strip
.