Python中是否有//等于//的运算符?
问题描述:
我发现了Python中的//
运算符,它在Python 3中与floor进行了划分。Python中是否有//等于//的运算符?
是否有一个与ceil分开的运算符? (我知道在Python 3中进行浮点除法的/
运算符。)
答
你总是可以做它内联以及
((foo - 1) // bar) + 1
在python3,这只是害羞一个数量级比迫使浮分工,并要求小区()快的,只要你关心的速度。你不应该这样做,除非你已经通过使用证明了你需要。
>>> timeit.timeit("((5 - 1) // 4) + 1", number = 100000000)
1.7249219375662506
>>> timeit.timeit("ceil(5/4)", setup="from math import ceil", number = 100000000)
12.096064013894647
答
你可以做倒楼师:
def ceildiv(a, b):
return -(-a // b)
这工作,因为Python's division operator does floor division(不像C,其中的整数除法截断小数部分)。
这也适用于Python的大整数,因为没有(有损)的浮点转换。
这里有一个演示:
>>> from __future__ import division # a/b is float division
>>> from math import ceil
>>> b = 3
>>> for a in range(-7, 8):
... print(["%d/%d" % (a, b), int(ceil(a/b)), -(-a // b)])
...
['-7/3', -2, -2]
['-6/3', -2, -2]
['-5/3', -1, -1]
['-4/3', -1, -1]
['-3/3', -1, -1]
['-2/3', 0, 0]
['-1/3', 0, 0]
['0/3', 0, 0]
['1/3', 1, 1]
['2/3', 1, 1]
['3/3', 1, 1]
['4/3', 2, 2]
['5/3', 2, 2]
['6/3', 2, 2]
['7/3', 3, 3]
+11
哇!很聪明!这应该是可以接受的解决方案。 – apadana 2016-04-19 21:29:25
“除以当时的小区”是不是真的在数学常见的事,而''//基于整数除法,与模量操作。 – millimoose 2013-02-11 22:39:28
重要提示:你需要一个整型还是浮点型结果? – smci 2015-06-25 06:36:28
你应该改变对dlitz的接受答案。 math.ceil用于浮点数,它不适用于Python的任意精度长整数。 – endolith 2016-05-01 17:50:22