Скачать презентацию Программирование на Python е Введение в информатику Глава 7 Скачать презентацию Программирование на Python е Введение в информатику Глава 7

Глава 7 Структуры ветвления.ppt

  • Количество слайдов: 83

Программирование на Python’е: Введение в информатику Глава 7 Структуры ветвления Python Programming, 2/e 1 Программирование на Python’е: Введение в информатику Глава 7 Структуры ветвления Python Programming, 2/e 1

Задачи n n Понять образцы простых ветвлений в программах и их реализации с помощью Задачи n n Понять образцы простых ветвлений в программах и их реализации с помощью оператора if Python’а. Понять образцы ветвлений с двумя альтернативами в программах и их реализации с помощью оператора if-else Python’а. Python Programming, 2/e 2

Задачи (продолжение) n n Понять образцы многовариантных ветвлений в программах и их реализацию с Задачи (продолжение) n n Понять образцы многовариантных ветвлений в программах и их реализацию с помощью оператора if-else Python’а. Понять идею обработки исключений и уметь написать простой код для обработки исключений, который ловит стандартные ошибки Python’а времени исполнения. Python Programming, 2/e 3

Задачи (продолжение) n n Понять концепцию булевых выражений и тип данных bool. Уметь читать Задачи (продолжение) n n Понять концепцию булевых выражений и тип данных bool. Уметь читать писать и реализовывать алгоритмы, которые используют ветвление, включая те, которые используют последовательности ветвлений и вложенные ветвления. Python Programming, 2/e 4

Простые ветвления n n До сих пор мы рассматривали программы как последовательности инструкций, идущих Простые ветвления n n До сих пор мы рассматривали программы как последовательности инструкций, идущих одна за другой. «Последовательность» и «цикл» это фундаментальные концепции программирования, но их недостаточно для решения всех проблем. Нам нужно уметь изменять последовательное течение программы, чтобы охватить все возможные частные случаи. Python Programming, 2/e 5

Простые ветвления n n Управляющие структуры позволяют нам изменять последовательное течение программы. В этой Простые ветвления n n Управляющие структуры позволяют нам изменять последовательное течение программы. В этой главе мы узнаем о структурах ветвления, операторах, которые позволяют программе выполнять разные последовательности инструкций в разных случаях, то есть позволяют выбирать нужный порядок действий. Python Programming, 2/e 6

Пример: предупреждения о температуре n Давайте возвратимся преобразователю шкалы температуры Цельсий-Фаренгейт из главы 2. Пример: предупреждения о температуре n Давайте возвратимся преобразователю шкалы температуры Цельсий-Фаренгейт из главы 2. # convert. py # Программа преобразует температуру по Цельсию в температуру по. A # в температуру по Фаренгейту def main(): celsius = eval(input("Какова температура по Цельсию? ")) fahrenheit = 9/5 * celsius + 32 print("Температура равна", fahrenheit, "градусов по Фаренгейту. ") main() Python Programming, 2/e 7

Пример: предупреждения о температуре n n Предположим, что мы хотим изменить программу, чтобы она Пример: предупреждения о температуре n n Предположим, что мы хотим изменить программу, чтобы она печатала предупреждения, когда погода экстремальная. Зададим ограничения. Любая температура более 90 градусов Фаренгейта и ниже 30 градусов Фаренгейта должны вызывать предупреждения о жаркой и холодной погоде соответственно. Python Programming, 2/e 8

