นี่เป็นคำถามเคล็ดลับสำหรับการเล่นกอล์ฟใน Python
ใน Python golfing เป็นเรื่องปกติที่การส่งจะเป็นฟังก์ชั่นที่กำหนดเป็นแลมบ์ดา ตัวอย่างเช่น,
f=lambda x:0**x or x*f(x-1)
คำนวณแฟคทอเรียลของ x
รูปแบบแลมบ์ดามีข้อดีสองประการ :
- หม้อไอน้ำของ
f=lambda x:...
หรือlambda x:...
สั้นกว่าdef f(x):...return...
หรือx=input()...print...
- การเรียกซ้ำสามารถใช้เพื่อวนซ้ำด้วยค่าใช้จ่ายในไบต์น้อย
อย่างไรก็ตามแลมบ์ดามีข้อเสียเปรียบครั้งใหญ่ที่อนุญาตให้ใช้เพียงนิพจน์เดียวโดยไม่มีคำสั่ง โดยเฉพาะอย่างยิ่งนี่หมายถึงไม่มีการมอบหมายใดc=chr(x+65)
ๆ นี่เป็นปัญหาเมื่อมีนิพจน์ยาวที่ต้องอ้างอิงค่าสองครั้ง (หรือมากกว่า)
การมอบหมายเช่นE=enumerate
นั้นเป็นไปได้นอกฟังก์ชั่นหรือเป็นอาร์กิวเมนต์ที่เป็นทางเลือก แต่ถ้ามันไม่ได้ขึ้นอยู่กับอินพุตของฟังก์ชัน อาร์กิวเมนต์ที่เป็นทางเลือกเช่นf=lambda n,k=min(n,0):...
ล้มเหลวเนื่องจากอินพุตn
ไม่ได้ถูกกำหนดเมื่อk
ถูกประเมิน ณ เวลานิยาม
ผลที่ได้คือบางครั้งคุณดูดซ้ำการแสดงออกยาวในแลมบ์ดาเพราะทางเลือกคือแลมบ์ดาที่ไม่ยืดเยื้อ
lambda s:s.strip()+s.strip()[::-1]
def f(s):t=s.strip();print t+t[::-1]
จุดแบ่งแม้เป็นเรื่องเกี่ยวกับ 11 ตัว ( รายละเอียด ) ที่ผ่านมาที่คุณเปลี่ยนไปหรือdef
program
เปรียบเทียบสิ่งนี้กับจุดแตกหักคู่ปกติ 5 สำหรับการแสดงออกซ้ำ:
range(a)+range(b)
r=range;r(a)+r(b)
print s[1:],s[1:]*2
r=s[1:];print r,r*2
ภาษาอื่นมีวิธีแก้ปัญหาเช่นอ็อกเทฟ มีกลอุบายที่รู้จักกันดีสำหรับ Python แต่มีความยาว clunky และ / หรือการใช้งานที่ จำกัด วิธีการสั้น ๆ ที่ใช้งานทั่วไปเพื่อจำลองการมอบหมายในแลมบ์ดาจะปฏิวัติการเล่นกอล์ฟ Python
นักกอล์ฟ Python มีวิธีใดบ้างในการเอาชนะหรือหลีกเลี่ยงข้อ จำกัด นี้? พวกเขาควรมีความคิดที่เป็นไปได้อะไรบ้างเมื่อพวกเขาเห็นการแสดงออกที่ยาวนานซ้ำสองครั้งในแลมบ์ดา?
เป้าหมายของฉันสำหรับคำถามเคล็ดลับนี้คือดำดิ่งสู่ปัญหานี้และ:
- แคตตาล็อกและวิเคราะห์วิธีแก้ปัญหาการเล่นกอล์ฟเพื่อการมอบหมายปลอมภายในแลมบ์ดา
- สำรวจโอกาสในการขายใหม่สำหรับวิธีการที่ดีกว่า
คำตอบแต่ละข้อควรอธิบายวิธีแก้ปัญหาหรือโอกาสในการขายที่อาจเกิดขึ้น
lambda s:(s+s[::-1]).lower()
สตริงตัวพิมพ์เล็กตรงกันข้ามหนึ่งก็สามารถไป ของหลักสูตรนี้ไม่ตอบคำถามจริง
strip
ดีเปลี่ยนไป