Как устроены циклы в Python?

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

Синтаксис цикла for в Python

Цикл for в Python итерирует по заданной последовательности и обладает следующим синтаксисом:

for <variable> in <iterable>:
for <variable> in range(<number>):
for <variable> in range(<start_number>, <end_number>):
for <variable> in range(<start_number>, <end_number>, <step_size>):
for i, <variable> in enumerate(<iterable>): # с индексом i
for <variable1>, <variable2> in zip(<iterable1>, <iterable2>):

Синтаксис цикла while в Python

Цикл while в Python повторяется, пока выполняется определенное логическое условие и обладает следующим синтаксисом:

while <boolean expression>:
  ...

Как работать с циклами в Python?

Ниже собраны примеры решений основных задач, с которыми сталкиваются Python разработчики и дата-саентисты:

Как перебрать значения списка циклом for?

Циклы for перебирают коллекцию элементов, таких как list или dict, и запускают блок кода с каждым элементом из коллекции.

for i in [0, 1, 2, 3, 4]: print(i) # Вывод: # 0 # 1 # 2 # 3 # 4

Вышеприведенный цикл for выполняет итерацию по списку чисел.
Каждая итерация устанавливает значение i для следующего элемента списка. Итак, сначала это будет 0, затем 1, затем 2 и т.д

Аналогично, цикл работает с любыми типами списков, например, со списком строк:

for x in ['one', 'two', 'three', 'four']: print(x) # Вывод: # one # two # three # four

Часто, необходимо сгенерировать последовательность чисел и обойти ее, для этого удобно использовать функцию range:

for x in range(1, 6): print(x) # Вывод: # 1 # 2 # 3 # 4 # 5

Как получить индекс элемента в цикле for в Python?

Если вы хотите зациклить как элементы списка, так и индекс для элементов, вы можете использовать функцию enumerate:

for index, item in enumerate(['one', 'two', 'three', 'four']): print(index, '::', item) # Вывод: # (0, '::', 'one') # (1, '::', 'two') # (2, '::', 'three') # (3, '::', 'four')

Функция enumerate генерирует кортежи, которые распаковываются в индекс (целое число) и элемент (фактическое значение из списка).

Как перебрать словарь (dict) циклом for?

Ключи словаря в Python можно перебрать циклом for следующим образом:

d = {"a": 1, "b": 2, "c": 3} for key in d: print(key) # Вывод: # "a" # "b" # "c"

Это эквивалентно использованию метода словаря keys:

d = {"a": 1, "b": 2, "c": 3} for key in d.keys(): print(key) # Вывод: # "a" # "b" # "c"

Для перебора значений словаря в Python необходимо использовать метод словаря values:

d = {"a": 1, "b": 2, "c": 3} for value in d.values(): print(values) # Вывод: # 1 # 2 # 3

Для перебора ключей и значений словаря используйте метод items:

d = {"a": 1, "b": 2, "c": 3} for key, value in d.items(): print(key, "::", value) # Вывод: # a :: 1 # b :: 2 # c :: 3

Метод items возвращает последовательность кортежей, использование for с несколькими переменными (key, value) называется распаковкой. Ее можно применять и для списков:

collection = [('a', 'b', 'c'), ('x', 'y', 'z'), ('1', '2', '3')] for i1, i2, i3 in collection: print('i1 =', i1, ':: i2 =', i2, ':: i3 =', i3) # Вывод: # i1 = a :: i2 = b :: i3 = c # i1 = x :: i2 = y :: i3 = z # i1 = 1 :: i2 = 2 :: i3 = 3

Как работает цикл while в Python?

Цикл while будет повторять код в блоке, пока условие цикла не станет False. Следующий код выполнит код в блоке цикла 4 раза:

i = 0 while i < 4: i = i + 1 print(i) # Вывод: # 1 # 2 # 3 $ 4

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

while True: print "Infinite loop" # Вывод: # Infinite loop # Infinite loop # Infinite loop # ...

Что такое pass в Python или как ничего не делать в цикле?

pass — это нулевой оператор и используется, когда оператор требуется синтаксисом Python (например, в теле цикла for или while), но никакие действия не нужны. Этот оператор можно использовать как заполнитель для кода, который ещё не написан.

for x in range(10): pass # нам не нужно ничего выполнять или пока не знаем что здесь должно быть, поэтому используем pass

В этом примере ничего не произойдёт. Цикл for завершится без ошибок, но никакие команды или код не будут выполнены. pass позволяет нам успешно выполнять наш код без полной реализации всех команд и действий.

Аналогично, pass можно использовать в циклах while, а также в выборках, определениях функций и т.д.

while x == y: pass

Как выполнить следующий проход цикла используя оператор continue?

Оператор continue перейдет к следующей итерации цикла, минуя остаток текущего блока кода, но продолжая цикл. Оператор continue может использоваться только внутри цикла:

