2011-02-08 2 views
15

Я пытаюсь зацикливаться от 0 до 1, используя размеры шагов 0,01 (например). Как мне это сделать? for i in range(start, stop, step) принимает только целые аргументы, поэтому поплавки не будут работать.Как получить больше контроля над циклами в Python?

+1

http://stackoverflow.com/questions/477486/python-decimal- range-step-value –

ответ

16
for i in [float(j)/100 for j in range(0, 100, 1)]: 
    print i 
+2

+1 это гарантирует количество шагов – eumiro

+0

Имейте в виду, что последнее напечатанное значение здесь 0.99, а не 1.0, но это только потому, что последнее значение, возвращаемое 'range', равно 99, а не 100. –

+1

Если вы хотите 0.00 до 1.00 включительно, затем используйте: 'range (0, 101, 1)'. – Santa

0

Ну, вы можете сделать свою петлю от 0 до 100 с шагом размером 1, который даст вам столько же шагов. Тогда вы можете разделить i на 100 за то, что вы собираетесь с ним делать.

+0

@James Да, мы могли бы просто создать бесконечный цикл while и поддерживать счетчики внутри цикла. Тем не менее, я пытаюсь изучить Python, и я подумал, что было бы хорошо знать. – efficiencyIsBliss

+2

Одна проблема заключается в том, что инициализация переменной до 0.0 и добавление 0,01 к ней 100 раз не обязательно приведет к точно 1,0. Таким образом, «правильный» способ сделать это во многом зависит от того, как использовать значения. – garyjohn

+0

@efficiencyIsBliss - первое, что вам нужно узнать, это то, что поплавки не так точны, как вы можете ожидать. Вроде. Перейдите к интерпретатору Python, введите «a = 0.4», затем введите, затем введите «a» и введите. – dotalchemy

1

Один из вариантов:

def drange(start, stop, step): 
    while start < stop: 
      yield start 
      start += step 

Использование:

for i in drange(0, 1, 0.01): 
    print i 
+0

-1: Это может иметь проблему, если «шаг» не может быть точно представлен числом с плавающей запятой. Например, последний элемент для «drange (0,13,0.13)» составляет 12,870000000000024 (** 100 ** элементов), а последний элемент для «drange (0,11,0.11)» - 10.999999999999995 (** 101 ** элементы). – eumiro

+0

Даже проще: 'list (drange (0,10,1))' похоже, что он ведет себя как 'range':' 0, 1, 2, 3, 4, 5, 6, 7, 8, 9] 'but' list (drange (0,1,0.1)) 'дает дополнительный элемент:' [0, 0.1, 0.2, 0.30000000000000004, 0.4, 0.5, 0.6, 0.7, 0.7999999999999999, 0.8999999999999999, 0.999999999999999999] '. – Duncan

4

Избегайте компаундирования с плавающей точкой ошибки при таком подходе. Количество шагов соответствует ожидаемому, а значение рассчитывается для каждого шага.

def drange2(start, stop, step): 
    numelements = int((stop-start)/float(step)) 
    for i in range(numelements+1): 
      yield start + i*step 
Usage: 

for i in drange2(0, 1, 0.01): 
    print i 
-1

код

for i in range(0,100,0.01): 

может быть достигнуто в очень простым способом, вместо того, чтобы использовать поплавок

for i in range(0,10000,1): 

если вы очень обеспокоены с поплавком, то вы можете пойти с https://stackoverflow.com/a/4935466/2225357

+0

После этого используйте цикл 'dec = float (i)/100' внутри цикла for, если вы все еще хотите десятичное значение –

0

Вы можете также просматривать список как:

print([i for i in [float(j)/100 for j in range(0, 100, 1)]]) 

если вы хотите контроль над печатью я тогда сделать что-то вроде этого:

print(['something {} something'.format(i) for i in [float(j)/100 for j in range(0, 100, 1)]]) 

или

list(i for i in [float(j)/100 for j in range(0, 100, 1)]) 
Смежные вопросы