Neden't Python işareti bir fonksiyon var mı?
Python sign
bir işlevi yok anlayamıyorum. Vardır abs
yerleşik (I sign
'In kardeşi), ama sign
hayır düşünün.
Python 2.6 copysign
bir fonksiyon (math), ama işaret yok. Neden sadece sign
Bir yazarsın ve doğrudan abs(x) * sign(y)
12 *sonra copysign(x,y)
yazma zahmetine? İkincisi çok daha net olurdu: y işareti ile x, eğer y işareti ile x ise hatırlamak zorunda copysign veya x işareti ile y!
Belli ki sign(x)
vermek yok bir şey daha cmp(x,0)
, ama olurdu, daha okunabilir ki bu da (ve bir ölçüde okunabilir dili gibi python, bu olması büyük bir artı).
Eğer python bir tasarımcı olsaydım, olurdum diğer tarafa zıplarlar: cmp
yerleşik, ama sign
. Sadece sign(x-y)
yapabilirsin cmp(x,y)
(veya olmayan sayısal şeyler, sadece bir x>için daha ihtiyacınız olduğunda y - tabi ki bu sorted
bir boolean yerine bir tamsayı karşılaştırıcı) kabul etmek gerekli olmalıdır. Bu da daha net olurdu: x>y
olumlu (cmp
ile sözleşme unutma pozitif olduğunda iseilkdaha büyükama tam tersi olması) olabilir. Elbette cmp
mantıklı kendi için başka nedenler (örneğin zaman sıralama olmayan sayısal şeyler, ya da eğer istediğiniz sıralama için stabil olmayan Olası kullanarak sadece bir boolean)
Yani, soru şu: neden Python tasarımcı(lar) dili dışarı sign
işlevini terk etmeye karar verdi? Neden heck copysign
ile rahatsız ve üst sign
değil mi?
Bir şey mi kaçırdım?
Peter Hansen yorum sonra DÜZENLE. Kullanmadın bu yeterince adil, ama python için kullandığınız söylemedin. Python kullanıyorum 7 yıldır, sayısız kere ihtiyacım vardı, ve son taşıran damla!
Evet, cmp geçmek olabilir, ama onu geçmek için gerekli zaman � oranında bir deyim gibi oldu
lambda x,y: cmp(score(x),score(y))
iyi işareti ile çalışan.
Son olarak, sign
29**, çok daha yararlı olacağını kabul edersiniz umarım eğer görüşünü aldım bile, neden matematik tanımlama, yerine işaret hakkında rahatsız? Nasıl copysign işareti daha çok yararlı olabilir?
CEVAP
DÜZENLEME:
Gerçekten oldu patch dahil sign()
54* ama değildi kabul, çünkü onlar pek hoşuma gitmedi what it should return in all the edge cases ( /-0, /-nan, vb)
57* *used to delegate to the end user the desired behavior for edge cases - sadece copysign uygulamaya karar verdiler.
Bir yerleşik değil neden bilmiyorum, ama bazı düşüncelerim var.
copysign(x,y):
Return x with the sign of y.
En önemlisi, 33* *sign
için birebir! X copysign
=1 çağırıyor sign
bir işlev olarak aynı. Sadece copysign
ve kullanabilirsinizunut gitsin.
>>> math.copysign(1, -4)
-1.0
>>> math.copysign(1, 3)
1.0
Eğer iki argüman geçme eğer hasta iseniz, sign
bu şekilde uygulayabilirsiniz, ve hala IEEE şeyler başkaları tarafından belirtilen ile uyumlu olacak:
>>> sign = functools.partial(math.copysign, 1) # either of these
>>> sign = lambda x: math.copysign(1, x) # two will work
>>> sign(-4)
-1.0
>>> sign(3)
1.0
Genellikle bir işareti istediğinizde ikinci olarak, sadece başka bir değer ile çarpılarak sonuna kadar. Ve tabii ki copysign
ne temelde.
Bu yüzden, yerine:
s = sign(a)
b = b * s
Sadece yapabilirsiniz:
b = copysign(b, a)
Ve evet, 7 yıldır Python kullanıyorum ve cmp
kolayca çıkarılıp sign
yerini olabilir sanırım şaşırdım! Asla __cmp__
bir yöntem ile bir sınıf uyguladınız mı? Asla cmp
adı verilen ve özel karşılaştırıcı bir işlev belirttiniz mi?
Özet olarak, sign
bir işlevi de kendim buldum, ama ilk değişkeni 1 ile copysign
sadece iyi çalışır. sign
sadece aynı işlevselliği bir alt kümesi olduğunu gösterdiğim gibi copysign
, daha yararlı olacağına katılmıyorum.
Neden Standart girdiden okuma satır Py...
Python katılın, neden dize.liste yerin...
Neden `1000000000000000 aralığı(100000...
Neden bir JavaScript değişken dolar iş...
Neden Python kodunu daha hızlı bir işl...