Как работает функция for, если она используется в цикле for? - PullRequest
3 голосов
/ 25 декабря 2011

Я использую документацию по python, чтобы начать изучать все, и она вводит цикл for с функцией for внутри указанного цикла for. Я делаю ужасную работу по объяснению, потому что мне очень трудно следить за терминологией, поэтому я просто покажу вам:

for n in range(2, 10):
    for x in range(2, n):
        if n % x == 0:
            print n, 'equals', x, '*', n/x
            break
        else:

            print n, 'is a prime number'

Я понимаю циклы if / else и оператор break. Я вижу, что он каким-то образом генерирует простые числа от 2 до 10. Кроме этого, я немного заблудился с этим примером. Документация становится невыносимо многословной, и я едва могу понять ее очень много на данный момент. Я просто надеялся, что кто-нибудь сможет объяснить это в несколько более простых терминах

Ответы [ 4 ]

2 голосов
/ 25 декабря 2011

Я собираюсь определенно согласиться с ответом @Josh и @ g.d.d.c здесь, но есть еще кое-что, что нужно объяснить, чтобы понять конструкцию цикла for и какова ее мощь на самом деле. Но чтобы получить это, мне нужно немного поговорить о том, что такое итеративный объект.


Циклы Python for не работают так же, как в другом языке, например, в Java. Циклы for здесь требуют чего-то, что они могут повторить . Это означает три типа данных (в общем): списки, кортежи и словари. Все три из них имеют значения, которые могут быть повторены, и, таким образом, цикл for будет хорошо работать с ними.

Функция range(a, b, s) создаст список значений в диапазоне [a, b), опционально с пропуском значения s. Поскольку список является итеративным, мы можем использовать его с оператором for.

Когда вы вкладываете for операторы, вы выполняете вложенный цикл . Самый дальний оператор for будет работать чаще всего. Вы можете сравнить вложенный цикл с аналоговым таймером - секундная стрелка - самая внутренняя for, минутная стрелка - уровень выше этого, а часовая стрелка - уровень выше этого.

Теперь перейдем к этому примеру. Во внешнем цикле for мы привязываем каждое значение, полученное из итеративного списка, к переменной - в данном случае n. Когда мы начинаем цикл, n == 2. Мы подходим к внутреннему циклу for и замечаем, что привязываем переменную x к списку [2, 2), который будет пустым - наличие одинаковых начальной и конечной точки в range() ничего не возвращает. Поэтому в первый раз мы пропустили внутренний цикл.

Как только мы закончим с внутренней петлей уровня, мы вернемся и повторим внешней петли. Итак, n == 3. Мы приходим во внутренний цикл и привязываем x к первому значению в итерируемом диапазоне [2, 3), которое будет 2. Затем мы выполняем внутренние операции, как ожидается от оператора if.

Когда мы наконец доберемся до точки, когда n == 9 (максимальное значение; помните, n никогда не может быть равно 10 в этом примере из-за ограничений диапазона), x будет привязано к первому значению итерируемого диапазон [2, 9). Итак, x начнется с 2, затем перейдет к 3 и т. Д.

Если вы хотите узнать больше о том, как работают циклы for, то я рекомендую изучить понимание списков и даже сослаться на Погрузиться в раздел Python по спискам .

2 голосов
/ 25 декабря 2011

Перво-наперво для это не функция, а конструкция.Кроме того, если / else не цикл, а разветвляющаяся конструкция

Рассмотрим помеченный код

for n in range(2, 10): # this is the outer loop
    for x in range(2, n): # this is the inner loop 
                          #(this is where the code is checking whether n is prime)
        if n % x == 0: #checking is x divides n
            print n, 'equals', x, '*', n/x
            break
        else:

            print n, 'is a prime number'

далее, цикл external for повторяется от 2 до 10.Каждая итерация цикла имеет еще один внутренний цикл.Этот внутренний цикл повторяет от 2 до этого числа и проверяет делимость для проверки, что переменная n (внешний цикл) является простым числом или нет.

Например:

For the first iteration
n=2
x=nothing

, затем

n=3
x=2

и

n=4
x=2,3

и т. Д.

просто для добавления в python, в отличие от других популярных языков, цикл for не увеличивает значение переменной.Вместо этого он просто выбирает значение за раз из списка / массива значений, которые вы указываете (например, для диапазона (2,10) в данном случае это массив [2 3 4 5 6 7 8 9]

2 голосов
/ 25 декабря 2011

for n in range(2, 10):

означает, что n будет принимать значения 2 - 10, по одному за раз, и каждый раз, когда оно принимает новое значение, запускать внутренний цикл.

Внутренняя петля,

for x in range(2, n):

означает, что x примет значения 2 - n, по одному, и выполнит свои внутренние значения if / else.

Таким образом, внешний цикл начинается с 2, поэтому n = 2. Внутренний цикл повторяется от 2-n, n = 2, поэтому 2-2, поэтому один раз.

Затем управление переходит обратно к внешнему циклу, n увеличивается, и внутренний цикл теперь выполняется из 2-n, где n равно 3. Таким образом, x принимает значения 2, затем 3, а поскольку n равно 3 переходит обратно во внешний цикл и т. д.

Вот некоторый поток:

:start outer, n = 2
:goto inner, x will range from 2 - 2, so x = 2, x hits max for the inner loop
:goto outer, n = 3
:goto inner, x will range from 2 - 3, so x = 2, iterate once, x = 3, x hits max for inner loop
:goto outer, n = 4
:repeat
1 голос
/ 25 декабря 2011

Когда вы вкладываете петли for, внутренний цикл повторяется для каждого раунда внешнего цикла.Итак, для вашего примера, это начинается так:

for x in range(2, 2):

Затем переходит к

for x in range(2, 3):

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...