Распечатайте числа, кратные определенному числу, равномерно
Возможно, глупый вопрос, я пытаюсь напечатать числа в цикле таким образом, чтобы они были кратны 10. Это очень легко, если временной цикл в цикле кратен 10. Вот как я это делаю:
time = 0.
timestep = 2.
while time <= 100.:
if int(round(time)) % 10 == 0:
print time
time += timestep
что дает мне вывод:
0.0
10.0
20.0
30.0
40.0
50.0
60.0
70.0
80.0
90.0
100.0
И если я использую timestep = 1, я получаю похожий вывод. Моя проблема в том, что теперь мой временной шаг задан как функция другой переменной и представляет собой число с плавающей запятой со многими десятичными знаками. Например, для одного случая временной шаг равен 1.31784024239, и если я попытаюсь сделать аналогичный цикл, числа, которые я получу, больше не будут такими равномерными. Например, я получаю:
0.0
19.7676036358
30.310325575
39.5352072717
50.0779292108
69.8455328467
80.3882547858
89.6131364825
У меня вопрос, есть ли какая-нибудь хитрость, чтобы мой вывод печатался равномерно - каждые, скажем, 10 дней? это не обязательно должно быть ровно десять, но я хотел бы иметь точку, например, между 0 и 19 (около 10) и еще одну около 60, поскольку есть скачок с 50,07 до 69,84.
Я не знаю, возможно ли это, но любые идеи действительно будут полезны, так как многие мои временные шаги являются числами с большим количеством десятичных знаков.
2 ответа
Вот простое решение, которое находит шаги, которые являются ближайшими к данной серии кратных:
def stepper(timestep, limit=100.0, multiple=10.0):
current = multiples = 0.0
while current <= limit:
step = current + timestep
if step >= multiples:
if multiples - current > step - multiples:
yield step
else:
yield current
multiples += multiple
current = step
for step in stepper(1.31784024239):
print step
Выход:
0.0
10.5427219391
19.7676036358
30.310325575
39.5352072717
50.0779292108
60.6206511499
69.8455328467
80.3882547858
89.6131364825
100.155858422
Вспомните последний раз, когда вы печатали строку, и напечатайте другую строку, как только изменится десятилетие:
time = 0.
lasttime = -1.
timestep = 3.
while time <= 100.:
if time // 10 != lasttime // 10:
print time
lasttime = time
time += timestep
Результат:
$ python x.py
0.0
12.0
21.0
30.0
42.0
51.0
60.0
72.0
81.0
90.0