มีฟังก์ชั่นอะไรบ้างfunctools.partial
ที่คุณไม่สามารถผ่าน lambdas ได้?
ไม่มากในแง่ของฟังก์ชั่นพิเศษ(แต่ดูในภายหลัง) - และการอ่านอยู่ในสายตาของคนดู
คนส่วนใหญ่ที่คุ้นเคยกับภาษาการเขียนโปรแกรมที่ใช้งานได้ (ในครอบครัว Lisp / Scheme โดยเฉพาะ) ดูเหมือนจะlambda
สบายดี - ฉันพูดว่า "ส่วนใหญ่" ไม่แน่นอนทั้งหมดเพราะ Guido และฉันมั่นใจว่าเป็นคนที่คุ้นเคย "(ฯลฯ ) ) แต่คิดว่าlambda
เป็นความผิดปกติของนัยน์ตาในงูหลาม ...
เขาสำนึกผิดว่าเคยยอมรับมันเป็นงูหลามในขณะที่วางแผนที่จะลบมันออกจากงูหลาม 3 เป็นหนึ่งใน "ข้อบกพร่องของงูใหญ่"
ฉันสนับสนุนเขาอย่างเต็มที่ในเรื่องนั้น (ฉันชอบlambda
ใน Scheme ... ในขณะที่ข้อ จำกัดใน Pythonและวิธีแปลก ๆ มันก็ไม่ได้ ' ด้วยภาษาที่เหลือทำให้ผิวของฉันคลาน)
ไม่เช่นนั้น แต่สำหรับพยุหะของlambda
คนรัก - ที่ฉากหนึ่งในสิ่งที่ใกล้เคียงที่สุดที่จะก่อจลาจลที่เคยเห็นในประวัติศาสตร์ของงูใหญ่จนกุยท่าทีและการตัดสินใจที่จะออกlambda
. ใน
การเพิ่มความเป็นไปได้หลายที่จะfunctools
(เพื่อให้ฟังก์ชั่นที่กลับมาคงเอกลักษณ์ และอื่น ๆ ) ไม่ได้เกิดขึ้น (เพื่อหลีกเลี่ยงการทำซ้ำlambda
ฟังก์ชันการทำงานมากขึ้นอย่างชัดเจน) แต่partial
แน่นอนว่ายังคงอยู่ (ไม่ใช่การทำซ้ำทั้งหมด
จำไว้ว่าlambda
ร่างของมันถูก จำกัด ให้แสดงออกดังนั้นมันจึงมีข้อ จำกัด ตัวอย่างเช่น...:
>>> import functools
>>> f = functools.partial(int, base=2)
>>> f.args
()
>>> f.func
<type 'int'>
>>> f.keywords
{'base': 2}
>>>
functools.partial
ฟังก์ชั่นคืนของตกแต่งด้วยคุณลักษณะที่มีประโยชน์สำหรับการวิปัสสนา - ฟังก์ชั่นมันห่อและสิ่งที่ตำแหน่งและข้อโต้แย้งชื่อมันแก้ไขในนั้น นอกจากนี้อาร์กิวเมนต์ที่ตั้งชื่อแล้วสามารถแทนที่ได้ในทันที ("การแก้ไข" นั้นค่อนข้างจะใช้การตั้งค่าเริ่มต้น):
>>> f('23', base=10)
23
ดังนั้นที่คุณดูจะdefinelyไม่เป็นที่เรียบง่ายเป็นlambda s: int(s, base=2)
-!)
ใช่คุณสามารถบิดแลมบ์ดาของคุณเพื่อให้สิ่งนี้แก่คุณเช่นสำหรับการแทนที่คำหลัก
>>> f = lambda s, **k: int(s, **dict({'base': 2}, **k))
แต่ฉันหวังเป็นอย่างยิ่งว่าแม้แต่คนที่กระตือรือร้นที่สุดlambda
ก็ไม่คิดว่าหนังสยองขวัญนี้สามารถอ่านได้ดีไปกว่าการpartial
โทร! -) ส่วน "การตั้งค่าแอตทริบิวต์" นั้นยากขึ้นเนื่องจากข้อ จำกัด "การแสดงออกของร่างกายเดียว" ของ Python lambda
(รวมถึงความจริงที่ว่าการมอบหมายไม่สามารถเป็นส่วนหนึ่งของการแสดงออกของ Python) ... คุณจบ "แกล้งทำมอบหมายภายในนิพจน์" โดยการยืดความเข้าใจในรายการให้เกินกว่าขีด จำกัด การออกแบบ ... :
>>> f = [f for f in (lambda f: int(s, base=2),)
if setattr(f, 'keywords', {'base': 2}) is None][0]
ตอนนี้รวมเอาการขัดแย้ง overridability ชื่อ - รวมทั้งการตั้งค่าของสามคุณลักษณะในการแสดงออกเดียวและบอกฉันว่าอ่านได้ว่าจะเป็น ... !
functools.partial
ที่คุณพูดถึงทำให้มันเหนือกว่าแลมบ์ดา บางทีนี่อาจเป็นหัวข้อของการโพสต์อื่น แต่มันเป็นสิ่งที่อยู่ในระดับการออกแบบที่มารบกวนคุณมากเกี่ยวกับlambda
?