Пример: предупреждения о температуре n n n Вводим температуру в градусах Цельсия (называем переменную Пример: предупреждения о температуре n n n Вводим температуру в градусах Цельсия (называем переменную celsius) Вычисляем fahrenheit как 9/5*celsius + 32 Выводим значение переменной fahrenheit if fahrenheit > 90 печатаем предупреждение о жаре if fahrenheit < 30 печатаем предупреждение о холоде Python Programming, 2/e 9

Пример: предупреждения о температуре n Этот новый алгоритм содержит две альтернативы в конце. Отступ Пример: предупреждения о температуре n Этот новый алгоритм содержит две альтернативы в конце. Отступ означает, что шаг следует выполнить только в случае выполнения условия на предыдущей строке. Python Programming, 2/e 10

Пример: предупреждения о температуре Python Programming, 2/e 11 Пример: предупреждения о температуре Python Programming, 2/e 11

Пример: предупреждения о температуре # convert 2. py # Программа преобразует температуру по Цельсию Пример: предупреждения о температуре # convert 2. py # Программа преобразует температуру по Цельсию # в температуру по Фаренгейту. # Эта версия выдаёт предупреждения о тепле и холоде. def main(): celsius = eval(input("Введите температуру по Цельсию ")) fahrenheit = 9 / 5 * celsius + 32 print("Температура равна", fahrenheit, «градусам Фаренгейта. ") if fahrenheit >= 90: print("Сегодня действительно жарко. Будь осторожен!") if fahrenheit <= 30: print("Бррр. Проверь, что оделся тепло. ") main() Python Programming, 2/e 12

Пример: предупреждения о температуре n n n Оператор if Python’а используется, чтобы реализовать разветвление Пример: предупреждения о температуре n n n Оператор if Python’а используется, чтобы реализовать разветвление программы. if <условие>: <блок операторов> Блок операторов представляет собой последовательность операторов, каждый из которых пишется с отступом после заголовка if. Python Programming, 2/e 13

Пример: предупреждения о температуре n Смысл оператора if должен быть ясен: n n n Пример: предупреждения о температуре n Смысл оператора if должен быть ясен: n n n первое, вычисляется условие в заголовке; если условие выполняется (равно True), то выполняется последовательность операторов в блоке, затем управление переходит к следующему оператору программы; если условие ложно (равно False), то тело пропускается и управление передаётся к следующему после if оператору программы. Python Programming, 2/e 14

Пример: предупреждения о температуре Python Programming, 2/e 15 Пример: предупреждения о температуре Python Programming, 2/e 15

Пример: предупреждения о температуре n n Блок команд в операторе if или выполняется или Пример: предупреждения о температуре n n Блок команд в операторе if или выполняется или нет в зависимости от выполнения условия. В любом случае после выполнения оператора if управление передаётся на следующий оператор. Это одноальтернативное или простое ветвление. Python Programming, 2/e 16

Формирование простых условий n n Как выглядит условие? Простейшие условия формируются с помощью сравнений. Формирование простых условий n n Как выглядит условие? Простейшие условия формируются с помощью сравнений. <выр> <оп_срав> это сокращение для выражения «оператор сравнения» . Python Programming, 2/e 17

Формирование простых условий Python Математика Значение < < Меньше чем <= ≤ Меньше или Формирование простых условий Python Математика Значение < < Меньше чем <= ≤ Меньше или равно чем == = Равно >= ≥ Больше или равно чем > > Больше чем != ≠ Не равно Python Programming, 2/e 18

Формирование простых условий n n Обратите внимание на использование знака == для равенства. Так Формирование простых условий n n Обратите внимание на использование знака == для равенства. Так как Python использует знак = для обозначения присваивания, то для обозначения равенства требуется другой символ. Стандартная ошибка начинающих использование знака = в условиях операторах ветвлений и циклов. Python Programming, 2/e 19

Формирование простых условий n n В условиях можно сравнивать либо числа либо цепочки символов. Формирование простых условий n n В условиях можно сравнивать либо числа либо цепочки символов. Когда сравнивают цепочки, используется лексикографическое упорядочение. Сравнение символов основано на кодировке Unicode. Из-за этого все заглавные буквы идут впереди всех строчных букв. (“Bbbb” идёт перед “aaaa”) Python Programming, 2/e 20

Формирование простых условий n n n Сложные условия составляются из булевых выражений, в честь Формирование простых условий n n n Сложные условия составляются из булевых выражений, в честь английского математика Дж. Буля. Когда вычисляется булево выражение, то в результате получается то ли значение True (означает выполнение условия), то ли False (если условие не выполняется). В некоторых компьютерных языках для представления “True” и “False” используются 1 and 0. Python Programming, 2/e 21

Формирование простых условий n Булевы выражения имеют тип bool, а булевы значения true и Формирование простых условий n Булевы выражения имеют тип bool, а булевы значения true и false представляются литералами True и False. >>> 3 < 4 True >>> 3 * 4 < 3 + 4 False >>> "hello" == "hello" True >>> "Hello" < "hello" True Python Programming, 2/e 22

Пример: выполнение программы с условиями n Существует несколько способов выполнения программы на Python’е: n Пример: выполнение программы с условиями n Существует несколько способов выполнения программы на Python’е: n n n некоторые модули предназначены для непосредственного исполнения, их называют программами или сценариями; другие созданы для импортирования и использования другими программами, такие программы собирают в библиотеки; иногда создают гибрид, который может использоваться и как отдельная программа и как библиотека. Python Programming, 2/e 23

Пример: выполнение программы с условиями n n Когда мы хотим запустить программу после её Пример: выполнение программы с условиями n n Когда мы хотим запустить программу после её загрузки, мы добавляем строку main() в конец кода. Так как Python анализирует строки программы в течение процесса импорта, то наша текущая программа выполняется, если её импортируют в интерактивную сессию Python’а или другую программу на Python’е. Python Programming, 2/e 24

Пример: выполнение программы с условиями n n В общем, когда мы импортируем модуль, мы Пример: выполнение программы с условиями n n В общем, когда мы импортируем модуль, мы не хотим его выполнять. В программе, которая может выполняться отдельно или загружаться как библиотека вызов main внизу должен быть с условием, например, if <условие>: main() Python Programming, 2/e 25

Пример: выполнение программы с условиями n n Если модуль импортируется, то Python создаёт специальную Пример: выполнение программы с условиями n n Если модуль импортируется, то Python создаёт специальную переменную в модуле с именем __name__ , содержащую имя импортированного модуля. Пример: >>> import math >>> math. __name__ 'math' Python Programming, 2/e 26

Пример: выполнение программы с условиями n n При импорте переменной __name__ в модуле math Пример: выполнение программы с условиями n n При импорте переменной __name__ в модуле math присвоена цепочка 'math'. Когда Python’овский код запускается прямо, не импортируется, значение __name__ равно '__main__'. Например: >>> __name__ '__main__' Python Programming, 2/e 27

Пример: выполнение программы с условиями n n Повторим вкратце: если модуль импортируется, то в Пример: выполнение программы с условиями n n Повторим вкратце: если модуль импортируется, то в переменной __name__ коду будет видно имя модуля. Если файл запускается прямо, то код увидит в __name__ значение '__main__'. Можно заменить последние строки программы на : if __name__ == '__main__': main() Фактически каждый модуль Python’а заканчивается таким образом. Python Programming, 2/e 28

Ветвление с двумя альтернативами n Рассмотрим программу вычисления корней квадратного уравнения в том виде, Ветвление с двумя альтернативами n Рассмотрим программу вычисления корней квадратного уравнения в том виде, в каком мы оставили её. # quadratic. py # Программа вычисляет действительные корни квадратного уравнения # Замечание: Программа завершается аварийно, если у квадратного # уравнения нет действительных корней import math def main(): print("Эта программа находит действительные корни кв. уравнения") a, b, c = eval(input("n. Пожалуйста, введите коэффициенты(a, b, c): ")) disc. Root = math. sqrt(b * b - 4 * a * c) root 1 = (-b + disc. Root) / (2 * a) root 2 = (-b - disc. Root) / (2 * a) print("n. Решения: ", root 1, root 2) main() Python Programming, 2/e 29

Ветвление с двумя альтернативами n Если b 2 -4 ac < 0, то программа Ветвление с двумя альтернативами n Если b 2 -4 ac < 0, то программа завершается аварийно. Программа вычисляет действительные корни квадратного уравнения Пожалуйста, введите коэффициенты(a, b, c): 1, 1, 2 Traceback (most recent call last): File "C: Documents and SettingsTerryMy DocumentsTeachingW 04CS 120Textbookcodechapter 3quadratic. py", line 21, in -toplevelmain() File "C: Documents and SettingsTerryMy DocumentsTeachingW 04CS 120Textbookcodechapter 3quadratic. py", line 14, in main disc. Root = math. sqrt(b * b - 4 * a * c) Value. Error: math domain error Python Programming, 2/e 30

Ветвление с двумя альтернативами n Мы можем исправить ситуацию. Ниже приведена первая попытка исправления. Ветвление с двумя альтернативами n Мы можем исправить ситуацию. Ниже приведена первая попытка исправления. # quadratic 2. py # Программа вычисляет действительные корни квадратного уравнения. # Плохая версия использования простого if, чтобы избежать авост import math def main(): print("Эта программа находит действительные корни кв. уравнения") a, b, c=eval(input("n. Пожалуйста, введите коэффициенты(a, b, c): ")) discrim = b * b - 4 * a * c if discrim >= 0: disc. Root = math. sqrt(discrim) root 1 = (-b + disc. Root) / (2 * a) root 2 = (-b - disc. Root) / (2 * a) print("n. Решения равны: ", root 1, root 2) Python Programming, 2/e 31

Ветвление с двумя альтернативами n n Сначала мы вычисляем дискриминант (b 2 -4 ac) Ветвление с двумя альтернативами n n Сначала мы вычисляем дискриминант (b 2 -4 ac) и проверяем, что он неотрицателен. Если это так, то программа продолжается и вычисляет корни. Посмотрите внимательно на программу. Что не так? Подсказка: что случится, если действительных корней нет? Python Programming, 2/e 32

Ветвление с двумя альтернативами n n Эта программа находит действительные корни квадратного уравнения Пожалуйста, Ветвление с двумя альтернативами n n Эта программа находит действительные корни квадратного уравнения Пожалуйста, введите коэффициенты(a, b, c): 1, 1, 1 Traceback (most recent call last): File "C: Documents and SettingsTerryMy DocumentsTeachingW 04CS 120Textbookcodechapter 3quadratic. py", line 21, in -toplevelmain() File "C: Documents and SettingsTerryMy DocumentsTeachingW 04CS 120Textbookcodechapter 3quadratic. py", line 14, in main disc. Root = math. sqrt(b * b - 4 * a * c) Value. Error: math domain error >>> n Это, возможно, даже хуже, чем версия с авостом, потому что мы не знаем, что происходит не так как хотелось бы. Python Programming, 2/e 33

Ветвление с двумя альтернативами n Можно добавить еще один if в конце: if discrim Ветвление с двумя альтернативами n Можно добавить еще один if в конце: if discrim < 0: print("Уравнение не имеет действительных корней!" ) n Это работает, но выглядит плохо, потому что у нас два взаимноисключающих исхода (if discrim >= 0 и discrim < 0). Они не могут одновременно быть оба ложны или истинны). Python Programming, 2/e 34

