Я просто хочу напечатать некоторые числа, используя базовый питон для цикла:

for i in range(10):
    i = i+1
    print(i)

Ожидаемый результат:

1
3
5
7
9

Фактический результат:

1
2
3
4
5
6
7
8
9
10

Почему переменная 'i' не перепрыгивает один шаг, когда она i = i+1. Что я предполагаю, что оба i's разные? Потому что я попытался распечатать идентификатор, используя print(id(i)). Поправьте меня если я ошибаюсь.

0
user8471763 28 Авг 2017 в 10:17

5 ответов

Лучший ответ

Здесь следует отметить, что изменение значения i не влияет на количество итераций. Вы выполняете текущий шаг кода от 0 до 9, увеличивая единицу до текущего значения. Он не пропускает эти итерации. i - это просто переменная цикла, которую назначает цикл for, она никак не контролирует итерацию.

Вместо этого используйте параметр step функции range:

In [665]: for i in range(1, 10, 2): # start, stop, step
     ...:     print(i)
     ...: 
1
3
5
7
9 

То, что происходит, это то, что range по умолчанию выполняет шаги по одному, так что в итоге вы пройдете через итерации, которые хотите пропустить.

4
cs95 28 Авг 2017 в 07:24

Вы можете попробовать два метода, это по-вашему,

>>> for i in range(10):
...     if i%2!=0:
...       print i
... 
1
3
5
7
9
>>> 

И следующее, как предложил @colspeed for i in range(1,10,2)

1
Mohideen bin Mohammed 28 Авг 2017 в 07:25

Циклы Python for не заботятся о любых изменениях, внесенных во временную переменную во время цикла. Когда он достигает конца, он помечает любой итератор, который вы передали, следующему элементу. в вашем случае это не индекс диапазона, который вы ему дали, это вывод диапазона по встроенному указателю цикла. Ответ Cricket - лучший способ решить вашу проблему, но если вы хотите изменить цикл изнутри себя, используйте внешние переменные:

numberlist = range(0,10)
i=0
while i < numberlist[-1]:
    i+=1 #+1 to skip
    print i
    i+=1 #+1 to turn while into for
1
Sam51 28 Авг 2017 в 07:26
>>> p = range(1,10,2)
>>> p
[1, 3, 5, 7, 9]

Или

>>> def test(last,step):
...     for item in range(1,last,step)
...         print item
>>> test(10,2)
1 
3
5
7
9
>>> 
>>> test(15,2)
1 
3
5 
7
9
11
13
2
Kallz 28 Авг 2017 в 07:32

Когда вы перебираете список [0,1,...9] (range(10)), на первой итерации i устанавливается на 0, тогда независимо от того, что вы делаете с i из там это не изменит того факта, что i будет установлен в 1 на следующей итерации, и так далее. Это ответ на вопрос, почему это не работает так, как вы ожидаете. Смотрите другие ответы о том, как вы можете это исправить ...

0
Julien 28 Авг 2017 в 07:24