Tôi không thể hiểu tại sao Python không có sign
chức năng. Nó có một abs
nội trang (mà tôi coi sign
là em gái), nhưng không sign
.
Trong python 2.6 thậm chí còn có một copysign
hàm (trong toán học ), nhưng không có dấu. Tại sao phải viết một copysign(x,y)
khi bạn chỉ có thể viết một sign
và sau đó nhận được copysign
trực tiếp từ abs(x) * sign(y)
? Điều thứ hai sẽ rõ ràng hơn nhiều: x với dấu của y, trong khi với copysign bạn phải nhớ nếu đó là x với dấu của y hoặc y với dấu của x!
Rõ ràng là sign(x)
không cung cấp bất cứ điều gì nhiều hơn cmp(x,0)
, nhưng nó cũng sẽ dễ đọc hơn nhiều (và đối với một ngôn ngữ rất dễ đọc như python, đây sẽ là một điểm cộng lớn).
Nếu tôi là một nhà thiết kế trăn, tôi sẽ là một cách khác: không có cmp
nội dung, nhưng a sign
. Khi bạn cần cmp(x,y)
, bạn chỉ có thể làm một sign(x-y)
(hoặc, thậm chí tốt hơn cho các công cụ không phải là số, chỉ là x> y - tất nhiên điều này cần phải sorted
chấp nhận một boolean thay vì so sánh số nguyên). Điều này cũng sẽ được rõ ràng hơn: tích cực khi x>y
(trong khi với cmp
bạn phải nhớ dương tính ước khi đầu tiên là lớn hơn , nhưng nó có thể là con đường xung quanh khác). Tất nhiên cmp
có ý nghĩa riêng vì những lý do khác (ví dụ: khi sắp xếp những thứ không phải là số hoặc nếu bạn muốn sắp xếp ổn định, điều này không thể sử dụng chỉ với boolean)
Vì vậy, câu hỏi là: tại sao (các) nhà thiết kế Python quyết định bỏ sign
chức năng này khỏi ngôn ngữ? Tại sao quái vật bận tâm với copysign
và không phải cha mẹ của nó sign
?
Tui bỏ lỡ điều gì vậy?
EDIT - sau khi Peter Hansen bình luận. Đủ công bằng khi bạn không sử dụng nó, nhưng bạn không nói bạn dùng python để làm gì. Trong 7 năm tôi sử dụng trăn, tôi cần nó vô số lần và lần cuối cùng là ống hút làm vỡ lưng con lạc đà!
Vâng, bạn có thể vượt qua cmp xung quanh, nhưng 90% số lần tôi cần để vượt qua nó là trong một thành ngữ như thế
lambda x,y: cmp(score(x),score(y))
sẽ hoạt động với dấu hiệu tốt.
Cuối cùng, tôi hy vọng bạn đồng ý rằng nó sign
sẽ hữu ích hơn copysign
, vì vậy ngay cả khi tôi đã mua quan điểm của bạn, tại sao phải bận tâm về việc xác định điều đó trong toán học, thay vì ký? Làm thế nào copysign có thể hữu ích hơn nhiều so với dấu hiệu?