我是一个非常新的python用户(就编程而言,只有一点html / javascript的经验),并试图找到一些方法在我的循环中输出仅用于基本自行车赛车模拟的间歇性数字(10,000行骑车位置相当过分:P)。
我在这个循环中尝试了几种“合理的”方式来传达浮点数等于其整数层(int,floor division)的条件,以便每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"
答案 0 :(得分:12)
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: ..."
答案 1 :(得分: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
的{{1}}的倍数 - 除非条件成立,否则不能在float中精确表示分数,因为浮点数使用二进制基数。 (可以使用N
,但这会严重影响计算速度,因为计算机的硬件直接支持decimal.Decimal
计算,而十进制计算则不支持)。
答案 2 :(得分:2)
其他答案建议您使用整数变量i
。这也有效,是我推荐的解决方案。这个答案主要是为了教育价值。
我认为这是一个令人厌恶的导致错误。浮点数通常无法准确表示,因此将.01
添加到t
100
次并不能保证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"
答案 3 :(得分:0)
您可以使用名为tqdm的python库(tqdm源自阿拉伯语taqaddum(تقدّم),其意思是“进度”)来显示进度,并使用tqdm的write()方法来打印间歇性日志语句,如下所示@Stephen
为什么在您的情况下使用tqdm有用?
注意事项:
logging
库,因为它仅写入输出标准输出。虽然可以redirect it to logfile very easily。代码
from tqdm import tqdm
from time import sleep
# Log every 100 lines.
LOG_EVERY_N = 100
for i in tqdm(range(1,1000)):
if i%LOG_EVERY_N == 0:
tqdm.write(f"loggig : {i}")
sleep(0.5)
如何安装?
pip install tqdm
显示控制台输出的示例GIF