我如何在0和1之间迭代0.1步?
这表示step参数不能为零:
for i in range(0, 1, 0.1):
print(i)
我如何在0和1之间迭代0.1步?
这表示step参数不能为零:
for i in range(0, 1, 0.1):
print(i)
当前回答
为了解决浮点精度问题,可以使用Decimal模块。
这要求在编写代码时将int或float转换为Decimal,但如果确实需要这种便利,则可以传递str并修改函数。
from decimal import Decimal
def decimal_range(*args):
zero, one = Decimal('0'), Decimal('1')
if len(args) == 1:
start, stop, step = zero, args[0], one
elif len(args) == 2:
start, stop, step = args + (one,)
elif len(args) == 3:
start, stop, step = args
else:
raise ValueError('Expected 1 or 2 arguments, got %s' % len(args))
if not all([type(arg) == Decimal for arg in (start, stop, step)]):
raise ValueError('Arguments must be passed as <type: Decimal>')
# neglect bad cases
if (start == stop) or (start > stop and step >= zero) or \
(start < stop and step <= zero):
return []
current = start
while abs(current) < abs(stop):
yield current
current += step
输出样本-
from decimal import Decimal as D
list(decimal_range(D('2')))
# [Decimal('0'), Decimal('1')]
list(decimal_range(D('2'), D('4.5')))
# [Decimal('2'), Decimal('3'), Decimal('4')]
list(decimal_range(D('2'), D('4.5'), D('0.5')))
# [Decimal('2'), Decimal('2.5'), Decimal('3.0'), Decimal('3.5'), Decimal('4.0')]
list(decimal_range(D('2'), D('4.5'), D('-0.5')))
# []
list(decimal_range(D('2'), D('-4.5'), D('-0.5')))
# [Decimal('2'),
# Decimal('1.5'),
# Decimal('1.0'),
# Decimal('0.5'),
# Decimal('0.0'),
# Decimal('-0.5'),
# Decimal('-1.0'),
# Decimal('-1.5'),
# Decimal('-2.0'),
# Decimal('-2.5'),
# Decimal('-3.0'),
# Decimal('-3.5'),
# Decimal('-4.0')]
其他回答
这里的许多解决方案在Python 3.6中仍然存在浮点错误,并没有完全满足我个人的需求。
下面的函数接受整数或浮点数,不需要导入,也不返回浮点错误。
def frange(x, y, step):
if int(x + y + step) == (x + y + step):
r = list(range(int(x), int(y), int(step)))
else:
f = 10 ** (len(str(step)) - str(step).find('.') - 1)
rf = list(range(int(x * f), int(y * f), int(step * f)))
r = [i / f for i in rf]
return r
Range()只能处理整数,不能处理浮点数。
使用一个列表推导式来获得一个步骤列表:
[x * 0.1 for x in range(0, 10)]
更一般地说,生成器理解最小化内存分配:
xs = (x * 0.1 for x in range(0, 10))
for x in xs:
print(x)
range()内置函数返回一个整数值序列,所以您不能使用它来执行十进制步骤。
我会说使用while循环:
i = 0.0
while i <= 1.0:
print i
i += 0.1
如果你好奇的话,Python正在将你的0.1转换为0,这就是为什么它告诉你参数不能为0。
我的答案与使用map()的其他人类似,不需要NumPy,也不使用lambda(尽管您可以)。以dt为单位获取从0.0到t_max的浮点值列表:
def xdt(n):
return dt*float(n)
tlist = map(xdt, range(int(t_max/dt)+1))
你可以使用这个函数:
def frange(start,end,step):
return map(lambda x: x*step, range(int(start*1./step),int(end*1./step)))