ฉันมีแบบฝึกหัดใน Python ดังนี้:
พหุนามได้รับเป็น tuple ของค่าสัมประสิทธิ์ดังกล่าวว่าอำนาจจะถูกกำหนดโดยดัชนีเช่น: (9,7,5) หมายถึง 9 + 7 * x + 5 * x ^ 2
เขียนฟังก์ชันเพื่อคำนวณค่าสำหรับ x ที่กำหนด
ตั้งแต่ฉันเข้าสู่การเขียนโปรแกรมการทำงานเมื่อเร็ว ๆ นี้ฉันเขียน
def evaluate1(poly, x):
coeff = 0
power = 1
return reduce(lambda accu,pair : accu + pair[coeff] * x**pair[power],
map(lambda x,y:(x,y), poly, range(len(poly))),
0)
ซึ่งฉันคิดว่าอ่านไม่ได้ดังนั้นฉันจึงเขียน
def evaluate2(poly, x):
power = 0
result = 1
return reduce(lambda accu,coeff : (accu[power]+1, accu[result] + coeff * x**accu[power]),
poly,
(0,0)
)[result]
ซึ่งอย่างน้อยอ่านไม่ได้ดังนั้นฉันเขียน
def evaluate3(poly, x):
return poly[0]+x*evaluate(poly[1:],x) if len(poly)>0 else 0
ซึ่งอาจมีประสิทธิภาพน้อยกว่า (แก้ไข: ฉันผิด!) เนื่องจากใช้การคูณหลายอย่างแทนการยกกำลังโดยหลักการฉันไม่สนใจการวัดที่นี่ (แก้ไข: ความโง่ของฉัน! การวัดจะชี้ให้เห็นความเข้าใจผิดของฉัน!) และ ยังไม่สามารถอ่านได้ (arguably) เป็นวิธีแก้ซ้ำ:
def evaluate4(poly, x):
result = 0
for i in range(0,len(poly)):
result += poly[i] * x**i
return result
มีวิธีแก้ปัญหาฟังก์ชั่นบริสุทธิ์ที่สามารถอ่านได้ตามความจำเป็นและใกล้เคียงกับประสิทธิภาพหรือไม่?
เป็นที่ยอมรับการเปลี่ยนแปลงการเป็นตัวแทนจะช่วย แต่สิ่งนี้ได้รับจากการฝึก
สามารถเป็น Haskell หรือ Lisp ได้เช่นกันไม่ใช่แค่ Python
lambda
งานเมื่อเทียบกับภาษาที่มีฟังก์ชั่นไวยากรณ์ที่ไม่ระบุชื่อจางลง ส่วนหนึ่งที่อาจก่อให้เกิดลักษณะ "สกปรก"
for
ลูปเป็นต้น) เป็นเป้าหมายที่ไม่ดีที่จะตั้งเป้าหมายไว้ใน Python ตัวแปรการโยงอีกครั้งอย่างรอบคอบและไม่กลายพันธุ์วัตถุให้ประโยชน์เกือบทั้งหมดแก่คุณและทำให้โค้ดอ่านได้อย่างไม่มีที่สิ้นสุดมากขึ้น เนื่องจากอ็อบเจกต์ number นั้นไม่เปลี่ยนรูปแบบและมันจะ rebinds สองชื่อโลคอลโซลูชัน "จำเป็น" ของคุณจึงทำให้การเขียนโปรแกรมทำงานได้ดีกว่ารหัส Python ที่ "บริสุทธิ์อย่างเคร่งครัด"