如何在Python中更好地控制循环增量?

26

我想循环从0到1,步长为0.01(例如)。我该如何做? for i in range(start, stop, step) 只接受整数参数,所以浮点数不适用。


1
https://dev59.com/oHRB5IYBdhLWcg3w4bKv - Ignacio Vazquez-Abrams
7个回答

31
for i in [float(j) / 100 for j in range(0, 100, 1)]:
    print i

请注意,这里最后打印的值是0.99而不是1.0,但这仅因为range返回的最后一个值是99而不是100。 - Asclepius
2
如果你想要包括0.00到1.00,那么可以使用:range(0, 101, 1) - Santa
请注意,这里没有任何理由不使用生成器推导式,即使用括号,如for i in (float(j) / 100 for j in range(100)): -- 这会创建一个惰性生成器而不是在开始循环之前构建整个列表。 - user4698348

6
使用此方法避免复合浮点误差。步骤数量符合预期,而每个步骤的值都是计算得出的。
def drange2(start, stop, step):
    numelements = int((stop-start)/float(step))
    for i in range(numelements+1):
            yield start + i*step
Usage:

for i in drange2(0, 1, 0.01):
    print i

1
一个选项:
def drange(start, stop, step):
    while start < stop:
            yield start
            start += step

使用方法:

for i in drange(0, 1, 0.01):
    print i

-1:如果“步长”无法被浮点数精确表示,这可能会出现问题。例如,“drange(0,13,0.13)”的最后一个元素为12.870000000000024(100个元素),而“drange(0,11,0.11)”的最后一个元素为10.999999999999995(101个元素)。 - eumiro
更简单的是:list(drange(0,10,1)) 看起来的行为类似于 range[0, 1, 2, 3, 4, 5, 6, 7, 8, 9],但 list(drange(0,1,0.1)) 给出了额外的一个元素:[0, 0.1, 0.2, 0.30000000000000004, 0.4, 0.5, 0.6, 0.7, 0.7999999999999999, 0.8999999999999999, 0.9999999999999999] - Duncan

1
您可以使用列表推导式来实现:
print([i for i in [float(j) / 100 for j in range(0, 100, 1)]])

如果您想控制打印,可以按照以下方式进行操作:

print(['something {} something'.format(i) for i in [float(j) / 100 for j in range(0, 100, 1)]])

或者

list(i for i in [float(j) / 100 for j in range(0, 100, 1)])

1
我认为最好的方法是使用numpy数组。
如果您想以0.25的增量从-2到+2循环,那么我会这样做:
Start = -2
End = 2
Increment = 0.25
Array =  np.arange(Start, End, Increment)

for i in range(0, Array.size):
    print (Array[i])


0

嗯,你可以让循环从0到100,步长为1,这将给你相同数量的步骤。然后,你可以将i除以100,用于你想要做的任何操作。


@James 是的,我们也可以只编写一个无限while循环,并在循环内部维护计数器。然而,我正在尝试学习Python并且我认为了解这一点会很有用。 - efficiencyIsBliss
2
这里的一个问题是将变量初始化为0.0并添加0.01到它100次不一定会得到完全等于1.0的结果。因此,“正确”的方法在很大程度上取决于这些值将如何使用。 - garyjohn
@efficiencyIsBliss - 你需要学习的第一件事是,浮点数并不像你期望的那样精确。有点像。打开Python解释器,输入'a = 0.4',然后按回车键,接着输入'a'并按回车键。 - dotalchemy

-1

你的代码

for i in range(0,100,0.01):

可以通过非常简单的方式实现,而不是使用浮点数。
for i in range(0,10000,1):

如果您非常关注浮点数,那么可以使用https://dev59.com/3m445IYBdhLWcg3wTIjm#4935466


之后,在for循环内使用dec = float(i)/100,如果您仍然想要小数值。 - Ifan Iqbal

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接