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

12 投票
4 回答
25527 浏览
提问于 2025-04-15 22:00

我刚开始学习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_step1.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: ..."

撰写回答