Ветвление с двумя альтернативами Python Programming, 2/e 35 Ветвление с двумя альтернативами Python Programming, 2/e 35

Ветвление с двумя альтернативами n n В Python’е, ветвление с двумя альтернативами можно реализовать, Ветвление с двумя альтернативами n n В Python’е, ветвление с двумя альтернативами можно реализовать, добавляя пункт else к пункту if. Это называется оператором if-else: if <условие>: <операторы> else: <операторы> Python Programming, 2/e 36

Ветвление с двумя альтернативами n n n Когда Python впервые встречает эту структуру, он Ветвление с двумя альтернативами n n n Когда Python впервые встречает эту структуру, он сначала вычисляет условие. Если условие истинно (true), то выполняются операторы при if. Если условие ложно (false), то выполняются операторы при else. Далее выполняются операторы, следующие после if-else, какие бы операторы из двух множеств операторов в if-else ни выполнялись. Python Programming, 2/e 37

Ветвление с двумя альтернативами # quadratic 3. py # Программа вычисляет действительные корни квадратных Ветвление с двумя альтернативами # quadratic 3. py # Программа вычисляет действительные корни квадратных уравнений. # Иллюстрирует применение ветвления с двумя альтернативами. import math def main(): print("Эта программа находит действительные корни квадратного уравнения n") a, b, c = eval(input("Пожалуйста, введите коэффициенты(a, b, c): ")) discrim = b * b - 4 * a * c if discrim < 0: print("n. Уравнение не имеет действительных корней!") else: disc. Root = math. sqrt(b * b - 4 * a * c) root 1 = (-b + disc. Root) / (2 * a) root 2 = (-b - disc. Root) / (2 * a) print ("n. Решения: ", root 1, root 2 ) main() Python Programming, 2/e 38

