なぜPythonにsign
関数がないのか理解できません。それは持っているabs
(私は考える組み込みsign
の妹)が、ありませんsign
。
Python 2.6にはcopysign
(mathの)関数さえありますが、符号はありません。なぜcopysign(x,y)
a sign
と書いて、copysign
直接から直接得ることができるのに、わざわざaを書くのabs(x) * sign(y)
ですか?後者の方がはるかに明確です。xにyの符号が付いているのに対し、copysignでは、xがyの符号を持つか、yがxの符号を持つかを覚えておく必要があります。
明らかにsign(x)
以外のものは何も提供しませんcmp(x,0)
が、これもはるかに読みやすくなります(Pythonのような非常に読みやすい言語の場合、これは大きなプラスになります)。
もし私がpythonデザイナーだったら、私はその逆でした:cmp
組み込みではなくsign
。必要なcmp(x,y)
場合は、単にaを実行することができますsign(x-y)
(または、数値以外の場合はx> yを使用します-もちろん、これにはsorted
整数コンパレータの代わりにブール値を受け入れる必要があります)。これはより明確になります:正の場合x>y
(一方cmp
、最初の規則が大きい場合は、規則を正に覚えておく必要がありますが、逆の場合もあります)。もちろんcmp
、他の理由でそれ自体が理にかなっています(たとえば、非数値のものを並べ替えるとき、または並べ替えを安定させたい場合、単純にブール値では使用できません)。
では、問題は次のとおりです。なぜPythonデザイナーはsign
関数を言語から除外することにしたのですか?なぜ一体copysign
は親ではなく気になるのsign
ですか?
何か不足していますか?
編集-ピーターハンセンコメントの後。あなたがそれを使用しなかったが、Pythonを何のために使用するかを言っていないほど十分に公平です。私がpythonを使用していた7年間で、私は何度もそれを必要としました、そして最後はラクダの背中を壊したストローです!
はい、CMPを渡すことができますが、合格する必要があった時間の90%は、lambda x,y: cmp(score(x),score(y))
記号でうまく機能するようなイディオムでした
。
最後に、私はあなたsign
がそれよりも有用であることをあなたが同意することを望みますcopysign
、それで私があなたの見解を買ったとしても、なぜそれを符号の代わりに数学で定義することに悩むのですか?どのようにして、コピーサインはサインよりも非常に便利ですか?