2017-02-07 5 views
-1

この作品:Pythonで `round`と` __round__`の違いは何ですか? python 3では

Celsius = [39.2, 45.2, 37.3, 37.8, 89] 
Fahrenheit = map(lambda x: ((float(9/5))*x + 32).__round__(3), Celsius) 

print(list(Fahrenheit)) 

[102.56, 113.36, 99.14, 100.04, 192.2] 

しかし、これは動作しない、なぜ?:

Fahrenheit = map(lambda x: ((float(9/5))*x + 32).round(3), Celsius) 

また、Pythonスクリプトのnowdaysの多くは、この古い形式__round__を使用していない、私はスクリプトをよりきれいに見せる理由を考えてください。その他の中核的な理由は?

+2

'__round__'は*フックメソッド*です。 'round()'関数を使うと、必要に応じて 'round((float(9/5))* x + 32)、3)'というフックメソッドを使います。しかし、 'float(9/5)'は間違った値であり、あなたは '9.0/5'を望んでいます。 –

+0

しかし、なぜround(2)は浮動小数点では動作しませんか?これは本当に混乱しています。 – everestial007

+2

浮動小数点数には '.round'メソッドがないので...?これについてはっきりしないものは何ですか? –

答えて

5

float.round()メソッドはありません。代わりにround()functionを使用して、値と回り込む場所の数を渡します。

round()は、丸めは浮動小数点数だけでなくすべての数値型に適用される演算であるため、関数です。 len()はすべてのシーケンス(listまたはtupleまたはstr)にのみ適用され、strはすべてのPythonオブジェクトに適用されます。

すべて同じように__*__ダンダーメソッド、カスタムクラスの__round__ is a hookは、そのクラスの丸めがどのように動作するかを上書きします。 round()関数は、他の機能と同様に、出力を生成するときに関数を使用します。

これは動作します:私はここにfloat(9/5)を使用していませんでした

Fahrenheit = map(lambda x: round((9.0/5) * x + 32, 3), Celsius) 

注意! Pythonの二つに、それは1.0だろう:

>>> float(9/5) 
1.0 

9/5は整数除算を用い最初計算されるからです。 (オペランドの少なくとも一方が浮動小数点値であるため)9.0/5は、浮動小数点除算を使用していますので、あなたは右の商を与える:

>>> 9.0/5 
1.8 

あなたは/も真部門(生産山車を意味し、ここではPython 3を使用しています整数オペランドの場合)、float()コールはまだそこでは冗長です。

関連する問題