【问题标题】:What is the different in the use of `round` vs. `__round__` in python?在 python 中使用 `round` 和 `__round__` 有什么不同?
【发布时间】:2023-03-30 02:46:01
【问题描述】:

在 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 脚本不使用这种旧格式__round__,我认为是为了让脚本看起来更干净。还有其他核心原因吗?

【问题讨论】:

  • __round__ 是一个钩子方法。使用round()函数,它会根据需要使用钩子方法:round((float(9/5))*x + 32), 3)。但是,float(9/5) 是非常错误的值,你想要9.0/5
  • 但是,为什么 round(2) 不能与 float 一起使用。这真是令人困惑。
  • 因为浮点数没有.round 方法...?这有什么不清楚的地方?
  • 我知道花车没有 .round 方法——错误信息就是这么说的。但是,令人困惑的是它的工作方式只是改变了。我想我现在很清楚了。
  • @everestial007: round() 适用于所有数字类型,而不仅仅是浮点数,这就是为什么它是一个函数。像len()str()等。Python在多种类型可以支持一个操作的情况下更喜欢一个函数,以便为您提供一个新类型可以适应的通用API。

标签: python function python-3.x lambda rounding


【解决方案1】:

没有float.round() 方法,没有。您可以改用round() function,传入您的值和要舍入到的位置数。

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

像所有__*__ dunder 方法一样,__round__ is a hook 用于自定义类以覆盖该类的舍入方式。 round() 函数在生成输出时使用它,其他一些功能也是如此。

这行得通:

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

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

>>> float(9/5)
1.0

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

>>> 9.0/5
1.8

您在这里使用的是 Python 3,其中 / 表示真正的除法(即使对于整数操作数也会产生浮点数),但 float() 调用仍然只是多余的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-03-22
    • 1970-01-01
    • 2015-07-23
    • 1970-01-01
    • 2021-09-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多