2013-10-25 25 views
6

Aşağıdakilere bir Pythonic çözümü nedir?Python'da rasgele kesinliğe yuvarlanmanın verimli yolu

.5 çözünürlüğü olan bir sıcaklık sensörü okuyorum. Yazmaya (.programlanabilir termostat çıkışı var), ayrıca .5 çözünürlükte yazmam gerek.

yüzden en yakın bir.5 için giriş olarak bir şamandıra yuvarlamak için bu fonksiyonu (Python 2.7) yazdı: iyi çalışır

def point5res(number): 
    decimals = number - int(number) 
    roundnum = round(number, 0) 
    return roundnum + .5 if .25 <= decimals < .75 else roundnum 

print point5res (6.123) 

print point5res(6.25) 

print point5res(6.8) 

sırasıyla 6.0, 6.5 ve 7.0, çıkarır. Bu benim istediğim şey.

Python'a nispeten yeniyim.

numaralı hatlar, uygulayıcılar için hayranlık duymamı sağladı. Ama bu Pythonic mi?

Düzeltme: yayınlamadan bu yana, what is and isn't 'Pythonic' hakkında biraz daha fazla şey öğrendim. Benim kodum değil. Cmd aşağıda, aşağıdadır. Teşekkür ederim!

+0

için deneyin - 5.4. –

+0

veya negatif değerler genel olarak –

+1

Sanırım 6.51'i deneyin. Sonuç 7.5. Ama haklısınız, zincirleme karşılaştırmalar harika bir özellik. Ve üçlü ifade sözdizimi, bir kez "olsun", çok güzel. –

cevap

6

İfadeleri basit tutarsanız pythonic olarak kabul edilir, aksi halde okumak zorlaşır.

böyle yakın 0.5 yuvarlamak olacaktır: daha genel

round(number*2)/2.0 

ya:

def roundres(num, res): 
    return round(num/res) * res 
+0

OP'nin verilen örneklerle karşılaştırıldığında, bu aynı değerleri geri getirmez. Bu tam sayıları döndürüyor (6.25 için deneyin) – CDspace

+0

@CDspace orijinali sorunların bir alternatif göndermiş olmasının nedeni budur. Ayrıca, bir floatta '==' yazan değer beklendiği gibi davranmayacaktır. – cmd

+0

'round() 'ın Python 2 ve Python 3 arasındaki davranışı değiştirdiğine dikkat edin.' Yuvarlak (0,5) 'Python 2'de' 1' ve Python 3'te '0 'olur. Bu nedenle bu çözüm yalnızca Python 2'de çalışır. OP'nin kullandığı budur, bu yüzden +1 –

0
return 0.5 * divmod (number, 0.5) [0] if number >= 0 else -0.5 divmod (number, -0.5) [0] 

Bu olsa daha hoş görünüyor:

def roundToHalf (number): 
    ''' Round to nearest half ''' 
    half = 0.5 if number >= 0 else -0.5 
    return half * divmod (number, half) [0] 
İlgili konular