Python Beginner: выборочная печать в циклах - PullRequest
3 голосов
/ 25 апреля 2010

Я очень новый пользователь Python (имел небольшой опыт работы с html / javascript в плане программирования) и пытался найти несколько способов вывода только прерывистых чисел в моем цикле для базовой симуляции велогонок (10000 строк байкерских позиций были бы чрезмерными: 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" 

Ответы [ 3 ]

12 голосов
/ 25 апреля 2010

Автоматическое увеличение цикла 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: ..."
3 голосов
/ 25 апреля 2010

Чтобы распечатать каждые 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 для некоторого целого числа N - дроби не могут быть точно представлены в плавающей запятой если это условие не выполняется, потому что числа с плавающей запятой используют двоичную базу. (Вы могли бы использовать decimal.Decimal, но это серьезно повлияло бы на скорость ваших вычислений, поскольку вычисления float напрямую поддерживаются аппаратным обеспечением вашей машины, а десятичные вычисления - нет).

2 голосов
/ 25 апреля 2010

В других ответах предлагается использовать целочисленную переменную 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" 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...