Ветвление с двумя альтернативами >>> Программа вычисляет действительные корни квадратных уравнений Пожалуйста, введите коэффициенты Ветвление с двумя альтернативами >>> Программа вычисляет действительные корни квадратных уравнений Пожалуйста, введите коэффициенты (a, b, c): 1, 1, 2 Уравнение не имеет действительных корней! >>> Программа вычисляет действительные корни квадратных уравнений Пожалуйста, введите коэффициенты (a, b, c): 2, 5, 2 Решения: -0. 5 -2. 0 Python Programming, 2/e 39

Многоальтернативное ветвление n Новейшая программа великолепна, но и в ней есть к чему придраться. Многоальтернативное ветвление n Новейшая программа великолепна, но и в ней есть к чему придраться. Программа вычисляет действительные корни квадратных уравнений Пожалуйста, введите коэффициенты(a, b, c): 1, 2, 1 Решения: -1. 0 Python Programming, 2/e 40

Многоальтернативное ветвление n n n Будучи правильным, этот ответ может привести в замешательство некоторых Многоальтернативное ветвление n n n Будучи правильным, этот ответ может привести в замешательство некоторых людей. Выглядит так, как будто одно и то же число по ошибке напечатано дважды. Двойные корни встречаются, когда дискриминант равен 0, и оба корня равны – b/2 a. Выглядит так, как будто нам нужны ветвления с тремя альтернативами. Python Programming, 2/e 41

Многоальтернативное ветвление n n n Проверяем значение discrim когда < 0: обрабатываем случай без Многоальтернативное ветвление n n n Проверяем значение discrim когда < 0: обрабатываем случай без корней когда = 0: обрабатываем случай двойного корня когда > 0: обрабатываем случай двух корней Мы можем сделать два оператора if-else, один внутри другого. Вставка одного сложного оператора в другой называется вложением. Python Programming, 2/e 42

