在python中使用`round`与`__round__`有什么不同?

eve*_*007 -1 python lambda function rounding python-3.x

在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]
Run Code Online (Sandbox Code Playgroud)

但是,这不起作用,为什么?:

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

此外,现在很多python脚本都不使用这种旧格式__round__,我认为这样可以使脚本看起来更干净.还有其他核心原因吗?

Mar*_*ers 5

没有float.round()方法,没有.您将使用该round() 函数,传入您的值和要舍入的位数.

round()是一个函数,因为舍入是一个适用于所有数字类型的操作,而不仅仅是浮点数.就像len()适用于所有序列(不只是listtuplestr),和str所有的Python对象.

与所有__*__dunder方法一样,自定义类__round__的钩子可以覆盖该类的舍入方式.该round()函数在生成输出时使用它,其他功能也是如此.

这有效:

Fahrenheit = map(lambda x: round((9.0/5) * x + 32, 3), Celsius)
Run Code Online (Sandbox Code Playgroud)

请注意,我没有float(9/5)在这里使用!在Python 2中,那是1.0:

>>> float(9/5)
1.0
Run Code Online (Sandbox Code Playgroud)

因为首先使用整数除法9/5计算.使用浮点除法(因为至少有一个操作数是浮点值),所以给你正确的商:9.0/5

>>> 9.0/5
1.8
Run Code Online (Sandbox Code Playgroud)

你在这里使用Python 3,这/意味着真正的除法(甚至为整数操作数产生浮点数),但是float()那里的调用仍然是多余的.