for i in (0, 1, 2, 3, 4, 5): if i == 2 or i == 4: continue print(i) # Вывод: # 0 # 1 # 3 # 5

Обратите внимание, что 2 и 4 не выводятся. Это происходит потому, что continue переходит к следующей итерации, а не продолжает выводить i, когда i==2 или i==4.

Как досрочно выйти из цикла используя оператор break?

Оператор break моментально прерывает дальнейшее выполнение кода внутри цикла:

i = 0 while i < 7: print(i) if i == 4: print("Breaking from loop") break i += 1 # Вывод: # 0 # 1 # 2 # 3 # 4 # Breaking from loop

Использование операторы break, как и в случае с continue, допускаются только внутри циклов.

Оператор break также доступен внутри циклов for:

for i in (0, 1, 2, 3, 4): print(i) if i == 2: break # Вывод: # 0 # 1 # 2

Обратите внимание, что 3 и 4 не выводятся после окончания цикла.

Если цикл имеет условие else, оно не выполняется, когда цикл завершается с помощью оператора break.

Как выполнить код после завершения цикла используя оператор else?

Циклы for и while могут иметь условие else.

Условие else выполняется только после завершения цикла for путем итерации до завершения в случае цикла for или после завершения цикла while, когда его условное выражение становится ложным.

Пример условия else в цикле for:

for i in range(3): print(i) else: print('done') # Вывод: # 0 # 1 # 2 # done

Пример условия else в цикле while:

i = 0 while i < 3: print(i) i += 1 else: print('done') # Вывод: # 0 # 1 # 2 # done

Условие else не выполняется, если цикл завершается принудительно (например, с помощью оператора break или путем вызова исключения):

for i in range(2): print(i) if i == 1: break else: print('done') # Вывод: # 0 # 1

Зачем использовать конструкцию for/while ... else?

Частой задачей на использование конструкции for ... else является реализация поиска, например:

a = [1, 2, 3, 4] for i in a: if type(i) is not int: print(i) break else: print("no exception") # Вывод: # no exception

Для простоты восприятия, можно читать эту конструкцию как «if not break» или «if not found».

Как вернуть значение из цикла оператором return?

Оператор return выводит значение из функции, не выполняя следующий за нем код.

Если у вас есть цикл внутри функции, использование return внутри цикла эквивалентно break, поскольку остальная часть кода цикла не выполняется. Код следующий за циклом также не выполняется:

def break_loop(): for i in range(1, 5): if (i == 2): return(i) print(i) return(5) break_loop() # Вывод: # 1 # 2

Если вы используете return во вложенных циклах, оператор return прервёт все циклы:

def break_all(): for j in range(1, 5): for i in range(1, 4): if i*j == 6: print('return') return(i) print(i*j) # Вывод: # 1 # 2 # 3 # 2 # 4 # return (потому что 2*3=6, остальные итерации обоих циклов не выполняются) # 3 (это результат работы функции из return)

Упражнение для закрепления

Обойдите и распечатайте все четные числа из списка в том же порядке, в котором они были получены. Не печатайте цифры, которые появятся в последовательности после 237.

numbers = [ 951, 402, 984, 651, 360, 69, 408, 319, 601, 485, 980, 507, 725, 547, 544, 615, 83, 165, 141, 501, 263, 617, 865, 575, 219, 390, 984, 592, 236, 105, 942, 941, 386, 462, 47, 418, 907, 344, 236, 375, 823, 566, 597, 978, 328, 615, 953, 345, 399, 162, 758, 219, 918, 237, 412, 566, 826, 248, 866, 950, 626, 949, 687, 217, 815, 67, 104, 58, 512, 24, 892, 894, 767, 553, 81, 379, 843, 831, 445, 742, 717, 958, 609, 842, 451, 688, 753, 854, 685, 93, 857, 440, 380, 126, 721, 328, 753, 470, 743, 527 ] # your code goes here numbers = [ 951, 402, 984, 651, 360, 69, 408, 319, 601, 485, 980, 507, 725, 547, 544, 615, 83, 165, 141, 501, 263, 617, 865, 575, 219, 390, 984, 592, 236, 105, 942, 941, 386, 462, 47, 418, 907, 344, 236, 375, 823, 566, 597, 978, 328, 615, 953, 345, 399, 162, 758, 219, 918, 237, 412, 566, 826, 248, 866, 950, 626, 949, 687, 217, 815, 67, 104, 58, 512, 24, 892, 894, 767, 553, 81, 379, 843, 831, 445, 742, 717, 958, 609, 842, 451, 688, 753, 854, 685, 93, 857, 440, 380, 126, 721, 328, 753, 470, 743, 527 ] # your code goes here for number in numbers: if number == 237: break if number % 2 == 1: continue print(number) test_object("number", undefined_msg="Define a object `number` using the code from the tutorial to print just the desired numbers from the Упражнение description.",incorrect_msg="Your `number` object is not correct, You should use an `if` statement and a `break` statement to accomplish your goal.") success_msg("Great work!")