可能重复:
在 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 中使用“//”的原因是什么?
在尝试对数字求和进行练习时,我偶然发现了这个解决方案:
def sum_digits(n):
import math
total = 0
for i in range(int(math.log10(n)) + 1):
total += n % 10
n //= 10
return total
我的问题是,倒数第二行是做什么的?正确的语法如何?
这实现了所谓的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 中是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
//
是楼层除法算子。它总是将返回值截断为小于或等于答案的最大整数。
对于 Python 中的赋值 A += B 等于 A = A + B ,A *= B 等于 A = A * B 同样适用于“Floor Divide”,A //= B 等于 A = A / /乙
Floor Division 表示返回截断的整数
>>> 5 // 3 # 1.6
1 # 0.6 will be throw off