Python初学者:循环中的选择性打印

11

我是一个非常新的Python用户(以编程为基础只有一点点HTML / JavaScript的经验),正在尝试找到一些方法,在基本自行车比赛模拟中仅输出间歇性数字(10000行骑手位置会非常过度: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" 

2
欢迎来到 Stack Overflow!您可以通过缩进四个空格来格式化代码,或者让按钮为您完成。 - Thomas
4个回答

22

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: ..."

6

为了每100次迭代打印输出,我建议

if i % 100 == 0: ...

如果您不想在第一次打印时进行打印,那么也许可以这样做。
if i and i % 100 == 0: ...

(正如另一个答案所指出的那样,i = i + 1是多余的,因为i已经是for循环的控制变量了--虽然它并不特别有害,但有点多余,并且与为什么你的if不触发的问题无关。)
尽管基于t的条件似乎很吸引人,但除非t_step1.0 / 2 ** N的整数倍,否则t == int(t)不太可能奏效--除非满足此条件,否则浮点数无法准确表示分数,因为浮点数使用二进制基数。(你可以使用decimal.Decimal,但这将严重影响计算速度,因为float计算直接由机器硬件支持,而十进制计算则不是)。

是的,我一直在使用自己粗糙的方法来避免打印出t的第一个值...不过每犯一个错误就能学到更多的计算机理论,这总是很棒的 :) - Jonathan Straus

3

其他答案建议使用整数变量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" 

嗯,这真的很有趣,我以前从未听说过简单操作中的“误差范围”……我得试一下 :) - Jonathan Straus

0

您可以使用名为tqdm的Python库(tqdm源自阿拉伯语单词taqaddum(تقدّم),意为“进展”)来显示进度,并使用tqdm的write()方法打印间歇性日志语句,如@Stephen所回答的。

为什么在您的情况下使用tqdm很有用?

  • 显示简洁而时尚的进度条,代码更改非常小。
  • 不会用成千上万的日志语句填充控制台,但仍然显示您的for循环的准确迭代进度。

注意事项:

代码

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

enter image description here


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