与Python for loop和range混淆()

时间:2014-04-10 13:06:29

标签: python

这是我的for循环:

for x in range(0, 100):
    currentRate10 = srall10[x].current_rate
    startRate10 = srall10[x].start_rate
    lessons10 = srall10[x].sr_completed
    if currentRate10 is not None and startRate10 is not None:
        gain10 = currentRate10 - startRate10
    else:
        gain10 = 0
    rateavg = gain10 / lessons10

rateavg返回1.42。对我来说似乎很准确。但是,当我将变量放在100100以上的任何位置时,我会返回0。因此,如果我将100更改为101,则rateavg会返回0。如果我输入包含143的变量,我仍会得到0

srall10包含一个列表

srall10 = DBSession.query(Summary).filter(Summary.sid == 6933).filter(
    Summary.sr_completed.between(1, 10)).all()

143个条目,这是完全相同的查询,但最后只有count()而不是all()

有什么想法吗?

2 个答案:

答案 0 :(得分:2)

作为最后一项的结果,您获得rateavg。并且range(0, 100)不会迭代所有元素。而是直接遍历列表。

l = []
for s in srall10:
    if s.current_rate is not None and s.start_rate is not None:
        gain10 = s.current_rate - s.start_rate
    else:
        gain10 = 0
    l.append(gain10 / lessons10)  # average if each item

# total average
total_average = sum(l) / len(l)

答案 1 :(得分:0)

Python将始终为两个整数的除法返回一个整数值,因此当Python中的除法运算返回0并且您期望一个数字时,首先要检查的是被除数和除数是否为整数。如果是这样,并且如果被除数小于除数,那么你将得到0而不是0到1之间的浮点数。

您可以通过以下方式避免这种情况:

 rateavg = (gain10 * 1.0) / lessons10

我不知道这是否是您的问题,因为问题中的信息不足以确定列表中值的类型,但它通常 my < / em>当除法意外返回0时出现问题。