Cra*_*dam 95 python python-3.x
我发现了//Python中的运算符,它在Python 3中与floor进行了划分.
是否有运营商与ceil分开?(我知道/在Python 3中进行浮点除法的运算符.)
dli*_*itz 248
你可以做颠倒的地板部门:
def ceildiv(a, b):
return -(-a // b)
Run Code Online (Sandbox Code Playgroud)
这是有效的,因为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]
Run Code Online (Sandbox Code Playgroud)
Cha*_*via 50
没有运营商与ceil分开.你需要import math和使用math.ceil
pok*_*oke 21
你可以做(x + (d-1)) // d划分时x通过d,即(x + 4) // 5.
Tra*_*ggs 17
你也可以随便进行内联
((foo - 1) // bar) + 1
Run Code Online (Sandbox Code Playgroud)
在python3中,这比强制浮动除法和调用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
Run Code Online (Sandbox Code Playgroud)
Ray*_*ger 10
def ceiling_division(n, d):
return -(n // -d)
Run Code Online (Sandbox Code Playgroud)
让人联想到Penn&Teller的悬浮技巧,“将世界颠倒(带负号),使用普通地板分隔(将天花板和地板交换了),然后使世界朝上(带负号)。 ”
def ceiling_division(n, d):
q, r = divmod(n, d)
return q + bool(r)
Run Code Online (Sandbox Code Playgroud)
所述divmod()函数给出(a // b, a % b)为整数(这可能是用浮漂较不可靠,由于舍入误差)。bool(r)每当存在非零余数时,带有的步骤会将商加1。
def ceiling_division(n, d):
return (n + d - 1) // d
Run Code Online (Sandbox Code Playgroud)
向上平移分子,以便将楼层划分向下舍入到所需的上限。注意,这仅适用于整数。
def ceiling_division(n, d):
return math.ceil(n / d)
Run Code Online (Sandbox Code Playgroud)
该math.ceil()代码很容易理解,但它从整数到彩车和背部转换。这不是很快,并且可能存在舍入问题。而且,它依赖于Python 3语义,其中“真除法”产生浮点,而ceil()函数返回整数。
| 归档时间: |
|
| 查看次数: |
55701 次 |
| 最近记录: |