Объяснение вложенного цикла Python

#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 .