дотщд. Ялдыгин В. Б., 2021 03. 11. 2021 Как работать над пособием Основные правила
Скачать 1.41 Mb.
|
\ (n % 19 != 0) and (n % 27 != 0): Подходит) else: Не подходит) Сейчас в условие добавлен слэш и далее код перенесен наследующую строку (причем для перенесенной части строки неважен размер отступа. Если скопировать код вон будет работать и будет выглядеть точно также, как в текстовом документе Можно перенести строку несколько раз n = int(input()) if (n % 3 == 0) and (n % 7 != 0) and \ (n % 17 != 0) and \ (n % 19 != 0) and (n % 27 != 0): Подходит) else: Не подходит) Резюме. Если в тексте программы в конце строки вы видите обратный слеш \, строка ниже является продолжением строки выше. Вы можете написать программу в IDLE / PyCharm в точности в таком виде, а можете удалить обратный слеш ив конце, чтобы была одна строка. Примечание. В коде вокруг каждого из условий для большей наглядности поставлены скобки if (n % 3 == 0) and (n % 7 != 0) and (n % 17 != 0) and \ 25 © Ялдыгин В.Б., 2021 03.11.2021 (n % 19 != 0) and (n % 27 != 0): В Python скобки вокруг каждого из условий можно не ставить, то есть можно было написать тоже самое без скобок if n % 3 == 0 and n % 7 != 0 and n % 17 != 0 and \ n % 19 != 0 and n % 27 != 0: Но код со скобками вокруг каждого из условий в данном случае выглядит понятнее, поэтому они были добавлены. Важно Комментарий выше не относится к случаю, когда нужно изменить порядок действий. Например, в условии if n % 3 == 0 and (n % 7 == 0 or n % 2 == 0): скобки обязательны, так как они меняют порядок действий. В данном коде нет скобок вокруг каждого из условий, их можно добавить if (n % 3 == 0) and ((n % 7 == 0) or (n % 2 == 0)): или не добавлять, как было выше, но скобки вокруг or обязательны. Еще одно замечание. Если есть открывающая скобка, нонет закрывающей, то ставить слеш для переноса необязательно Python догадывается, что должна быть закрывающая скобка, и считает следующую строку продолжением. Например, код выше можно разделить без слеша, если поставить Enter после открывающей скобки, но до закрывающей if n % 3 == 0 and (n % 7 == 0 or n % 2 == 0): Обмен значений a,b=b,a Работа с числами Запись чисел В Python (начиная с версии 3.6) можно писать символы подчеркивания в числах, чтобы было удобнее читать. Например, вместо 35000000 можно написать 35_000_000. В жизни мы бы написали 35.000.000, нов точка – это разделитель целой и дробной части, зато Python позволяет вместо точек написать подчеркивания, получается 35_000_000 – тоже наглядно и удобно. Удобнее всего ставить подчеркивания там, где мы ставим точки, то есть разделять подчеркиваниями по 3 цифры. Это позволяет избежать одной из частых ошибок, когда случайно указанна один ноль больше или на один ноль меньше. Итак, в Python 100000000000 = 100_000_000_000 и т.д. 26 © Ялдыгин В.Б., 2021 03.11.2021 Особенности вычислений print(0.1+0.2 == 0.3) Данная команда вернет False. Причина заключается в том, что компьютер представляет числа в двоичном виде, а нецелые числа не всегда можно перевести из одной системы счисления в другую точно. В данном случае числа переводятся неточно, а при их суммировании неточность накапливается. Деление в Python. Остаток отделения Сведения из математики. Кратные числа – числа, которые делятся на данное число без остатка. Например, кратные числа 6: 0, 6, 12, 18, … Делители числа – числа, на которые делится данное число без остатка. Например, делители числа 6: 1, 2, 3, 6. Простые числа – числа, которые делятся только на 1 и на себя. У всех натуральных чисел, больших 1, есть как минимум 2 делителя 1 и само число. Операторы в Python: − / – точное деление − // – целочисленное деление − % – получение остатка. print(10/8) # 1.25 Точное деление print(10//8) # 1 Целочисленное деление print(10%8) # 2 Остаток отделения Остаток = Делимое – Делитель*Частное 10 : 8 = 1 (остаток 10 – 8*1 = 2) 4 : 7 = 0 (остаток 4 – 7*0 = 4) 4 : 2 = 2 (остаток 4 – 2*2 = 0) Делитель*Частное – неполное делимое, те. то, что разделилось. Остаток – то, что осталось неразделенным. Остаток может принимать значение от 0 до Делитель – 1. Для десятичной системы счисления 1463 mod 10 = 3 (mod 10 возвращает последнюю цифру) 1463 div 10 = 146 (div 10 отбрасывает последнюю цифру) 1463 mod 100 = 63 (mod 100 возвращает 2 последних цифры) 1463 div 100 = 14 (div 100 отбрасывает 2 последних цифры) и т.д. Задание. Дано число a. Как получить ю цифру с конца Варианты − a div 100 mod 10 27 © Ялдыгин В.Б., 2021 03.11.2021 − a mod 1000 div 100 Для произвольной системы счисления 19 mod 2 = 10011 2 mod 2 = (1*2 4 +1*2 1 +1*2 0 ) mod 2. Все цифры, кроме последней, разделятся на 2, а последняя нет. Значит, mod 2 возвращает последнюю цифру в двоичной системе счисления. 19 div 2 = 10011 2 mod 2 = (1*2 4 +1*2 1 +1*2 0 ) div 2 = 1*2 3 +1*2 0 . (Все слагаемые, кроме последнего, разделились на 2, а последнее не делится и поэтому идет в остаток. Значит, div 2 отбрасывает последнюю цифру в двоичной системе счисления. Вообще − mod n возвращает последнюю цифру, если записать число в системе счисления по основанию n; − div n отбрасывает последнюю цифру, если записать число в системе счисления по основанию n. Алгоритм, печатающий число задом наперед N = int(input()) R = 0 while N>0: digit = x % 10 R = 10*R + digit N = N // 10 print(R) НОД и НОК НОД – наибольший общий делитель – наибольший делитель нескольких чисел наибольшее число, на которое делятся все числа (обычно ищут НОД 2 чисел) наименьший не ищется, т.к. он равен 1). НОК – наименьшее общее кратное – наименьшее число, которое делится на все числа обычно на 2 числа) (наибольшее не ищется, т.к. максимального общего кратного нет – всегда есть больше. Пример нахождения математически. Есть 2 числа 60 и 72. Найдем НОД и НОК. Раскладываем на простые множители. Простое число – число, которое делится только на 1 и на само себя. Простые числа 2, 3, 5, 7, 11, 13, 17, 19 и т.д. Есть только одно четное число 2 (все остальные делятся на 2). Чтобы разложить на простые множители, повторяем в цикле находим, на какое простое число делится текущее число, записываем это число справа от черты, а результат деления – ниже. 60 2 72 2 30 2 36 2 15 3 18 2 5 5 9 3 28 © Ялдыгин В.Б., 2021 03.11.2021 1 3 3 1 60 = 2 2 *3*5 72 = 2 3 *3 2 Чтобы найти НОД двух чисел, берем те простые множители, которые есть в разложении обоих чисел, и берем минимальное их количество. Например двоек две в разложении числа 60 и три в разложении числа 72, берем две двойки одна пятерка в разложении числа 60 и ноль в разложении числа 72, берем ноль пятерок и т.д. Получается НОД (60,72) = 2 2 *3 = 12. Чтобы найти НОК двух чисел, берем те простые множители, которые есть в разложении обоих чисел, и берем максимальное их количество. Например двоек две в разложении числа 60 и три в разложении числа 72, берем три двойки одна пятерка в разложении числа 60 и ноль в разложении числа 72, берем одну пятерку и т.д. Получается НОК (60,72) = 2 3 *3 2 *5 = 360. Алгоритм Евклида для нахождения НОД НОД – наибольший общий делитель Вариант 1 (с вычитанием. a = Введите a: ')) b = Введите b: ')) while a != b: if a > b: a = a - b else: b = b - a print('НОД=', a, sep='') Для того, чтобы увидеть на практике, как меняются a и b, добавьте строку до цикла чтобы вывести начальные значения a и b) и строку внутри цикла (чтобы после каждого изменения выводились измененные значения a и b) (для наглядности добавленные строки выделены жирным a = Введите a: ')) b = Введите b: ')) print('a=', a, ', b=', b, sep='') while a != b: if a > b: a = a - b else: b = b - a print('a=', a, ', b=', b, sep='') print('НОД=', a, sep='') Будет выведено, как изменялись значения a и b. Например, если изначально a=30, b=130: 29 © Ялдыгин В.Б., 2021 03.11.2021 Введите a: 30 Введите b: 130 a=30, b=130 a=30, b=100 a=30, b=70 a=30, b=40 a=30, b=10 a=20, b=10 a=10, b=10 НОД=10 Алгоритм с нахождением НОД через вычитание работает так пока числа не будут равны между собой, большее число заменяется на разность большего и меньшего числа. Вариант 2 (с делением. a = Введите a: ')) b = Введите b: ')) print('a=', a, ', b=', b, sep='') while a != 0 and b != 0: if a > b: a = a % b else: b = b % a print('a=', a, ', b=', b, sep='') print('НОД=', a + b, sep='') Жирным добавлен вывод текущих значений (в самом алгоритме их быть не должно Видно, что значения меняются быстрее (так как ищется остаток отделения тоже самое, что много раз вычесть. Вот что выведет программа Введите a: 30 Введите b: 130 a=30, b=130 a=30, b=10 a=0, b=10 НОД=10 Метод с делением несколько оптимизирован, поскольку остаток отделения вычитает не одно значение, а столько, сколько получится. Но при одно из значений станет нулем а во втором будет НОД). Быстрый способ вывести – сложить их (при этом сложится НОД и 0, то есть останется сам НОД). Как найти НОК в программе Через НОД: 30 © Ялдыгин В.Б., 2021 03.11.2021 НОК(a, b) = a * b // НОД(a, b) Но учтите, что в приведенном выше коде a и b меняются, поэтому нужно их вначале куда-то сохранить, чтобы потом можно было перемножить и разделить на найденный НОД. Пример программы a = Введите a: ')) b = Введите b: ')) a0 = a # Сохранили a b0 = b # Сохранили b while a != 0 and b != 0: if a > b: a = a % b else: b = b % a NOD = a + b NOK = a0 * b0 // NOD print('НОД=', NOD , sep='') print('НОК=', NOK , sep='') Пример задания Получив на вход число x, этот алгоритм печатает число M. Известно, что x > 100. Укажите наименьшее такое (те. большее 100) число x, при вводе которого алгоритм печатает 11. x = int(input()) L = x - 21 M = x + 12 while L != M: if L > M: L = L - M else: M = M - L print(M) Алгоритм находит НОД чисел x-21 и x+12. Итак, нужно найти наименьшее x, большее 100, при вводе которого выведет 11. x=101, L=80, M=113, НОД=11? Нет. 113 не делится на 11, т.к. 113/11=(110+3)/11=10+3/11. Представил как сумму чисел, где одно делится назначит, делится ли на 11, зависит от второго слагаемого. x=102, L=81, M=114, НОД=11? Нет. Ближайшее M разделится, когда M=121 (110+11). Тогда будет x=109, L=88, M=121. НОД(88,121)=НОД(11*2*2*2, 11*11)=11. 31 © Ялдыгин В.Б., 2021 03.11.2021 Перевод чисел Весть несколько функций для быстрого перевода чисел между двоичной, восьмеричной, десятичной и шестнадцатеричной системами счисления. Функция bin() – перевод в двоичную систему счисления. Пример print(bin(21)) Вывод (0b означает, что число выводится в двоичной системе счисления, то есть число после перевода равно 21 10 =10101 2 ): 0b10101 Функция oct() – перевод в восьмеричную систему счисления. Пример print(oct(21)) Вывод (0o означает, что число выводится в восьмеричной системе счисления, то есть число после перевода равно 21 10 =25 8 ): 0o25 Функция hex() – перевод в шестнадцатеричную систему счисления. Пример print(hex(21)) Вывод (0x означает, что число выводится в шестнадцатеричной системе счисления, то есть число после перевода равно 15 16 , 21 10 =15 16 ): 0x15 Все эти примеры былина перевод из десятичной системы счисления в двоичную / восьмеричную / шестнадцатеричную. Как наоборот перевести из двоичной / восьмеричной / шестнадцатеричной системы счисления в десятичную Для этого нужно просто ввести число в соответствующей системе счисления если перед числом ничего не указано, то число в десятичной системе счисления, если указано 0b, то число в двоичной системе счисления, если указано 0o, то число в восьмеричной системе счисления, если указано 0x, то число в шестнадцатеричной системе счисления. Например print(0b111000) # Будет выведено 56, то есть 111000 2 =56 10 print(0o24) # Будет выведено 20, то есть 24 8 =20 10 print(0x18) # Будет выведено 24, то есть 18 16 =24 10 Число выводится в десятичном виде, а вводить мы его можем в другой системе двоичной, восьмерично, шестнадцатеричной. Метод основан на том, что числа в Python можно вводить в любой системе. Например, вместо print(3*16) можно написать print(0b11*0x10) (в обоих случаях выведет 48, просто во втором print те же числа 3 и 16 представлены в других системах счисления. 32 © Ялдыгин В.Б., 2021 03.11.2021 Используя данный метод, можно перевести сразу из одной системы в другую, например, из восьмеричной в шестнадцатеричную print(hex(0o125)) Будет выведено 0x55, то есть 125 8 =55 16 . В данном случае мы ввели число в восьмеричном виде, а выведено с помощью функции hex оно будет в шестнадцатеричном виде. Python позволяет удобно переводить между двоичной, восьмеричной, десятичной и шестнадцатеричной системами счисления. Для других систем счисления нужно написать немного более сложную программу. TODO Цикл for В цикле for в Python переменная пробегает от первого числа, ноне добегает до последнего (так сделано потому, что это позволяет писать некоторые фрагменты короче. for i in range (3, 6): print (i) # Выведет 3 4 5 Как видно, программа выводит числа, начиная с первого (3), ноне включая последнее не выводит 6). Если нужно вывести еще и число 6, в качестве второй границы нужно указать число на 1 больше, чем 6, то есть 7: for i in range (3, 7): print (i) # Выведет 3 4 5 6 Можно вместо 7 написать 6+1. Это делается для того, чтобы было явно указано число 6, до которого выводится. Результат, естественно, будет такой же. for i in range (3, 6+1): print (i) # Выведет 3 4 5 6 Следующий фрагмент выведет одно число – число 3 (так как выводит числа по возрастанию от 3 доне включая 4): for i in range (3, 4): 33 © Ялдыгин В.Б., 2021 03.11.2021 print (i) # Выведет 3 Следующий фрагмент ничего не выведет for i in range (3, 3): print (i) Объснение. Данный фрагмент должен выводить числа по возрастанию от 3 доне включая 3 (не доходя до 3), но ни одно число не подходит уже первое число 3 слишком большое. Ничего не выведет и следующий фрагмент for i in range (3, 1): print (i) Объснение. Данный фрагмент должен выводить числа по возрастанию от 3 доне включая 1 (не доходя до 1). Опять жени одно число не подходит уже первое число 3 слишком большое. В range можно указать третий аргумент – шаг (в программе ниже – число 2). for i in range (3, 7, 2): print (i) # Выведет 3 5 Программа выводит числа, начиная с 3 до 7 с шагом 2 (причем не включая 7). Вначале она выводит 3, затем 3+2=5, следующее число 5+2=7, но оно не подходит, так как выводятся числа, не включая 7. В результате выводится только 3 и 5. Для вывода чисел от большего к меньшему нужно указать в качестве шага -1, при этом первое число должно быть больше, второе – меньше. Важно Числа будут выводиться от первого до второго числа, ноне включая второе число (также, как по возрастанию, как было описано выше. for i in range (7, 3, -1): print (i) # Выведет 7 6 5 4 Выводятся числа с 7 до 3 (ноне включая 3), шаг -1. Вначале выводится 7, затем 7-1=6, затем 6-1=5, затем 5-1=4. Следующее число уже не выводится, так как это будет 3, а числа выводятся доне включая 3. Если необходимо вывести все числа от 7 до 3 (включая 3), в качестве второго аргумента нужно указать число на 1 меньшее, чем 3: for i in range (7, 3-1, -1): 34 © Ялдыгин В.Б., 2021 03.11.2021 print (i) # Выведет 7 6 5 4 3 В данном случаев качестве второго аргумента указали 3-1, можно было также просто написать 2. Обработка последовательности чисел Базовое задание (формулировка 1). На вход программы поступает неизвестное количество чисел целых, ввод заканчивается нулём. Найти сумму введенных чисел. Решение (разбор решения ниже. summa = 0 a = int(input()) while a != 0: summa += a a = int(input()) Сумма чисел =', summa) Предположим, введено следующее 4 2 -1 0 Будет выведено Сумма чисел = 5 Число 0 не считается (оно является как бы границей. В данном примере в программу поступают числа 4 2 -1, программа их считывает и последовательно добавляет в сумму. В тот момент, когда программа получает в строке 0, она понимает, что достигнут конец последовательности, и с числом 0 уже не работает и не прибавляет. Для суммы непринципиально, прибавляется ли 0, но для других алгоритмов может быть важным. Разберем, как работает программа. Добавляемые строки будут выделены жирным шрифтом. 1) Изначально в переменную summa присваивается 0. А в конце значение переменной выводится. Начало такое summa = 0 Сумма чисел =', summa) Далее идет типичная конструкция для цикла while. 2) Цикл выполняется, пока число неравно. Число будет храниться в переменной a. Значит, начало цикла такое summa = 0 while a != 0: 35 © Ялдыгин В.Б., 2021 03.11.2021 Сумма чисел =', summa) 3) Но переменная a не определена, поэтому сразу ее проверять неправильно. Значит, ей нужно присвоить значение до цикла. В данном случае нужно считать значение с клавиатуры summa = 0 a = int(input()) while a != 0: Сумма чисел =', summa) 4) Внутри цикла добавляем значение полученного числа в сумму summa = 0 a = int(input()) while a != 0: summa += a Сумма чисел =', summa) 5) Важно Что произойдет если программу таки оставить Программа получит первое число (например, 3) и присвоит его в переменную a (a = int(input())). Далее программа проверит, что число неравно, и добавит его в сумму (summa += a). Поскольку внутренняя часть цикла while (называется тело цикла) закончится, снова будет проверено условие while. Переменная a не поменялась (она по- прежнему равна 3), она снова будет прибавлена к сумме. Затем снова будет проверено, что a неравно, и снова к сумме будет прибавлено 3. Итак далее. Как говорится, программа зациклится, будет выполняться бесконечно. Нужно в цикле считывать следующее значение a: summa = 0 a = int(input()) while a != 0: summa += a a = int(input()) Сумма чисел =', summa) 6) Очень важно запомнить и понимать структуру while, как она записана выше. До while считывается число, затем оно проверяется в while, далее в теле цикла происходит работа с этим числом и тут же, внутри цикла, считывается следующее число. Есть 2 идентичные строки для считывания числа до цикла (выполнится 1 рази внутри цикла будет выполняться до тех пор, пока не будет введен 0). Когда считывается новое число, оно снова проверяется в цикле while, если оно неравно, оно прибавляется, считывается новое число итак далее. Если же будет введено число 0, условие вне будет выполнено и выполнение цикла закончится. Это базовая программа. Рассмотрим несколько похожих программ. |