Циклы for и while. Цикл for
Скачать 0.54 Mb.
|
ПримечанияПримечание. Следует помнить, что правая граница цикла в Python всегда не включительна. Таким образом следующий код: for i in range(5): print(i) распечатает числа от 0 до 4: 0 1 2 3 4 Если требуется распечатать числа от 1 до 5, то мы пишем код: for i in range(5): print(i + 1) Задачи Тема урока: цикл for Цикл for Функции range() с одним параметром Функции range() с двумя параметрами Функции range() с тремя параметрами Решение задач Аннотация. Урок посвящен циклу for, в частности функции range(), которая позволяет генерировать последовательность чисел. Изучим две дополнительные перегрузки функции range(), которые позволяют настраивать элементы последовательности. Функция range() с одним параметром Рассмотрим программный код: for i in range(10): print('Привет', i) Значение, которое мы указываем в скобках у функции range() обозначает количество итераций цикла, при этом переменная i принимает последовательно значения: 0, 1, 2, 3, 4, 5, 6, 7, 8, 9. Если быть более точным, то мы говорим, что функция range(n) генерирует последовательность чисел от 0 до n-1, а цикл for последовательно перебирает эту последовательность. Перегрузка range() с двумя параметрами Если мы хотим начинать последовательность не с 0, а с какого-то другого числа, то мы можем использовать перегрузку функции range() принимающую два параметра. Например, вызов функции range(1, 5) сгенерирует последовательность чисел 1, 2, 3, 4 (будьте внимательны, правая граница не включительна). Если нам нужны числа от 1 до 5 включительно, то мы используем range(1, 6). Таким образом: range(n): создает последовательность чисел 0, 1, 2, 3, ..., n - 1; range(n, m): создает последовательность чисел n, n + 1, n + 2, ..., m - 2, m - 1. Напишем программу, которая выводит те числа из промежутка [100; \, 999][100;999], которые оканчиваются на 7. Используя функцию range() с двумя параметрами, получаем: for i in range(100, 1000): # перебираем числа от 100 до 999 if i % 10 == 7: # используем остаток от деления на 10, для получения последней цифры print(i) Обратите внимание, в качестве второго параметра мы передали число 1000. Если первый параметр больше второго, то функция range() генерирует пустую последовательность. Например, вызов функции range(10, 1) приводит к генерации пустой последовательности. Перегрузка range() с 3 параметрами Передавая два параметра в функцию range() мы можем генерировать любую последовательность целых чисел с шагом 1. Но, что делать если нужно поменять шаг? Как быть если мы хотим сгенерировать последовательность чисел 5, 10, 15, 20, 25? В этом случае существует еще одна перегрузка функции range(), принимающая три параметра: range(n, m, k). Первый параметр задает старт последовательности, второй параметр задает стоп последовательности и третий – шаг генерации чисел. Например, вызов функции range(1, 10, 2) создаст последовательность чисел 1, 3, 5, 7, 9, а вызов функции range(5, 30, 5) сгенерирует последовательность 5, 10, 15, 20, 25. Напишем программу, которая выводит все четные числа из промежутка 56:170. Используя функцию range() с тремя параметрами, получаем: for i in range(56, 171, 2): print(i) Обратите внимание, мы можем использовать функцию range() с двумя параметрами: for i in range(56, 171): if i % 2 == 0: print(i) однако такой код получается менее эффективным. Отрицательный шаг генерации Если шаг генерации является положительным числом, то генерируемая последовательность будет возрастать. Мы можем указать отрицательный шаг генерации (третий параметр), что приведет к генерированию убывающей последовательности. В случае отрицательного шага, мы должны гарантировать, что старт последовательности (первый параметр) больше чем конец последовательности (второй параметр). Например, вызов функции range(20, 16, -1) создаст последовательность чисел 20, 19, 18, 17, а вызов функции range(20, 10, -3) сгенерирует последовательность 20, 17, 14, 11. Напишем программу, которая отсчитывает от 5 до 1, а затем выводит текст Взлетаем!!!: for i in range(5, 0, -1): print(i, end=' ') print('Взлетаем!!!') Результатом будет: 5 4 3 2 1 Взлетаем!!! Если величина шага отрицательна и первый параметр меньше второго, то функция range() генерирует пустую последовательность. Например, вызов функции range(1, 10, -1) приводит к генерации пустой последовательности. Примеры использования функции range()
Примечания Примечание 1. Функция range() может принимать от одного до трех параметров: range(n), range(n, m), range(n, m, k) первый параметр – это старт последовательности (включительно); второй параметр – это стоп последовательности (не включительно); третий параметр – это величина шага. Примечание 2. Функция range() может генерировать только целые числа, включая отрицательные. Примечание 3. Величина шага не может равняться нулю. Следующий код: for i in range(1, 10, 0): print(i) приведет к ошибке ValueError: range() arg 3 must not be zero. Вопросы: Какую последовательность чисел даст вам вызов функции range(8)? Какую последовательность чисел даст вам вызов функции range(1, 8)? Какую последовательность чисел даст вам вызов функции range(3, 11, 2)? Какую последовательность чисел даст вам вызов функции range(10, 0, -2)? Сколько итераций сделает цикл? for _ in range(1, 6): print('Python rocks!') Задачи Тема урока: частые сценарии Подсчет количества Вычисление суммы и произведения Обмен значений переменных Сигнальные метки Определение максимума и минимума Расширенные операторы присваивания Аннотация. Рассмотрим частые сценарии при написании циклов. Подсчет количества Нередко нужно, чтобы наши программы подсчитывали сколько раз что-либо произошло. К примеру видео игра может подсчитывать количество поворотов персонажа или математическая программа может считать как много чисел обладают некоторым свойством. Ключ к подсчету - использование переменной счетчика. Напишем программу, которая считывает 10 чисел и определяет сколько из них больше 10. counter = 0 for i in range(10): num = int(input()) if num > 10: counter = counter + 1 print('Было введено', counter, 'чисел, больших 10.') Каждый раз когда мы считываем число большее 10, мы добавляем 1 к нашему текущему значению переменной counter. В программе это реализовано в строке counter = counter + 1. Обратите внимание на начальное значение переменной счетчика counter = 0. Без начального значения мы получили бы ошибку, поскольку дойдя до строки counter = counter + 1 Python ничего не знал бы о переменной counter . Строка кода counter = counter + 1 означает: возьми старое значение переменной counter, прибавь к нему 1 и переприсвой переменной это значение. Если не придать переменной начальное значение, то непонятно, к чему прибавлять 1 в самый первый раз. Подсчет количества – это очень частый сценарий. Он состоит из двух шагов: Создание переменной счетчика и придание ей первоначального значения: counter = 0; Увеличение переменной счетчика на 1: counter = counter + 1. Часто при написании программ требуется использовать несколько счетчиков. Модифицируем предыдущую программу: посчитаем еще и количество нулей среди введенных чисел. counter1 = 0 counter2 = 0 for i in range(10): num = int(input()) if num > 10: counter1 = counter1 + 1 if num == 0: counter2 = counter2 + 1 print('Было введено', counter1, 'чисел, больших 10.') print('Было введено', counter2, 'нулей.' ) Рассмотрим еще один пример: подсчитать количество чисел из диапазона [1; \, 100][1;100], квадрат которых оканчивается на 4. counter = 0 for i in range(1, 101): if i**2 % 10 == 4: counter = counter + 1 print(counter) Мы используем функцию range() с двумя параметрами для генерации последовательности чисел от 1 до 100. Переменная i последовательно принимает значения от 1 до 100, мы проверяем, условие: квадрат числа i оканчивается на 4 с помощью условия i**2 % 10 == 4. Для переменной счетчика удобно использовать имя counter. Вычисление суммы и произведения Наравне с подсчетом количества по частоте стоит задача вычисления суммы. К примеру видео игра должна считать сумму очков. В таком случае начальное значение переменной будет равно 0, а далее оно будет увеличиваться на некоторое количество заработанных очков, скажем на 10. Мы пишем следующий код: score = 0 ... score = score + 10 Напишем программу, которая считывает 10 чисел и определяет сумму тех из них, которые больше 10. total = 0 for i in range(10): num = int(input()) if num > 10: total = total + num print('Сумма чисел больших 10 равна', total) Каждый раз когда программа считывает число большее 10, она добавляет его к текущему значению переменной total. Это реализовано в строке total = total + num. Обратите внимание на начальное значение переменной сумматора total = 0. Без начального значения, мы получили бы ошибку, поскольку дойдя до строки total = total + num Python ничего не знал бы о переменной total . Строка кода total = total + num означает возьми старое значение переменной total, прибавь к нему num и переприсвой переменной это значение. Если не придать переменной начальное значение, то не к чему прибавлять num в самый первый раз. Подсчет суммы состоит из двух шагов: Создание переменной сумматора и придание ей первоначального значения: total = 0; Увеличение переменной сумматора на нужное число: total = total + num. Напишем программу, которая считает сумму натуральных чисел от 1 до 100: total = 0 for i in range(1, 101): total = total + i print('Сумма равна', total) Рассмотрим еще один пример: напишем программу, которая запрашивает 10 целых чисел и находит их среднее значение: total = 0 for i in range(10): num = int(input()) total = total + num average = total / 10 print('Среднее значение равно', average) Аналогичным образом вычисляется произведение. При вычислении произведения, начальное значение переменной мультипликатора мы устанавливаем равным 1, в отличии от сумматора, где оно равно 0. Для переменной сумматора и мультипликатора удобно использовать имя total. Обмен значений переменных Очень часто нам требуется обменять значения двух переменных x и y. Начинающие программисты иногда пишут такой код: x = y y = x Однако он не работает. Предположим, что x = 3 и y = 5. Первая строка присвоит переменной x значение 5, что правильно, однако вторая строка установит значение переменной y в 5, поскольку значение x уже равно 5. Для решения задачи мы можем использовать временную переменную: temp = x x = y y = temp Такой код пишут почти во всех языках программирования. Однако в Python есть и более простой способ. Мы можем написать так: x, y = y, x В результате выполнения такого кода Python поменяет значения переменных x и y местами. Сигнальные метки Сигнальная метка (флажок) может использоваться, когда надо чтобы одна часть программы узнала, о происходящем в другой части программы. Напишем программу, определяющую, что натуральное число является простым: num = int(input()) flag = True for i in range(2, num): if num % i == 0: # если исходное число делится на какое-либо отличное от 1 и самого себя flag = False if num == 1: print('Это единица, она не простая и не составная') elif flag == True: print('Число простое') else: print('Число составное') Напомним, что число является простым, если оно не имеет делителей, кроме 1 и самого себя. Вышеприведенная программа работает следующим образом: начальное значение переменной флага равно True, что говорит о том, что число является простым. Затем мы перебираем все числа от 2 до num - 1. Если одно из этих значений оказывается делителем числа num, тогда число num является составным и мы устанавливаем значение флага False. Как только цикл завершен, мы проверяем, установлен флаг или нет. Если это так, мы знаем, что был делитель, и число не является простым. В противном случае число должно быть простым. Флаговые переменные могут иметь более осмысленное название. Например, в случае с проверкой числа на простоту, название флаговой переменной могло бы быть is_prime. Максимум и минимум Поиск наибольшего или наименьшего значения в некоторой последовательности чисел, также частая задача в программировании. Напишем программу, которая считывает 10 положительных чисел и находит среди них наибольшее число. largest = -1 for i in range(10): num = int(input()) if num > largest: largest = num print('Наибольшее число равно', largest) Мы устанавливаем начальное значение переменной largest в -1. Далее программа считывает 10 чисел, и если какое-то из них оказывается больше текущего значения largest, переприсваивает его. В качестве начального значения взято число -1, поскольку мы знаем, что все числа положительны, таким образом уже первое сравнение приведет к переприсваиванию. Распространен подход, когда в качестве начального значения переменной, сразу принимается первый элемент последовательности. Напишем программу, которая считывает 10 чисел (необязательно положительных) и находит среди них наибольшее: largest = int(input()) # принимаем первое число за максимальное for i in range(9): num = int(input()) if num > largest: largest = num print('Наибольшее число равно', largest) Для нахождения наименьшего значения последовательности следует поменять знак неравенства (>) на противоположный (<). В таком случае название переменной largest стоит заменить на smallest. Для переменных, хранящих наибольшее и наименьшее значения, подходят имена largest и smallest. Расширенные операторы присваивания Довольно часто программы имеют инструкции присваивания, в которых переменная на левой стороне от оператора = также появляется на правой от него стороне. Например, counter = counter + 1 На правой стороне оператора присваивания 1 прибавляется к переменной counter. Полученный результат затем присваивается переменной counter, заменяя первоначальное значение. По сути, это строка кода добавляет 1 к counter. Еще один пример такой инструкции мы видели при подсчете суммы: total = total + num Эта инструкция присваивает значение выражения total + num переменной total. В результате исполнения этой инструкции число num прибавляется к значению total.
Эти типы операций находят широкое применение в программировании. Для удобства Python предлагает расширенные операторы присваивания. Расширенные операторы не требуют, чтобы программист дважды набирал имя переменной. Приведенную ниже инструкцию: total = total + num можно переписать как total += num Точно так же инструкцию counter = counter + 1 можно переписать как counter += 1
Задачи |