Я не могу понять, почему у Python нет функции sign
. У него есть abs
встроенный (который я считаю сестрой sign
), но не sign
.Почему у Python нет знаковой функции?
В python 2.6 есть функция copysign
(в math), но нет знака. Зачем писать copysign(x,y)
, когда вы могли бы просто написать sign
, а затем получить copysign
прямо с abs(x) * sign(y)
? Последнее было бы намного яснее: x со знаком y, тогда как с copysign вы должны помнить, если это x со знаком y или y со знаком x!
Очевидно, что sign(x)
не содержит ничего больше, чем cmp(x,0)
, но было бы гораздо читабельнее, что это тоже (и для очень читаемого языка, такого как python, это было бы большим плюсом).
Если бы я был дизайнером python, я был бы другим способом: no cmp
builtin, но sign
. Когда вам нужно , вы можете просто сделать sign(x-y)
(или, что еще лучше, для не численного материала, просто x> y - конечно, это должно было потребовать sorted
, принимающего логическое значение вместо целочисленного компаратора). Это было бы также более ясно: положительно, когда x>y
(тогда как с cmp
вы должны помнить соглашение положительное, когда первый - больше, но это может быть наоборот). Конечно, cmp
имеет смысл по своему усмотрению по другим причинам (например, при сортировке нецифровых вещей или если вы хотите, чтобы сортировка была стабильной, что невозможно использовать с помощью простого логического)
Итак, вопрос: почему разработчик (ы) Python решил оставить функцию sign
за пределами языка? Почему чертовски беспокоиться с copysign
, а не его родителем sign
?
Я что-то упустил?
EDIT - после комментария Питера Хансена. Достаточно честный, чтобы вы его не использовали, но вы не сказали, для чего вы используете python. Через 7 лет, когда я использовал python, мне нужно было много раз, а последняя - соломинкой, которая сломала спину верблюда!
Да, вы можете передать cmp вокруг, но 90% времени, которое мне нужно было передать, было в такой же идиоме, как lambda x,y: cmp(score(x),score(y))
, которая бы хорошо работала со знаком.
Наконец, я надеюсь, вы согласны с тем, что sign
был бы более полезен, чем copysign
, так что даже если бы я купил ваше мнение, зачем беспокоиться об определении этого в математике вместо того, чтобы подписывать? Как copysign может быть так полезен, как знак?
«Я что-то упускаю?» Если ничего другого, то факт, что использование 'sign (x-y)' требует выражения, оценивается, что означает, что вы не можете передать его в качестве обратного вызова, если вы не перенесите его сначала «частичным». С помощью cmp(), как определено, вы просто передаете ссылку на 'cmp'. Также «невероятно полезно»? Я сомневаюсь в этом. Мне нужно было это раз в 10 лет писать Python. Если бы это было действительно так полезно, я думаю, что это будет ... –
@dmazzoni: не будет ли этот аргумент работать на все вопросы на этом сайте? просто закройте stackoverflow и задайте каждый вопрос в соответствующем списке рассылки dev или пользователя! – Davide
@ davide: Сначала я согласен, функция signum является общей и полезной. Во-вторых, я согласен с dmazzoni в том, что ваш вопрос лучше задавать на python-dev. Одно дело спросить, как использовать понимание списка для xyz: мы можем сделать хорошую работу, ответив на это здесь. Но спрашивать, почему Гвидо Ван Россум отказался от подписки, сложно для всех, кто здесь может ответить. –