Nie rozumiem, dlaczego Python nie ma sign
funkcji. Ma abs
wbudowaną (którą uważam za sign
siostrę), ale niesign
.
W Pythonie 2.6 jest nawet copysign
funkcja (w matematyce ), ale nie ma znaku. Po co męczyć się, aby napisać, copysign(x,y)
kiedy możesz po prostu napisać a, sign
a następnie uzyskać copysign
bezpośrednio odabs(x) * sign(y)
? To drugie byłoby znacznie wyraźniejsze: x ze znakiem y, podczas gdy przy copysign musisz pamiętać, czy to x ze znakiem y lub y ze znakiem x!
Oczywiście sign(x)
nie zapewnia nic więcej niżcmp(x,0)
, ale byłoby to o wiele bardziej czytelne (i dla bardzo czytelnego języka, takiego jak python, byłby to duży plus).
Gdybym był projektantem Pythona, byłbym jeszcze inny: brak cmp
wbudowanego, ale sign
. Gdy potrzebujesz cmp(x,y)
, możesz po prostu zrobić sign(x-y)
(lub nawet lepiej dla liczb nienumerycznych, tylko x> y - oczywiście powinno to wymagać sorted
zaakceptowania wartości logicznej zamiast komparatora liczb całkowitych). Byłoby to również bardziej jasne: pozytywne, gdy x>y
(podczas gdy cmp
musisz pamiętać, że konwencja jest pozytywna, gdy pierwszy jest większy , ale może być odwrotnie). Oczywiście cmp
ma to sens z innych powodów (np. Podczas sortowania rzeczy nienumerycznych lub jeśli chcesz, aby sort był stabilny, co nie jest możliwe przy użyciu zwykłej wartości logicznej)
Pytanie brzmi: dlaczego projektanci Pythona postanowili zrezygnować z sign
funkcji poza językiem? Dlaczego, u licha, niepokoił się, copysign
a nie jego rodzic sign
?
Czy coś brakuje?
EDYCJA - po komentarzu Petera Hansena. W porządku, że go nie używałeś, ale nie powiedziałeś, do czego używasz Pythona. W ciągu 7 lat używania Pythona potrzebowałem go niezliczoną ilość razy, a ostatnia to słoma, która złamała grzbiet wielbłąda!
Tak, możesz przekazać cmp, ale 90% razy, które musiałem przekazać, było w takim idiomie
lambda x,y: cmp(score(x),score(y))
, że działałoby to ze znakiem w porządku.
Wreszcie, mam nadzieję, że zgadzasz się, że sign
byłoby to bardziej przydatne niż copysign
, więc nawet jeśli kupiłem twój pogląd, po co zawracać sobie głowę definiowaniem go w matematyce zamiast znaku? W jaki sposób copysign może być tak użyteczny niż znak?