Знакомство с циклом for
Именованные аргументы функции print
Мы уже пользовались тем, что функция print при выводе разделяет аргументы пробелами, а в конце переходит на новую строчку.
Часто это удобно. Но что если от этого нужно избавиться? В примере ниже пробелы появляются не только после двоеточий (что хорошо), но и перед запятой (что плохо).
sep и end
Функция print
, наряду с другими аргументами, может (вместе или по отдельности) принимать два следующих аргумента: sep
— разделитель аргументов (по умолчанию пробел) и end
— то, что выводится после вывода всех аргументов (по умолчанию символ начала новой строки). В частности, если end сделать пустой строкой, то print
не перейдет на новую строчку, и следующий print
продолжит вывод прямо на этой же строке.
Обратите внимание: знак =
здесь не выполняет никакого присваивания, переменных end
и sep
не появляется.
PEP8
Не используйте пробелы вокруг знака =,
если он используется для обозначения именованного аргумента.
Специальные символы в строках
Можно задаться вопросом: как указать значение end по умолчанию — символ начала новой строчки? Ведь это специальный символ, который нельзя сделать частью строки, просто поместив его между кавычек, это вызовет ошибку.
Экранирующая последовательность
Если внутри кавычек встречается символ \
— обратная косая черта, обратный слеш, бэкслеш, он вместе с идущим после него символом образует экранирующую последовательность (escape sequence) и воспринимается интерпретатором как единый специальный символ.
В частности:
\n
— символ начала новой строки\t
— табуляция,\'
— кавычка\
— просто бэкслеш.
Использование экранирующих последовательностей вместо специальных символов называется их экранированием.
Таким образом, значения именованных аргументов функции print
по умолчанию такие:
При этом если приписать букву r перед открывающей строку кавычкой, бэкслеши будут считаться обычными символами.
А если открывать и закрывать строку не одной, а тремя кавычками подряд, внутри можно делать обычные переводы строки (внутри одинарных кавычек так делать нельзя).
Цикл for
Цикл for
выполняет блок кода заданное количество раз.
Как и у while
, у цикла for
есть заголовок, заканчивающийся двоеточием, и тело цикла, которое записывается с отступом в четыре пробела.
В цикле вида for ... in range(...):
вместо первого многоточия указывается какая-то переменная, которая на начальной итерации принимает значение 0, на следующей — 1, и так далее, до значения указанного в range(...)
, само это значение переменная не принимает. Диапазон значений переменной-итератора от 0 включая и до значения, указанного в range(...)
, не включая его.
Вот программа, которая выводит на экран подряд (на отдельных строчках) целые числа от 0 (включительно) до n (не включительно).
Range
означает «диапазон», то есть for i in range(n)
читается как «для (всех) i в диапазоне от 0 (включительно) до n (не включительно)...». Цикл выполняется n раз.
Давайте вспомним задачу, где мы три раза получали цены на товар и вычисляли общую цену товара. Вот так мы ее записали через цикл while
:
Теперь мы ее можем записать через цикл for
, который будет выполняться три раза:
В данном случае переменная-счетчик изменяется сама в рамках заданных значений.
ELSE часть
У цикла for
, как и у цикла while
, есть else
-часть, которая работает по принципу: она выполняется после того, как цикл завершается штатно:
Соглашения об именовании переменных
В программах, решающих абстрактные, математические задачи, допустимо называть переменные короткими и непонятными именами типа n
или i
. Однако этого лучше избегать. Кроме того, стоит соблюдать общепринятые договоренности: буквой n
обычно обозначают количество чего-либо (например, итераций цикла). При этом если есть хоть какая-то определенность (например, речь идет о количестве автомобилей), то стоит и переменную назвать более понятно (например, cars
). Буквами i
и j
(по-русски они традиционно читаются как «и» и «жи») обычно обозначают итераторы цикла for
.
Начальное значение и шаг итератора в range
Предположим, вам нужен цикл, выполняющийся 10 итераций. При этом нужно, чтобы итератор пробегал значения не подряд (0, 1, ..., 9), а, скажем, 10, 20, ..., 100. Конечно, с помощью уже известной нам конструкции for можно организовать цикл, в котором некая дополнительная переменная будет последовательно принимать именно такие значения
Для этого есть и специальная встроенная в язык конструкция. В скобках после слова range
можно записать не одно, а два или три числа.
Эти числа будут интерпретироваться как начальное значение итератора, конечное и его шаг (может быть отрицательным).
Если для range
задано одно число, то итератор идет от 0 до заданного значения (не включая его).
Если задано два числа, то это начальное значение итератора и конечное.
Если задано три числа, то это не только начальное и конечное значение итератора, но и шаг итератора.
Когда какой цикл использовать
Цикл
while
нужен, когда какой-то кусок кода должен выполниться несколько раз, причем заранее неизвестно, сколько именноЦикл
for
нужен, когда какой-то кусок кода должен выполниться несколько раз, при этом известно сколько раз еще до начала цикла