【发布时间】:2011-09-23 16:14:49
【问题描述】:
假设我想从 0 循环到 100,但步长为 1/2。如果你尝试
for i in range(0, 100, 0.5):
whatever
错误:
步长不能为0
问题: Python 2.x 中是否有任何内置方法可以执行此类操作?
【问题讨论】:
-
看看一些答案,这将是一个很好的反向代码高尔夫问题......
标签: python python-2.7 range
假设我想从 0 循环到 100,但步长为 1/2。如果你尝试
for i in range(0, 100, 0.5):
whatever
错误:
步长不能为0
问题: Python 2.x 中是否有任何内置方法可以执行此类操作?
【问题讨论】:
标签: python python-2.7 range
Python2.x:
for idx in range(0, int(100 / 0.5)):
print 0.5 * idx
输出:
0.0
0.5
1.0
1.5
..
99.0
99.5
Numpy:
numpy.arange 也可以解决问题。
numpy.arange(0, 100, 0.5)
【讨论】:
TypeError: range() integer end argument expected, got float.
int(见编辑)。由于答案是两年多前写的,我不记得为什么要这样写。
如果你有numpy,这里有两种方法:
numpy.arange(0, 100, 0.5)
numpy.linspace(0, 100, 200, endpoint=False)
【讨论】:
range() 和xrange() 必须使用整数步长。这就是为什么您的 0.5 步在内部转换为 0 并且您收到该错误的原因。试试for i in [j / 2.0 for j in xrange(100 * 2)]:
【讨论】:
您必须手动创建循环,或定义自己的自定义范围函数。内置需要一个整数步长值。
【讨论】:
for x in map(lambda i: i * 0.5, range(0,200)):
#Do something with x
【讨论】:
map 和一个简单可迭代的 lambda 函数?看起来很酷且功能强大的编程,但实际上,它只会增加不必要的计算复杂性。
对于较大的范围,最好使用生成器表达式而不是显式构建列表:
for k in ( i*0.5 for i in range(200) ):
print k
这不会消耗太多额外的内存,速度快且易于阅读。 见http://docs.python.org/tutorial/classes.html#generator-expressions
【讨论】: