对数字求和的练习| n//=10是什么

2024-10-06 13:22:55 发布

您现在位置:Python中文网/ 问答频道 /正文

Possible Duplicate:
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

我的问题是,倒数第二行是做什么的?这是怎样正确的语法?


Tags: theinforisdef数字math解决方案
3条回答

它实现了所谓的floor division。Floor division(这里用//表示)截断小数并返回整数结果,而“normal”division返回您可能“期望”的答案(带小数)。在Python3.x中,这两个操作符之间的区别更大,这意味着这两个操作符返回的结果不同。下面是使用Python3的示例:

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

在Python 3.x之前,这两者没有区别,除非您使用特殊的内置from __future__ import division,这使得除法运算符的执行与python3.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中的//floor division,基本上是除法四舍五入到最接近的整数。因此

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

最后,之所以有=是因为Python语法允许对变量执行操作,然后立即将结果重新分配给变量。您可能在+=中最常见的情况是:

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

在这种情况下,//=表示“执行floor division,floor除以第二个参数,然后将结果赋给原始输入变量。”因此:

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

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

相关问题 更多 >