【发布时间】:2010-07-01 06:10:48
【问题描述】:
在 Python 中,是否有一些 short 方法来做类似的事情
"for i in range(n)"
当 n 太大而 Python 无法实际创建数组 range(n) 时?
(很短,否则我只会使用 while 循环)
【问题讨论】:
标签: python
在 Python 中,是否有一些 short 方法来做类似的事情
"for i in range(n)"
当 n 太大而 Python 无法实际创建数组 range(n) 时?
(很短,否则我只会使用 while 循环)
【问题讨论】:
标签: python
你可以使用xrange()...虽然是限制在CPython中的“短”整数:
CPython 实现细节: xrange() 旨在简单和 快速地。实施可能会强加 实现这一目标的限制。 C Python 的实现限制了所有 本机 C 长的参数(“短” Python 整数),并且还需要 元素的数量适合 本机 C 长。如果更大的范围是 需要,一个替代版本可以是 使用 itertools 模块制作:
takewhile(lambda x: x<stop, (start+i*step for i in count())).
我不知道该限制是否也适用于其他实现(或哪些实现) - 但列出了一种解决方法...
我知道您在问题标题中提到了bigint,但问题正文谈到数字太大而无法创建数组 - 我怀疑有很多数字小到足以让xrange 工作,但是range 大到足以让你记忆犹新。
【讨论】:
range 的行为类似于 Python 2 中的 xrange,但没有“短”整数的限制...
我会使用生成器函数:示例即将发布。
def gen():
i = 0
while 1: # or your special terminating logic
yield i
i = i + 1
for j in gen():
do stuff
【讨论】:
您可以升级到 python3。在那里,范围不限于“短”整数。
另一种解决方法是将 xrange 用于小整数并将它们添加到循环内的某个常量中,例如
offset, upperlimit = 2**65, 2**65+100
for i in xrange(upperlimit-offset):
j = i + offset
# ... do something with j
【讨论】:
您应该始终使用 xrange 而不是 range 来循环 n 次,但请记住 xrange 也有限制(如果它太小,您需要使用计数器执行自己的 while 循环)
编辑:太晚了...
【讨论】: