Python中的循环范围
如何在Python中实现循环范围对象 e、 g 设S是模2^3的圆形空间(范围[0,2^3])。 我想生成如下所示的范围对象: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
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