Многоальтернативное ветвление if discrim < 0: print( Многоальтернативное ветвление if discrim < 0: print("Нет действительных корней") else: if discrim == 0: root = -b / (2 * a) print("Двойной корень равен", root) else: # Два действительных корня Python Programming, 2/e 43

Многоальтернативное ветвление Python Programming, 2/e 44 Многоальтернативное ветвление Python Programming, 2/e 44

Многоальтернативное ветвление n n Представим, что нам нужно реализовать ветвление с 5 альтернативами с Многоальтернативное ветвление n n Представим, что нам нужно реализовать ветвление с 5 альтернативами с помощью вложений. С оператором if-else нам нужно будет вкладывать операторы до 4 -го уровня. В Python’е существует конструкция, которая соединяет пункт else с последующим if в один elif. Python Programming, 2/e 45

Многоальтернативное ветвление n if <условие 1>: <случай 1 операторы> elif <условие 2>: <случай 2 Многоальтернативное ветвление n if <условие 1>: <случай 1 операторы> elif <условие 2>: <случай 2 операторы> elif <условие 3>: <случай 3 операторы> … else: <операторы по умолчанию> Python Programming, 2/e 46

Многоальтернативное ветвление n n n Эта форма состоит из произвольного количества взаимно исключающих блоков Многоальтернативное ветвление n n n Эта форма состоит из произвольного количества взаимно исключающих блоков кода. Python вычисляет каждое условие по очереди определяя первое истинное. Если истинное условие найдено, то выполняется блок операторов при этом условии, и управление передаётся к следующему после if-else оператору. Если все условия ложны, то выполняется блок операторов при пункте else. Python Programming, 2/e 47

Многоальтернативное ветвление n Пункт else необязательный. Если нет пункта else, возможно ни один из Многоальтернативное ветвление n Пункт else необязательный. Если нет пункта else, возможно ни один из выделенных отступами блоков операторов не будет выполнен в вашей программе. Python Programming, 2/e 48

Многоальтернативное ветвление # quadratic 4. py # Иллюстрирует использование многоальтернативного ветвления import math def Многоальтернативное ветвление # quadratic 4. py # Иллюстрирует использование многоальтернативного ветвления import math def main(): print("Эта программа находит действительные решения квадратного уравнения n") a, b, c = eval(input(" Пожалуйста, введите коэффициенты (a, b, c): ")) discrim = b * b - 4 * a * c if discrim < 0: print("n. Это уравнение не имеет действительных корней !") elif discrim == 0: root = -b / (2 * a) print("n. Двойной корень равен", root) else: disc. Root = math. sqrt(b * b - 4 * a * c) root 1 = (-b + disc. Root) / (2 * a) root 2 = (-b - disc. Root) / (2 * a) print("n. Два корня: ", root 1, root 2 ) Python Programming, 2/e 49

Обработка исключений n n В программе решения квадратного уравнения мы использовали структуру ветвления, чтобы Обработка исключений n n В программе решения квадратного уравнения мы использовали структуру ветвления, чтобы обойти необходимость извлекать квадратный корень из отрицательного числа, обходя таким образом и ошибку времени исполнения. Это верно для многих программ: структуры ветвления позволяют обойти редкие, но возможные ошибки. Python Programming, 2/e 50

Обработка исключений n n В предыдущей программе мы проверили данные до того как вызывать Обработка исключений n n В предыдущей программе мы проверили данные до того как вызывать функцию sqrt. Иногда функции проверяют данные на ошибки и возвращают специальные значения, чтобы указать на ошибку. Например, можно сделать так, чтобы функция, извлекающая квадратный корень, возвращала – 1, чтобы указать на ошибку (так квадратный корень всегда неотрицателен). Python Programming, 2/e 51

Обработка исключений n n n disc. Rt = other. Sqrt(b*b - 4*a*c) if disc. Обработка исключений n n n disc. Rt = other. Sqrt(b*b - 4*a*c) if disc. Rt < 0: print("Нет действительных корней. “) else: . . . Иногда программы проверяют так много частных случаев, что за алгоритмом трудно уследить. Разработчики языков программирования придумали механизм обработки исключений, чтобы решить проблемы проверки исключений. Python Programming, 2/e 52

Обработка исключений n n Программист может написать код, который ловит и обрабатывает ошибки, которые Обработка исключений n n Программист может написать код, который ловит и обрабатывает ошибки, которые возникают при исполнении программы, например, “Выполни эти шаги и если возникнут проблемы, то сделай так. ” Этот подход исключает необходимость делать явные проверки на каждом шагу алгоритма. Python Programming, 2/e 53

Обработка исключений # quadratic 5. py # Программа вычисляет действительные корни квадратного уравнения. # Обработка исключений # quadratic 5. py # Программа вычисляет действительные корни квадратного уравнения. # Демонстрирует обработку исключений, чтобы избежать авоста при плохом вводе import math def main(): print("Эта программа находит действительные корни квадратного уравнения n") try: a, b, c=eval(input("Пожалуйста, введите коэффициенты(a, b, c): ")) disc. Root = math. sqrt(b * b - 4 * a * c) root 1 = (-b + disc. Root) / (2 * a) root 2 = (-b - disc. Root) / (2 * a) print("n. Решения: ", root 1, root 2) except Value. Error: print("n. Нет действительных корней") Python Programming, 2/e 54

Обработка исключений n n n Оператор try имеет следующую форму: try: <тело> except <Error. Обработка исключений n n n Оператор try имеет следующую форму: try: <тело> except : <обработчик> Когда Python встречает оператор try, он пытается выполнить операторы в теле. Если ошибок нет, то управление передаётся на оператор после оператора try…except. Python Programming, 2/e 55

Обработка исключений n n Если ошибка случается во время выполнения операторов тела, то Python Обработка исключений n n Если ошибка случается во время выполнения операторов тела, то Python ищет пункт except с совпадающим типом ошибки. Если такой пункт находится, то обрабатывающий код выполняется. Первоначальная программа генерировала такой тип ошибки с отрицательным дискриминантом: Traceback (most recent call last): File "C: Documents and SettingsTerryMy DocumentsTeachingW 04CS 120Textbookcodechapter 3quadratic. py", line 21, in -toplevelmain() File "C: Documents and SettingsTerryMy DocumentsTeachingW 04CS 120Textbookcodechapter 3quadratic. py", line 14, in main disc. Root = math. sqrt(b * b - 4 * a * c) Value. Error: math domain error Python Programming, 2/e 56

Обработка исключений n n Последняя строка, 'Value. Error: math domain error', указывает конкретный тип Обработка исключений n n Последняя строка, 'Value. Error: math domain error', указывает конкретный тип ошибки. Ниже приводится результат программы quadratic 5. py Эта программа находит действительные корни квадратного уравнения Пожалуйста, введите коэффициенты(a, b, c): 1, 1, 1 Нет действительных корней n Вместо авоста обработчик исключений печатает сообщение, что действительных корней нет Python Programming, 2/e 57

Обработка исключений n n n Оператор try…except можно использовать, чтобы поймать любой тип ошибок Обработка исключений n n n Оператор try…except можно использовать, чтобы поймать любой тип ошибок и предоставить грациозный выход из ситуации. В случае программы решения квадратного уравнения возможные ошибки включают неправильное количество параметров (“распакован кортеж неверного размера”), введение идентификатора вместо числа (Name. Error), ввод неправильного (для Python’а) выражения (Type. Error). Оператор try может иметь несколько пунктов except. Python Programming, 2/e 58

Обработка исключений # quadratic 6. py # Программа вычисляет действительные корни квадратного уравнения. # Обработка исключений # quadratic 6. py # Программа вычисляет действительные корни квадратного уравнения. # Демонстрирует обработку исключений, чтобы избежать авоста при разных ошибках import math def main(): print("Эта программа находит действительные корни квадратного уравнения n") try: a, b, c=eval(input("Пожалуйста, введите коэффициенты(a, b, c): ")) disc. Root = math. sqrt(b * b - 4 * a * c) root 1 = (-b + disc. Root) / (2 * a) root 2 = (-b - disc. Root) / (2 * a) print("n. Решения: ", root 1, root 2) except Value. Error as exc. Obj: if str(exc. Obj) == "math domain error": print("Нет действительных корней") else: print("Вы не предоставили нужное количество коэффициентов. ") except Name. Error: print("n. Вы не ввели три числа. ") except Type. Error: print("n. Вы не ввели все числа. ") except Syntax. Error: print("n. Ввод в неправильной форме. Отсутствует запятая ? ") except: print("n. Что-то не так. Извините!") main() Python Programming, 2/e 59

Обработка исключений n n n Многочисленные excepts действуют как elif’ы. Если случается ошибка, то Обработка исключений n n n Многочисленные excepts действуют как elif’ы. Если случается ошибка, то Python перепробует все пункты except в поисках того, который соответствует типу ошибки. Пустой except внизу действует как else и ловит все прочие ошибки. Если бы не было пустого except’а в конце и ни один из пунктов except не сработал бы, то программа завершилась бы авостом. Python Programming, 2/e 60

Обработка исключений n n Сами исключения являются объектами специального типа. Если вы укажете после Обработка исключений n n Сами исключения являются объектами специального типа. Если вы укажете после типа ошибки идентификатор в пункте except, то Python присвоит идентификатору реальный объект исключения. Python Programming, 2/e 61

Обучение проектированию: Максимум из трёх чисел n n Теперь, когда у нас есть структуры Обучение проектированию: Максимум из трёх чисел n n Теперь, когда у нас есть структуры ветвления мы можем решать более сложные задачи. Отрицательный момент заключается в том, что написание таких программ сложнее. Предположим нам нужен алгоритм поиска наибольшего из трёх чисел. Python Programming, 2/e 62

Обучение проектированию: Максимум из трёх чисел def main(): x 1, x 2, x 3 Обучение проектированию: Максимум из трёх чисел def main(): x 1, x 2, x 3 = eval(input("Пожалуйста, введите три числа: ")) # здесь находим максимальное из трёх чисел print("Наибольшее число равно", max) Python Programming, 2/e 63

Стратегия 1: сравниваем все со всеми n Это похоже на ветвление с тремя альтернативами, Стратегия 1: сравниваем все со всеми n Это похоже на ветвление с тремя альтернативами, нам нужно правильно выполнить одно из следующих присваиваний: max = x 1 max = x 2 max = x 3 n Всё, что нужно сделать это предварить каждое присваивание правильным условием! Python Programming, 2/e 64

Стратегия 1: сравниваем все со всеми n n n Давайте рассмотрим случай, когда x Стратегия 1: сравниваем все со всеми n n n Давайте рассмотрим случай, когда x 1 наибольшее. if x 1 >= x 2 >= x 3: max = x 1 Правильно ли это синтаксически? n n Многие языки не разрешают составные условия Python позволяет. Оно эквивалентно неравенствам x 1 ≥ x 2 ≥ x 3. Python Programming, 2/e 65

Стратегия 1: сравниваем все со всеми n Всякий раз когда вы пишете ветвление возникают Стратегия 1: сравниваем все со всеми n Всякий раз когда вы пишете ветвление возникают два ключевых вопроса: n когда условие истинно, то следует ли выполнить тело альтернативы? n x 1 не меньше, чем x 2 и x 3, поэтому x 1 максимально. n всегда обращайте внимание на граничные значения! Python Programming, 2/e 66

Стратегия 1: сравниваем все со всеми n во-вторых, задайте обратный к первому вопрос, а Стратегия 1: сравниваем все со всеми n во-вторых, задайте обратный к первому вопрос, а именно, есть ли уверенность, что это условие истинно во всех случаях, когда x 1 максимально? n Предположим, что числа равны 5, 2, и 4. n Ясно, что x 1 наибольшее, но верно ли, что x 1 ≥ x 2 ≥ x 3? n Мы не беспокоимся о порядке x 2 и x 3, поэтому нам нужно проверить, что: x 1 >= x 2 и x 1 >= x 3. Python Programming, 2/e 67

Стратегия 1: сравниваем все со всеми n Мы можем соединить эти условия оператором and. Стратегия 1: сравниваем все со всеми n Мы можем соединить эти условия оператором and. if x 1 >= x 2 and x 1 >= x 3: max = x 1 elif x 2 >= x 1 and x 2 >= x 3: max = x 2 else: max = x 3 n Мы сравниваем каждое возможное значение со всеми остальными, чтобы определить наибольшее. Python Programming, 2/e 68

Стратегия 1: сравниваем все со всеми n n n Что случится, если мы захотим Стратегия 1: сравниваем все со всеми n n n Что случится, если мы захотим найти наибольшее из 5 чисел? Нам нужны будут 4 булевых выражения, каждое состоящее из 4 условий, соединённых вместе операторами and. Уф! Python Programming, 2/e 69

Стратегия 2: дерево альтернатив n n n Можно избежать излишних проверок из предыдущего алгоритма, Стратегия 2: дерево альтернатив n n n Можно избежать излишних проверок из предыдущего алгоритма, используя подход дерева альтернатив. Допустим мы начали с проверки неравенства x 1>= x 2. Оно выбъет x 1 или x 2 из борьбы за звание наибольшего числа. Если условие истинно, то нужно проверить что больше, x 1 или x 3. Python Programming, 2/e 70

Стратегия 2: дерево альтернатив Python Programming, 2/e 71 Стратегия 2: дерево альтернатив Python Programming, 2/e 71

Стратегия 2: дерево альтернатив n if x 1 >= x 2: if x 1 Стратегия 2: дерево альтернатив n if x 1 >= x 2: if x 1 >= x 3: max = x 1 else: max = x 3 else: if x 2 >= x 3: max = x 2 else max = x 3 Python Programming, 2/e 72

Стратегия 2: дерево альтернатив n n Этот подход позволяет ограничиться двумя сравнениями независимо от Стратегия 2: дерево альтернатив n n Этот подход позволяет ограничиться двумя сравнениями независимо от упорядочения трёх значений. Однако этот подход более сложен , чем первый. Чтобы найти максимум из 4 значений нужно будет операторы ifelse’ы вкладывать друг в друга на три уровня и 8 операторов присваивания. Python Programming, 2/e 73

Стратегия 3: последовательная обработка n n n Как решить проблему? Вероятно, можно посмотреть на Стратегия 3: последовательная обработка n n n Как решить проблему? Вероятно, можно посмотреть на 3 числа и сказать какое наибольшее. Но что делать со списком из ста чисел? Одна из стратегий просматривать список в поисках наибольшего. Когда такое число найдено, отмечаем его и продолжаем искать. После нахождения большего, стираем отмеченное ранее, вписываем найденное и продолжаем искать. Python Programming, 2/e 74

Стратегия 3: последовательная обработка Python Programming, 2/e 75 Стратегия 3: последовательная обработка Python Programming, 2/e 75

Стратегия 3: последовательная обработка n Эту идею легко переложить на язык Python. max = Стратегия 3: последовательная обработка n Эту идею легко переложить на язык Python. max = x 1 if x 2 > max: max = x 2 if x 3 > max: max = x 3 Python Programming, 2/e 76

Стратегия 3: последовательная обработка n n Этот процесс повторяющийся, что позволяет использовать цикл. Мы Стратегия 3: последовательная обработка n n Этот процесс повторяющийся, что позволяет использовать цикл. Мы просим ввести число, сравниваем его с текущим max, если оно больше, то актуализируем значение max, далее совершаем очередную итерацию. Python Programming, 2/e 77

Стратегия 3: последовательная обработка # maxn. py # Находит максимум последовательности чисел. def main(): Стратегия 3: последовательная обработка # maxn. py # Находит максимум последовательности чисел. def main(): n = eval(input("Сколько у нас чисел? ")) # Приравниваем max первому числу max = eval(input("Введите число >> ")) # теперь сравниваем (n-1) значений for i in range(n-1): x = eval(input ("Введите число >> ")) if x > max: max = x print("Наибольшее число равно", max) Python Programming, 2/e 78

Стратегия 4: использование Python’а n n Python имеет встроенную функцию, которая называется max, она Стратегия 4: использование Python’а n n Python имеет встроенную функцию, которая называется max, она возвращает наибольший из своих параметров. def main(): x 1, x 2, x 3 = eval(input("Пожалуйста введите три значения: ")) print("Наибольшее значение равно", max(x 1, x 2, x 3)) Python Programming, 2/e 79

Некоторые поучения n Обычно существует больше чем один способ, чтобы решить проблему: n n Некоторые поучения n Обычно существует больше чем один способ, чтобы решить проблему: n n не бросайтесь реализовывать первую идею, которая пришла в голову, подумайте о схеме решения и спросите нет ли лучшего способа решения проблемы; ваша первая задача найти правильный алгоритм, далее стремитесь к ясности, простоте, эффективности, масштабируемости и элегантности. Python Programming, 2/e 80

Некоторые поучения n Будьте вычислителем: n один из лучших способов сформулировать алгоритм это спросить Некоторые поучения n Будьте вычислителем: n один из лучших способов сформулировать алгоритм это спросить себя как вы решите проблему; n этот прямолинейный подход часто оказывается простым, ясным, и достаточно эффективным. Python Programming, 2/e 81

Некоторые поучения n Общность это хорошо: n рассмотрение более общей проблемы может привести к Некоторые поучения n Общность это хорошо: n рассмотрение более общей проблемы может привести к лучшему решению в частном случае; n если программу поиска максимума из n чисел так же легко написать как и программу поиска максимума из 3 чисел, то пишите более общую программу, она может быть полезна в других случаях. Python Programming, 2/e 82

Некоторые поучения n Не переизобретайте колесо: n n n если вы решаете проблему, которую Некоторые поучения n Не переизобретайте колесо: n n n если вы решаете проблему, которую до вас решали многие люди, то поинтересуйтесь решена ли она; по мере обучения программированию проектирование программ с чистого листа многое даёт; настоящий программист знает где позаимствовать. Python Programming, 2/e 83