Знакомство с циклом 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нужен, когда какой-то кусок кода должен выполниться несколько раз, при этом известно сколько раз еще до начала цикла