#python #for-loop #nested
Вопрос:
Я новичок в кодировании на python и не понимаю, почему вложенный цикл for возвращает только 0 1 2 для первой итерации.
Ввод:
x = 3
for i in range (x):
for j in range (x):
x = 2
print (i, '',j)
Выход:
0 0
0 1
0 2
1 0
1 1
2 0
2 1
Комментарии:
1. ты не знаешь, что
x = 2
делает?2. Диапазон отсчитывается от
0
до , но не включаетx
, и вы меняетесьx
, чтобы быть2
вj
цикле. Во второмi
цикле и далее он будет использоватьrange(2)
Ответ №1:
x
изменяется после того, как он передан range
для создания range(3)
. Вы видите только последствия изменения (т. е. range(2)
) в следующем цикле.
Комментарии:
1. После повторного прочтения вопроса это может быть ответом на несколько другой вопрос, но я надеюсь, что он все еще полезен.
Ответ №2:
Концепция вложенных циклов for:
Давайте разберем эту проблему (я сам новичок!)
x = 3
for i in range (x):
Теперь функция диапазона состоит из 3 частей (старт, стоп, шаг).
начало: начните с этого номера
стоп: максимальное значение
шаг: увеличивается на это значение
когда мы говорим диапазон(x); это предполагает, что x=3 в качестве максимального/максимального значения диапазона. Начальное значение по умолчанию принимается равным 0, а значение шага по умолчанию принимается равным 1. Таким образом,диапазон, который мы получаем здесь, равен [0,1,2,3) {начинается с 0 и заканчивается на 3}, Поэтому значения, которые » я « могу принимать, равны 0,1 и 2, потому что 3-это максимум диапазона; он не включен в значения, которые могут принимать i и j.
Так что выводите до этого момента:
for i in range (x):
for j in range (x):
(печать i и j, разделенных пробелом)является:
0 0
0 1
0 2
В начале выводится 0, и цикл повторяется еще 2 раза.
(сначала вы печатаете все нули для i, так как написанное вами утверждение отправляет инструкцию для печати всех значений j для одного значения во внешнем/главном цикле for; потому что цикл для j вложен в цикл для i)
Теперь, x= 2 означает, что с этой точки значения » j « могут принимать значение 0,1. Следовательно, вторая часть вывода:
1 0
1 1
Аналогично, третья часть выходных данных:
2 0
2 1
Следовательно, конечный результат, который вы получите, будет:
0 0
0 1
0 2
1 0
1 1
2 0
2 1
Ответ №3:
Длинная версия
- В операторе for «
for
целевоеin
выражение:
» вторая часть представляет собой повторяющийся объект. range
это не «зарезервированное» слово; это имя встроенного типа(класса), которое можно повторятьПримечание : Подсветка синтаксиса обманывает, если она выделяется
range
как зарезервированное слово. Он делает это, потому что это, как правило, полезно, так какrange
в основном используется в сочетании сfor
. Но это не меняет того, что такое диапазон. Однако это может ввести вас в заблуждение.В результате вышеизложенного:
- правильный набор
range(x)
текста неrange (x)
range(x)
создайте объект типа range и инициализируйте его сx
помощью .
- правильный набор
Короткий ответ
x
интерпретируется, когда он передается range()
.
Код для печати объектов диапазона:
x = 3
range_i = range(x)
print(f"i loop x: {x}, range(x):{range_i}")
for i in range_i:
range_j = range(x)
print(f"j loop x: {x}, range(x):{range_j}")
for j in range_j:
x = 2
print(i, ' ',j)
Выход
i loop x: 3, range(x):range(0, 3)
j loop x: 3, range(x):range(0, 3)
0 0
0 1
0 2
j loop x: 2, range(x):range(0, 2)
1 0
1 1
j loop x: 2, range(x):range(0, 2)
2 0
2 1
Эмпирическое правило
Если вы действительно не знаете, что делаете, не связывайтесь с выражением оператора for.
lst = ['a', 'b', 'c', 'd']
for x in lst:
if x == 'b':
lst.remove('a')
print(x, end = ' ')
дает
a b d
И
lst = ['a', 'b', 'c', 'd']
for x in lst:
if x == 'd':
lst.insert(0, 'z')
print(x, end = ' ')
не заканчивается, и » z » никогда не появляется:
a b c d d d d d d d d d d d d d ...
Размышляя вокруг
Примечание : то, что следует ниже, НЕ рекомендуется
Вы можете переопределить диапазон. (Приведенный ниже пример является очень упрощенным переопределением: он не учитывает вторую версию диапазона : range(start, stop[, step]
) и не заботится о других range
спецификациях)
def range(n):
i = 0
while i <= n: # note the use of '<=' instead of '<'
yield i
i = 1
И теперь «диапазон» ведет себя не так, как следовало бы.
Пример:
for i in range(3):
print(x, end = ' ')
дает:
0 1 2 3
Да: 0..3, а не 0..2 как «истина» range
.