- •§0.1. Базовые знания
- •§0.2. Где достать интерпретатор языка Питон?
- •§0.3. Установка интерпретатора языка Питон в unix
- •§0.3.1. Установка/обновление Питона из грт-пакета
- •§0.3.2. Установка Питона из исходного кода
- •§0.4. Установка Питона в ос Windows
- •§0.5. Запуск программ, написанных на Питоне
- •§0.6. Среда разработки
- •§1.1. Алгоритмы и программы
- •§1.2. Языки программирования и уровни абстракции
- •Глава 1. Базовые понятия
- •§1.3. Формальные и естественные языки
- •§1.4. Интерпретаторы и компиляторы
- •§1.5. Первая программа
- •§1.6. Что такое отладка?
- •§1.6.1. Синтаксические ошибки (syntax errors)
- •§1.6.2. Ошибки выполнения (runtime errors)
- •§1.6.3. Семантические ошибки (semantic errors)
- •§1.6.4. Процесс отладки
- •Глава 2. Переменные, операции и выражения
- •§2.1. Значения и типы
- •§2.2. Преобразование типов
- •§2.3. Переменные
- •§2.4. Имена переменных и ключевые слова
- •§2.5. Выражения
- •§2.6. Выполнение выражений
- •§2.7. Операторы и операнды
- •§2.8. Порядок операций
- •§2.9. Простейшие операции над строками
- •§2.10. Композиция
- •Глава 3. Функции §3.1. Подпрограммы
- •§3.2. Вызовы функций
- •§3.3. Справочная система
- •§3.4. Импорт модулей и математические функции
- •§3.5. Композиция
- •§3.6. Создание функций
- •§3.7. Параметры и аргументы
- •§3.8. Локальные переменные
- •§3.9. Поток выполнения
- •§3.10. Стековые диаграммы
- •§3.11. Функции, возвращающие результат
- •Глава 4. Компьютерная графика
- •Глава 5. Логические выражения, условия и рекурсия §5.1. Комментарии в программах
- •§5.2. Простые логические выражения и логический тип данных
- •§5.3. Логические операторы
- •§5.4. Выполнение по условию и «пустота»
- •§5.5. Ввод данных с клавиатуры
- •§5.6. Альтернативные ветки программы (Chained conditionals)
- •§5.7. Пустые блоки
- •§5.8. Вложенные условные операторы (Nested conditionals)
- •§5.9. Рекурсия
- •§5.10. Стековые диаграммы рекурсивных вызовов
- •§5.11. Максимальная глубина рекурсии
- •§5.12. Числа Фибоначчи
- •Глава 6. Циклы
- •§6.1. Оператор цикла while
- •§6.2. Счетчики
- •§6.3. Бесконечные циклы
- •§6.4. Альтернативная ветка цикла while
- •§6.5. Табулирование функций
- •§6.6. Специальные и экранируемые символы
- •§6.7. Числа Фибоначчи и оператор цикла while
- •§6.8. Вложенные операторы цикла и двумерные таблицы
- •§6.9. Классификация операторов цикла
- •§6.10. Управляющие структуры
- •Глава 7. Строки
- •§7.1. Оператор индексирования
- •§7.2. Длина строки и отрицательные индексы
- •§7.3. Перебор и цикл for
- •§7.4. Срезы строк
- •§7.5. Сравнение строк
- •§7.6. Строки нельзя изменить
- •§7.7. Функция find
- •§7.8. Циклы и счётчики
- •§7.9. Модуль string
- •§7.10. Классификация символов
- •§10.2. Операции над словарями
- •§10.3. Методы словарей
- •§10.4. Использование псевдонимов и копирование
- •§10.5. Разряженные матрицы
- •§10.6. Подсказки
- •§10.7. Тип «длинное целое число»
- •§10.8. Подсчет букв
§5.3. Логические операторы
Логические выражения могут быть более сложными и состоять из нескольких простых выражений. Для объединения простых выражений в более сложные используются логические операторы: and, or и not.
Значения их полностью совпадают со значением английских слов, которыми они обозначаются. Выражение х and у будет истинным только в том случае, когда х - истина, и
51
Ревизия: 170 Логические выражения, условия и рекурсия
у- истина. Во всех остальных случаях выражение будет ложью. Выражение х or у будет истиной, если хотя бы один из операндов - истина. Оператор not символизирует отрицание: not х - истина, если х - ложь, и наоборот: not х - ложь, если х - истина. Обратите внимание, что оператор not унарный, т.е. он работает только с одним операндом.
Упражнение. Чему должен равняться х для того, чтобы выражение not not х было ложным?
Для простоты составим таблицы со списков всех возможных комбинаций значений операндов логических выражений и самих выражений (такие таблицы в математической логике называются таблицами истинности):
X |
У |
xand у |
хогу |
0 |
0 |
0 |
0 |
0 |
1 |
0 |
1 |
1 |
0 |
0 |
1 |
1 |
1 |
1 |
1 |
X |
notx |
0 |
1 |
1 |
0 |
Упражнение. С помощью таблиц истинности проверьте следующие свойства логических операций:
х and у эквивалентно у and x
х or у эквивалентно у or x
х and х and x эквивалентно х
х or х or х эквивалентно х
not х and not у эквивалентно not (x or у)
§5.4. Выполнение по условию и «пустота»
Теперь мы готовы к изучению оператора проверки условия, позволяющего организовать разветвление программы при выполнении того или иного условия. В общем виде он выглядит так:
if ЛОГИЧЕСКОЕ_УСЛОВИЕ:
ПОСЛЕДОВАТЕЛЬНОСТЬ_ВЫРАЖЕНИЙ
Первым идет ключевое слово if (англ. «если»); за ним- логическое выражение; затем двоеточие, обозначающее конец заголовка оператора, а после него - любая последовательность выражений или тело условного оператора, которое будет выполняться в случае, если условие в заголовке оператора истинно. Простой пример:
х = 2 |
|
|
|
if х > 0: |
|
|
|
"x |
is |
positive" |
|
if x < 0: |
|
|
|
"x |
is |
negative" |
52
Ревизия: 170
Логические выражения, условия и рекурсия
print "Stopping..." Сохраним, запустим эту программу и разберем результат ее выполнения:
$ python prog7.py х is positive Stopping...
На первой строке мы определили переменную х, присвоив ей значение 2. Затем с помощью условного оператора проверили на истинность выражение х > 0 - значение х оказалось больше нуля, поэтому Питон выполнил тело этого условного оператора: вывел строку х is positive. Далее следует еще один оператор if, проверяющий выполнение условия х < 0, которое является ложным, и поэтому тело этого условного оператора Питон пропустил и выполнил следующую за ней инструкцию.
Скорее всего, вы уже знаете, где можно использовать условный оператор. Первое, что приходит в голову: функция расчета корней квадратного уравнения. Не все квадратные уравнения имеют действительные корни, поэтому если дискриминант квадратного уравнения меньше нуля, то производить дальнейшие вычисления не нужно. Модифицируем функцию printRoots() так, чтобы она правильно обрабатывала ситуацию с отрицательным дискриминантом:
>» def PrintRoots (a, b, с) :
D = b**2 - 4 * а * с
if D < 0: . . . return None, None
... import math
xl = (-b + math.sqrt(D)) / 2 * a
x2 = (-b - math.sqrt(D)) / 2 * a . . . return xl, x2 >»
>» print PrintRoots (3, 2, 1) (None, None)
Итак, уравнение Зх2 + 2x + 1= 0 корней не имеет, т.е. его дискриминант оказался отрицательным, поэтому Питон выполнил ветку программы с инструкцией return None, None. Здесь мы воспользовались тем, что выполнение подпрограмм завершается сразу после выполнения инструкции return.
Обратите внимание на то, что инструкция возвращает не пару значений (0, 0), т.к. с точки зрения математики, это неверно: корни неопределены и функция должна вернуть пустоту. Для этих целей и предусмотрена встроенная константа None.
Упражнение. Напишите функцию compare (х, у), сравнивающую х и у и возвращающую следующие значения:
53
Ревизия: 170
Логические выражения, условия и рекурсия
compare (х, у) —
1, еслих>у, 0, еслих — у, — 1, еслих<у
