开发者

Python Beginner: Selective Printing in loops

开发者 https://www.devze.com 2022-12-28 16:06 出处:网络
I\'m a very new python user (had only a little prior experience with html/javascript as far as programming goes), and was trying to find some ways to output only intermittent numbers in my loop for a

I'm a very new python user (had only a little prior experience with html/javascript as far as programming goes), and was trying to find some ways to output only intermittent numbers in my loop for a basic bicycle racing simulation (10,000 lines of biker positions would be pretty excessive :P).

I tried in this loop several 'reasonable' ways to communicate a condition where a floating point number equals its integer floor (int, floor division) to print out every 100 iterations or so:

 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 开发者_C百科** 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" 


The for loop auto increments for you, so you don't need to use i = i + 1.

You don't need t, just use % (modulo) operator to find multiples of a number.

# Log every 1000 lines.
LOG_EVERY_N = 1000

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

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


To print out every 100 iterations, I'd suggest

if i % 100 == 0: ...

If you'd rather not print the very first time, then maybe

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

(as another answer noted, the i = i + 1 is supererogatory given that i is the control variable of the for loop anyway -- it's not particularly damaging though, just somewhat superfluous, and is not really relevant to the issue of why your if doesn't trigger).

While basing the condition on t may seem appealing, t == int(t) is unlikely to work unless the t_step is a multiple of 1.0 / 2**N for some integer N -- fractions cannot be represented exactly in a float unless this condition holds, because floats use a binary base. (You could use decimal.Decimal, but that would seriously impact the speed of your computation, since float computation are directly supported by your machine's hardware, while decimal computations are not).


The other answers suggest that you use the integer variable i instead. That also works, and is the solution I would recommend. This answer is mostly for educational value.

I think it's a roundoff error that is biting you. Floating point numbers can often not be represented exactly, so adding .01 to t for 100 times is not guaranteed to result in t == 1:

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

So when you compare to an actual integer number, you need to build in a small tolerance margin. Something like this should work:

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


You can use python library called tqdm (tqdm derives from the Arabic word taqaddum (تقدّم) which can mean "progress) for showing progress and use write() method from tqdm to print intermittent log statements as answered by @Stephen

Why using tqdm is useful in your case?

  • Shows compact & fancy progress bar with very minimal code change.
  • Does not fill your console with thousands of log statement and yet shows accurate iteration progress of your for loop.

Caveats:

  • Can not use logging library as it writes output stdout only. Though you can redirect it to logfile very easily.
  • Adds little performance overhead.

Code

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)

How to install ?

pip install tqdm

Sample GIF that shows console output

Python Beginner: Selective Printing in loops

0

精彩评论

暂无评论...
验证码 换一张
取 消

关注公众号