Python中的循环范围

Python中的循环范围,python,Python,如何在Python中实现循环范围对象 e、 g 设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: re

如何在Python中实现循环范围对象

e、 g

设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)

试试这个:

def crange(start, stop, modulo):
    result = []
    index = start
    while index != stop:
        result.append(index)
        index = (index + 1) % modulo
    return result
如果您知道列表可能太长,可以使用生成器生成所需的序列:

def crange(start, stop, modulo):
    index = start
    while index != stop:
        yield index
        index = (index + 1) % modulo
试试这个:

def crange(start, stop, modulo):
    result = []
    index = start
    while index != stop:
        result.append(index)
        index = (index + 1) % modulo
    return result
如果您知道列表可能太长,可以使用生成器生成所需的序列:

def crange(start, stop, modulo):
    index = start
    while index != stop:
        yield index
        index = (index + 1) % modulo

通过创建自己的生成器,您可以避免使用范围和在内存中存储大量列表:

def crange(start, end, modulo):
    if start > end:
        while start < modulo:
            yield start
            start += 1
        start = 0

    while start < end:
        yield start
        start += 1

print list(crange(3, 7, 2 ** 3))
print list(crange(7, 3, 2 ** 3))
print next(crange(8, 2, 2 ** 160))

通过创建自己的生成器,您可以避免使用范围和在内存中存储大量列表:

def crange(start, end, modulo):
    if start > end:
        while start < modulo:
            yield start
            start += 1
        start = 0

    while start < end:
        yield start
        start += 1

print list(crange(3, 7, 2 ** 3))
print list(crange(7, 3, 2 ** 3))
print next(crange(8, 2, 2 ** 160))

非常感谢大家

我实现了我想要的
crange
(参考@Ni和@J.F.Sebastian)


非常感谢大家

我实现了我想要的
crange
(参考@Ni和@J.F.Sebastian)


您已经尝试了什么?发布它以便我们可以提供帮助。那么不是代码编写服务您希望
crange(0,8)得到什么结果
在您给出的示例中?相关:。特别有趣的是,您的代码正在引发
溢出错误
,因为评估大
范围的真实性
显然会引发
溢出错误
(即使范围本身是可表示的)。这可以说是一个bug。我打开了@sira:它是相关的,但它是一个不同的问题(lrange()不会有帮助,除非它定义
\uuuuu bool\uuu
方法。它很容易,但会破坏与Python 3中的range()的兼容性)。没有range()对象将生成
7,0,1,2
。具体错误是由于被实现为len(range())以及由于实现历史限制len()的大小。以下是您已经尝试过的内容?发布它以便我们可以提供帮助。那么这不是代码编写服务吗
crange(0,8)的结果是什么
在您给出的示例中?相关:。特别有趣的是,您的代码正在引发
溢出错误
,因为评估大
范围的真实性
显然会引发
溢出错误
(即使范围本身是可表示的)。这可以说是一个bug。我打开了@sira:它是相关的,但它是一个不同的问题(lrange()不会有帮助,除非它定义
\uuuuu bool\uuu
方法。它很容易,但会破坏与Python 3中的range()的兼容性)。没有range()对象将生成
7,0,1,2
。具体错误是由于被实现为len(range())以及由于实现历史记录len()被限制为C ssize\t size。下面是
的范围(2,2**100,2**160)
占用了这么多内存。我怎么能修复它?它没有。生成器除了局部变量之外,没有在内存中存储任何东西。我明白了。谢谢。
crange(2,2**100,2**160)
占用了这么多内存。我如何修复它?它没有。生成器除了局部变量之外,没有在内存中存储任何东西。我明白了。谢谢。
>>> print(list(crange(start=7, stop=3, modulo=2 ** 4)))
[7, 8, 9, 10, 11, 12, 13, 14, 15, 0, 1, 2]
>>> print(3 in crange(start=7, stop=3, modulo=2 ** 4))
False
>>> print(7 in crange(start=7, stop=3, modulo=2 ** 4))
True
>>> print(list(crange(start=3, stop=7, modulo=2 ** 4)))
[3, 4, 5, 6]
>>> print(3 in crange(start=3, stop=7, modulo=2 ** 4))
True
>>> print(7 in crange(start=3, stop=7, modulo=2 ** 4))
False