Цикл 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:
В данном случае переменная-счетчик изменяется сама в рамках заданных значений.
ELSE часть
У цикла for, как и у цикла while, есть else-часть, которая работает по принципу: она выполняется после того, как цикл завершается штатно:
Если цикл не выполняется ни одного раза, то else-часть выполнится все равно:
Соглашения об именовании переменных
В программах, решающих абстрактные, математические задачи, допустимо называть переменные короткими и непонятными именами типа n или i. Однако этого лучше избегать. Кроме того, стоит соблюдать общепринятые договоренности: буквой n обычно обозначают количество чего-либо (например, итераций цикла). При этом если есть хоть какая-то определенность (например, речь идет о количестве автомобилей), то стоит и переменную назвать более понятно (например, cars). Буквами i и j (по-русски они традиционно читаются как «и» и «жи») обычно обозначают итераторы цикла for.
Начальное значение и шаг итератора в range
Предположим, вам нужен цикл, выполняющийся 10 итераций. При этом нужно, чтобы итератор пробегал значения не подряд (0, 1, ..., 9), а, скажем, 10, 20, ..., 100. Конечно, с помощью уже известной нам конструкции for можно организовать цикл, в котором некая дополнительная переменная будет последовательно принимать именно такие значения
Для этого есть и специальная встроенная в язык конструкция. В скобках после слова range можно записать не одно, а два или три числа.
Эти числа будут интерпретироваться как начальное значение итератора, конечное и его шаг (может быть отрицательным).
Если для range задано одно число, то итератор идет от 0 до заданного значения (не включая его).
Если задано два числа, то это начальное значение итератора и конечное.
Если задано три числа, то это не только начальное и конечное значение итератора, но и шаг итератора.
Когда какой цикл использовать
- Цикл while нужен, когда какой-то кусок кода должен выполниться несколько раз, причем заранее неизвестно, сколько именно
- Цикл for нужен, когда какой-то кусок кода должен выполниться несколько раз, при этом известно сколько раз еще до начала цикла
Задачи
Задача 1
Напишите программу, которая выводит числа от 0 до n включительно — каждое на новой строке.
Тест 1:
Ввод:
Вывод:Задача 2
Напишите программу, которая выводит числа от 0 до n включительно на одной строке через пробел.
Тест 1:
Ввод:
Вывод:Задача 3
Напишите программу, которая считывает строку и число n, затем выводит эту строку n раз — каждый раз на новой строке с номером:
Тест 1:
Ввод:
Вывод:Задача 4
Напишите программу, которая выводит обратный отсчёт от n до 0 включительно, а затем Пуск!.
Тест 1:
Ввод:
Вывод:Задача 5
Напишите программу, которая считывает n и выводит куб каждого числа от 0 до n по шаблону:
Тест 1:
Ввод:
Вывод:Задача 6
Напишите программу, которая вычисляет факториал числа n (произведение всех чисел от 1 до n).
Тест 1:
Ввод:
Вывод:Тест 2:
Ввод:
Вывод:Задача 7
Напишите программу, которая считывает n чисел и выводит их сумму.
Тест 1:
Ввод:
Вывод:Задача 8
Напишите программу, которая считывает n чисел и выводит их произведение, пропуская нули.
Тест 1:
Ввод:
Вывод:Задача 9
Напишите программу, которая выводит все делители числа n.
Тест 1:
Ввод:
Вывод:Тест 2:
Ввод:
Вывод:Задача 10
Напишите программу, которая считывает n и выводит знакочередующуюся сумму: первое число прибавляется, второе вычитается, третье прибавляется и так далее.
Тест 1:
Ввод:
Вывод:Тест 2:
Ввод:
Вывод: