SORU
31 Aralık 2009, PERŞEMBE


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
31 Aralık 2009, PERŞEMBE


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.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Fuse

    Fuse

    21 Kasım 2005
  • HereWeStayKings

    HereWeStayKi

    3 NİSAN 2013
  • We've moved!

    We've moved!

    7 Ocak 2008