Python 初学者:循环中的选择性打印
我刚开始学习python(之前只对html和javascript有一点点了解),正在尝试找一些方法,在我的循环中只输出间歇性的数字,因为做一个简单的自行车比赛模拟,如果输出1万行骑车人的位置,那可真是太多了 :P。
在这个循环中,我尝试了几种“合理”的方法,想要设定一个条件,让浮点数等于它的整数部分(也就是取整),这样大约每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"
4 个回答
3
其他回答建议你使用整数变量 i
。这样做也可以,我也推荐这个方法。不过我写这个回答主要是为了让大家学习。
我觉得你遇到的问题是因为四舍五入错误。浮点数(也就是带小数的数字)有时候不能被准确表示,所以如果你把 .01
加到 t
上加一百次,结果不一定能保证 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"
6
如果你想每100次循环打印一次,可以试试下面的代码:
if i % 100 == 0: ...
如果你不想在第一次就打印,可以考虑用这个:
if i and i % 100 == 0: ...
有个回答提到,i = i + 1
这行代码其实是多余的,因为i
本身就是循环的控制变量,循环每次都会自动加1。虽然这行代码不会造成什么严重的问题,但确实是多此一举,而且和你if
条件不生效的原因没什么关系。
虽然根据t
来判断条件看起来不错,但t == int(t)
这个判断可能不太好用,除非t_step
是1.0 / 2**N
的整数倍(这里的N
是某个整数)。因为浮点数在计算时不能精确表示小数,只有满足这个条件才能做到。如果你想要更精确的计算,可以用decimal.Decimal
,但这样会让你的计算速度变慢,因为浮点数的计算是直接由电脑硬件支持的,而小数计算就不是了。
23
for循环会自动帮你加1,所以你不需要写 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: ..."