在尝试对数字求和进行练习时,我偶然发现了这个解决方案:
def sum_digits(n):
import math
total = 0
for i in range(int(math.log10(n)) + 1):
total += n % 10
n //= 10
return total
我的问题是,倒数第二行的作用是什么?那个正确的语法怎么样?
答案 0 :(得分:3)
实现所谓的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
答案 1 :(得分:1)
//
是场内分部运营商。它总是将返回值截断为小于或等于答案的最大整数。
答案 2 :(得分:1)
倒数第二行是运算符的组合,在某种程度上,包括一个不常见的运算符,这就是为什么它有点令人困惑。
让它分开。
首先,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
答案 3 :(得分:0)
用于Python中的赋值A + = B等于A = A + B,A * = B等于A = A * B 同样适用于“Floor Divide”,A // = B等于A = A // B
Floor Division表示返回截断的整数
>>> 5 // 3 # 1.6
1 # 0.6 will be throw off