Я не можу зрозуміти, чому Python не має sign
функції. У нього є abs
вбудований (який я вважаю sign
сестрою), але ні sign
.
У python 2.6 є навіть copysign
функція (з математики ), але ніякої ознаки. Навіщо турбуватися писати а, copysign(x,y)
коли ви могли просто написати a, sign
а потім отримати copysign
безпосередньо з abs(x) * sign(y)
? Останнє було б набагато зрозуміліше: x зі знаком y, тоді як при copysign ви повинні пам'ятати, чи це x зі знаком y або y зі знаком x!
Очевидно, sign(x)
це не дає нічого іншого cmp(x,0)
, але було б набагато читабельніше, що це теж (і для такої читабельної мови, як пітон, це було б великим плюсом).
Якби я був дизайнером пітонів, я би був іншим способом: не cmp
вбудований, а a sign
. Коли вам потрібно cmp(x,y)
, ви можете просто зробити sign(x-y)
(або, ще краще, для нечислових речей, просто x> y - звичайно, це повинно було вимагати sorted
прийняття булевого, а не порівняльного числа). Це також буде більш ясно: позитивним , коли x>y
( в той час як з cmp
ви повинні пам'ятати конвенції плюсовій , коли перший є великим , але це може бути навпаки). Звичайно, це cmp
має сенс самостійно з інших причин (наприклад, при сортуванні нечислових речей або якщо ви хочете, щоб сорт був стабільним, що неможливо використовувати просто булевим)
Отже, питання: чому дизайнери (і) Python вирішили залишити sign
функцію поза мовою? Чому чорт турбує, copysign
а не його батьків sign
?
Я щось пропускаю?
EDIT - після коментаря Пітера Хансена. Досить справедливо, що ви його не використовували, але не сказали, для чого використовуєте python. За 7 років, що я використовую пітон, мені це потрібно було незліченну кількість разів, і останнє - солома, що зламала верблюду спину!
Так, ви можете передавати cmp навколо, але 90% разів, які мені потрібно було пройти, були в lambda x,y: cmp(score(x),score(y))
такій ідіомі, як
це працювало б зі знаком просто чудово.
Нарешті, я сподіваюся, ви погоджуєтесь, що це sign
було б корисніше copysign
, тому, навіть якщо я купував ваше уявлення, навіщо займатись визначенням математики, а не знаком? Як може copysign бути настільки корисним, ніж підписувати?