【发布时间】:2016-12-05 08:48:45
【问题描述】:
如何在 Python 中实现圆形范围对象?
例如
令 S 是一个以 2^3 为模的圆形空间(范围 [0, 2^3))。 我想生成一个像这样的范围对象:
crange(3, 7, 2 ** 3) => a range object [3, 4, 5, 6]
crange(7, 3, 2 ** 3) => a range object [7, 0, 1, 2]
我试过这个:
def crange(start, stop, modulo):
if start > stop:
return range(start, modulo) or range(stop)
else:
return range(start, stop)
但我不能输入 bigint 到 crange 例如crange(8, 2, 2 ** 160).
OverflowError: Python int too large to convert to C ssize_t
【问题讨论】:
-
你已经尝试了什么?发布它,以便我们提供帮助。 SO 不是代码编写服务
-
在您给出的示例中,您希望
crange(0, 8)得到什么结果? -
有趣的是,您的代码提高了
OverflowError,因为评估大range的真实性显然提高了OverflowError(即使范围本身是可表示的)。这可以说是一个错误。我打开了bugs.python.org/issue28876 -
@sira:它是相关的,但它是一个不同的问题(lrange() 将无济于事,除非它会定义
__bool__方法——这很容易,但它会破坏与范围的兼容性( ) 来自 Python 3)。没有 range() 对象会生成7, 0, 1, 2。具体错误是由于 bool(range()) 被实现为 len(range()) 并且由于实现历史 len() 被限制为 C ssize_t 大小。这是Guido said about it in 2008
标签: python