ฉันไม่เข้าใจว่าทำไม Python จึงไม่มีsign
ฟังก์ชั่น มันมีabs
ในตัว (ซึ่งผมคิดว่าsign
น้องสาว) sign
แต่ไม่มี
ใน python 2.6 มีcopysign
ฟังก์ชั่น (ในทางคณิตศาสตร์ ) แต่ไม่มีสัญญาณ ทำไมต้องเขียน a copysign(x,y)
เมื่อคุณสามารถเขียน a sign
และได้รับcopysign
โดยตรงจากabs(x) * sign(y)
? หลังจะชัดเจนกว่านี้มาก: x ด้วยสัญลักษณ์ของ y ในขณะที่ copysign คุณต้องจำไว้ว่าถ้ามันเป็น x กับสัญลักษณ์ของ y หรือ y ด้วยสัญลักษณ์ของ x!
เห็นได้ชัดsign(x)
ว่าไม่ได้ให้อะไรมากไปกว่าcmp(x,0)
แต่มันจะอ่านได้ง่ายกว่านี้อีกด้วย (และสำหรับภาษาที่อ่านได้อย่างมากเช่นไพ ธ อนมันน่าจะเป็นข้อดีอย่างมาก)
ถ้าฉันเป็นนักออกแบบหลามผมจะได้รับวิธีการอื่น ๆ arond: ไม่มีcmp
builtin sign
แต่ เมื่อคุณต้องการcmp(x,y)
คุณสามารถทำsign(x-y)
(หรือดียิ่งขึ้นสำหรับสิ่งที่ไม่ใช่ตัวเลขเพียงแค่ x> y - แน่นอนว่าสิ่งนี้ต้องได้sorted
รับการยอมรับบูลีนแทนที่จะเป็นตัวเปรียบเทียบจำนวนเต็ม) สิ่งนี้จะมีความชัดเจนมากขึ้น: เป็นบวกเมื่อx>y
(ในขณะที่cmp
คุณต้องจำการประชุมเชิงบวกเมื่อแรกมีขนาดใหญ่กว่าแต่อาจเป็นวิธีอื่น ๆ ) แน่นอนว่ามีcmp
เหตุผลในตัวเองสำหรับเหตุผลอื่น ๆ (เช่นเมื่อเรียงลำดับสิ่งที่ไม่ใช่ตัวเลขหรือหากคุณต้องการเรียงลำดับให้มีความเสถียรซึ่งไม่สามารถใช้กับบูลีนได้)
ดังนั้นคำถามคือ: ทำไมผู้ออกแบบ Python ตัดสินใจเลิกsign
ฟังก์ชั่นนอกภาษา ทำไมห่าก็รบกวนด้วยcopysign
และไม่ใช่พ่อแม่sign
?
ฉันพลาดอะไรไปรึเปล่า?
แก้ไข - หลังจากความคิดเห็นของ Peter Hansen ยุติธรรมพอที่คุณไม่ได้ใช้ แต่คุณไม่ได้พูดในสิ่งที่คุณใช้หลาม ใน 7 ปีที่ฉันใช้หลามฉันต้องการมันนับครั้งไม่ถ้วนและอันสุดท้ายคือฟางที่หักหลังอูฐ!
ใช่คุณสามารถผ่าน cmp ไปได้ แต่ 90% ของจำนวนครั้งที่ฉันต้องผ่านมันเป็นสำนวนแบบ
lambda x,y: cmp(score(x),score(y))
ที่จะใช้กับสัญญาณได้ดี
ในที่สุดฉันหวังว่าคุณจะเห็นว่าsign
จะมีประโยชน์มากกว่าcopysign
ดังนั้นแม้ว่าฉันจะซื้อมุมมองของคุณทำไมต้องกังวลกับการกำหนดในคณิตศาสตร์แทนที่จะเป็นสัญญาณ? copysign มีประโยชน์มากกว่าเครื่องหมายอย่างไร