浮点数的问题在于由于不精确性,您可能得不到您期望的相同数量的项。如果您正在处理多项式,那么确切的项数非常重要,这可能是一个真正的问题。
您真正想要的是算术级数; 以下代码将适用于 int
、float
和 complex
……以及字符串和列表。
def arithmetic_progression(start, step, length):
for i in xrange(length):
yield start + i * step
请注意,这段代码比任何维护运行总数的替代方案更有可能使您的最后一个值接近预期值。
>>> 10000 * 0.0001, sum(0.0001 for i in xrange(10000))
(1.0, 0.9999999999999062)
>>> 10000 * (1/3.), sum(1/3. for i in xrange(10000))
(3333.333333333333, 3333.3333333337314)
更正一下:这里是一个高效的累加小工具:
def kahan_range(start, stop, step):
assert step > 0.0
total = start
compo = 0.0
while total < stop:
yield total
y = step - compo
temp = total + y
compo = (temp - total) - y
total = temp
>>> list(kahan_range(0, 1, 0.0001))[-1]
0.9999
>>> list(kahan_range(0, 3333.3334, 1/3.))[-1]
3333.333333333333
>>>
return
和yield
关键字,应该使用break
。 - Tim McNamarafloat_range
- 完成。 - Mark Ransomreturn
变成了raise StopIteration
;return <expression>
会导致语法错误SyntaxError: 'return' with argument inside generator
,即使是return None
也是如此。 - John Machinrange()
返回一个列表。OP描述的实际上是xrange()
,它一次返回一个元素。 - BobC