【问题标题】:Exercise on Summing Digits | What's with n // = 10 [duplicate]数字求和练习 | n 是什么 // = 10 [重复]
【发布时间】:2012-12-03 04:50:27
【问题描述】:

可能重复:
What is the reason for having ‘//’ in Python?

在尝试对数字求和进行练习时,我偶然发现了这个解决方案:

def sum_digits(n):
   import math
   total = 0
   for i in range(int(math.log10(n)) + 1):
      total += n % 10
      n //= 10
   return total

我的问题是,倒数第二行是做什么的?语法如何正确?

【问题讨论】:

  • 不同意这一点,我可以看到 =//= 中增加了额外的缺乏清晰度。

标签: python


【解决方案1】:

这实现了所谓的floor division。楼层除法(此处由// 表示)截断小数并返回整数结果,而“正常”除法返回您可能“期望”的答案(带小数)。在 Python 3.x 中,两者之间的区别更大,这意味着这两个运算符返回不同的结果。这是一个使用 Python 3 的示例:

>>> 10 / 3
3.3333333333333335
>>> 10 // 3
3

在 Python 3.x 之前,两者没有区别,除非你使用特殊的内置 from __future__ import division,这使得除法运算符像在 Python 3.x 中一样执行(这是使用 Python 2.6.5):

In [1]: 10 / 3
Out[1]: 3

In [2]: 10 // 3
Out[2]: 3

In [3]: from __future__ import division

In [4]: 10 / 3
Out[4]: 3.3333333333333335

In [5]: 10 // 3
Out[5]: 3

因此,当您看到类似 n //= 10 的内容时,它使用的语法与您可能已经看到的 +=/-=/*=/etc 语法相同,它采用 n 的当前值并执行等号前的运算,将以下变量作为第二个参数,将结果返回到n。例如:

In [6]: n = 50

In [7]: n += 10

In [8]: n
Out[8]: 60

In [9]: n -= 20

In [10]: n
Out[10]: 40

In [11]: n //= 10

In [12]: n
Out[12]: 4

【讨论】:

  • 我不是 python 人,但对我来说这似乎很奇怪,这是一个地板除法而不是截断除法。如果你想模拟整数除法,似乎很难。
  • @xaxxon 我可能会误解,但我相信你所说的实际上是同一件事(地板除法 == 截断除法) - 小数部分被省略(或更准确地说,@987654334 @ 函数在其上运行,返回不大于 x 的最大整数。这是否回答了问题?
  • -4 / 3的整数除法结果是什么?应该是-1,对吧?但是地板是-2?
  • 哦,耶稣; ruby-1.9.2-p290 :001 > -4 / 3 => -2
  • @xaxxon 哈哈。是的,对于负数,它本质上是一样的——不大于x 的最大整数值。所以-4 / 3 = -1.33 会舍入到 2(因为 -1 大于 -1.33)。这是 Guido 本人的一篇文章,其中更详细:python-history.blogspot.com/2010/08/…
【解决方案2】:

// 是楼层除法运算符。它总是将返回值截断为小于或等于答案的最大整数。

【讨论】:

    【解决方案3】:

    倒数第二行是运算符的组合,在某种程度上,包括一个不常见的运算符,这就是它有点令人困惑的原因。

    让我们把它分开。

    首先,Python 中的//floor division,基本上是四舍五入到最接近整数的除法。因此,

    >>> 16//5
    3
    >>> 2//1
    2
    >>> 4//3
    1
    >>> 2//5
    0
    

    最后,= 之所以存在,是因为 Python 语法允许对变量执行操作,然后立即将结果重新分配给变量。您可能在+= 中最常看到它,例如:

    >>> a = 5
    >>> a += 7
    >>> a
    12
    

    在这种情况下,//= 的意思是“执行楼层除法,将变量除以第二个参数,然后将结果分配给原始输入变量。”因此:

    >>> a = 10
    >>> a //= 6
    >>> a
    1
    

    【讨论】:

    • +1 人 - 抱歉,在我打字时错过了你解释 +=///= 语法 - 看起来我们在同一个波长:)
    • 令人惊讶的是,您在 30 秒前发布了您的答案所带来的巨大差异
    • 哈,是的,看着很有趣。我已经多次站在后面的 30 秒 - 我认为从长远来看这一切都会平息:)
    【解决方案4】:

    对于 Python 中的赋值 A += B 等于 A = A + B ,A *= B 等于 A = A * B 同样的事情也适用于“Floor Divide”,A //= B 等于 A = A // B

    楼除法表示返回截断的整数

    >>> 5 // 3   # 1.6
       1    # 0.6 will be throw off 
    

    【讨论】:

      猜你喜欢
      • 2014-03-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-05-31
      • 1970-01-01
      • 1970-01-01
      • 2020-06-13
      • 2013-11-06
      相关资源
      最近更新 更多