内容 隐藏
问题:Python中是否有一个//运算符的上限?
我发现了//
Python中的运算符,在Python 3中该运算符与下限相除。
是否有一个运算符与ceil分开?(我知道/
在Python 3中执行浮点除法的运算符。)
回答 0
没有运算符与ceil分开。您需要import math
使用math.ceil
回答 1
您可以做上下颠倒的楼层划分:
def ceildiv(a, b):
return -(-a // b)
之所以有效,是因为Python的除法运算符执行地板除法(与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]
回答 2
你可以做(x + (d-1)) // d
划分时x
通过d
,即(x + 4) // 5
。
回答 3
解决方案1:通过求反将地板转换为天花板
def ceiling_division(n, d):
return -(n // -d)
让人联想到Penn&Teller的悬浮技巧,“将世界颠倒(带负号),使用普通地板分隔(天花板和地板已互换),然后使世界朝上(带负号)。 ”
解决方案2:让divmod()完成工作
def ceiling_division(n, d):
q, r = divmod(n, d)
return q + bool(r)
所述divmod()函数给出(a // b, a % b)
为整数(这可能是用浮漂较不可靠,由于舍入误差)。bool(r)
每当存在非零余数时,带有的步骤会将商加1。
解决方案3:在除法之前调整分子
def ceiling_division(n, d):
return (n + d - 1) // d
向上平移分子,以便将地板划分向下舍入到所需的上限。注意,这仅适用于整数。
解决方案4:转换为浮点数以使用math.ceil()
def ceiling_division(n, d):
return math.ceil(n / d)
该math.ceil()代码很容易理解,但它从整数到彩车和背部转换。这不是很快,并且可能存在舍入问题。而且,它依赖于Python 3语义,其中“真除法”产生浮点,而ceil()函数返回整数。
回答 4
您也可以随时内联进行
((foo - 1) // bar) + 1
在python3中,只要您关心速度,这比强制进行float除法和调用ceil()快一个数量级。除非您已经通过使用证明,否则您不应该这样做。
>>> timeit.timeit("((5 - 1) // 4) + 1", number = 100000000)
1.7249219375662506
>>> timeit.timeit("ceil(5/4)", setup="from math import ceil", number = 100000000)
12.096064013894647
回答 5
回答 6
简单的解决方案:a // b + 1
声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。