2010-04-25 51 views
3

我是一个非常新的python用户(在编程时只有一点点的经验),并试图找到一些方法来输出我的间歇性数字循环进行基本的自行车比赛模拟(10,000行自行车职位将相当过分:P)。Python初学者:循环中的选择性打印

我在这个循环中尝试了“合理”的方式进行通信的情况,其中一个浮点数等于其整楼(INT,地板事业部),打印出每100次迭代左右:

for i in range (0,10000): 
    i = i + 1 
    t = t + t_step #t is initialized at 0 while t_step is set at .01 
    acceleration_rider1 = (power_rider1/(70 * velocity_rider1)) - (force_drag1/70) 
    velocity_rider1 = velocity_rider1 + (acceleration_rider1 * t_step) 
    position_rider1 = position_rider1 + (velocity_rider1 * t_step) 
    force_drag1 = area_rider1 * (velocity_rider1 ** 2) 
    acceleration_rider2 = (power_rider2/(70 * velocity_rider1)) - (force_drag2/70) 
    velocity_rider2 = velocity_rider2 + (acceleration_rider2 * t_step) 
    position_rider2 = position_rider2 + (velocity_rider2 * t_step) 
    force_drag2 = area_rider1 * (velocity_rider2 ** 2) 

    if t == int(t): #TRIED t == t // 1 AND OTHER VARIANTS THAT DON'T WORK HERE:(
    print t, "biker 1", position_rider1, "m", "\t", "biker 2", position_rider2, "m" 
+2

欢迎来到堆栈溢出!你可以通过用四个空格缩进代码来格式化你的代码,或者让按钮为你做。 – Thomas 2010-04-25 18:47:22

回答

11

for循环自动为您增量,因此您不需要使用i = i + 1

您不需要t,只需使用%(模)运算符来查找数字的倍数。

# Log every 1000 lines. 
LOG_EVERY_N = 1000 

for i in range(1000): 
    ... # calculations with i 

    if (i % LOG_EVERY_N) == 0: 
    print "logging: ..." 
3

要打印出每100次迭代,我建议

if i % 100 == 0: ... 

如果你不想打印的第一次,那么也许

if i and i % 100 == 0: ... 

(作为另一个答案指出的那样,i = i + 1是份外因为i是的for循环的控制变量反正 - 它不是特别损坏虽然,只是有点画蛇添足,而不是真正相关的,为什么你if的问题不触发)。

虽然在t基础条件看似诱人,t == int(t)是不可能的,除非t_step工作是1.0/2**N对于某个整数N多 - 分数不能在浮动准确表示,除非这个条件成立,因为彩车使用二进制基数。 (您的可能使用decimal.Decimal,但这会严重影响计算速度,因为float计算直接受机器硬件支持,而十进制计算不支持)。

+0

是的,我用我自己粗糙的方法来避免打印出第一个值...总是很好地学习多一点的计算理论,但每个错误都是这样: – 2010-04-25 19:15:56

2

其他的答案建议你使用整型变量,而不是i。这也是有效的,并且是我会推荐的解决方案。这个答案主要是为了教育价值。

我认为这是一个舍入误差,咬你。浮点数通常无法精确表示,因此对于100次加.01t不能保证导致t == 1

>>> sum([.01]*100) 
1.0000000000000007 

所以,当你比较实际的整数,你需要建立在一个小公差保证金。像这样的东西应该工作:

if abs(t - int(t)) < 1e-6: 
print t, "biker 1", position_rider1, "m", "\t", "biker 2", position_rider2, "m" 
+0

嗯,这真的很有趣,我从来不知道这个'错误余地'在简单的操作之前...我将不得不尝试一下:) – 2010-04-25 18:58:05