- •§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. Подсчет букв
§3.5. Композиция
Во второй главе мы уже рассматривали композицию применительно к арифметическим операциям и простым выражениям. Но композиция позволяет комбинировать и вызовы функций: функция в качестве параметра может принимать любое выражение, возвращающее
37
Ревизия: 170
Функции
значение, которое попадает в область ее определения; с другой стороны, вызов функции (точнее, результат ее выполнения) может быть использован в качестве операнда:
>» х = math, sin (math, asin (math, sqrt (2 ) |
/ 2.0) |
+ math.pi / 2) |
>» print x |
|
|
0.70710678118654757 |
|
|
>» |
|
|
Разберем этот пример. Первая операция, с которой сталкивается синтаксический анализатор при разборе этого выражения, это присваивание значения выражения, стоящего справа от знака =, переменной х. Перед присваиванием интерпретатор должен вычислить значение этого выражения, т.е. посчитать синус значения выражения math. asin (math. sqrt (2) / 2.0) + math.pi / 2, которое, в свою очередь равно сумме значений подвыражений math, asin (math, sqrt (2) / 2.0) и math, pi / 2. Первое из них вычисляется аналогичным образом: сначала рассчитывается значение выражения, стоящего в скобках, а затем вызывается функция math.asin(), которой полученное выражение передается в качестве аргумента. Второе подвыражение равно л;/2. Подсчитав сумму этих двух подвыражений, интерпретатор передает полученное значение в качестве аргумента функции math. sin (), а результат присваивает переменной х.
Напишите программу, вычисляющую значения корней квадратного уравнения
ax2+bx+c=0, a<>0 no коэффициентам этого уравнения. Коэффициенты должны
заноситься в начале программы в переменные а, Ъи с.
Попробуйте переменным а, Ъи с задать значения 1, 0 и -1 соответственно. Программа
должна вывести значения 1.0 и -1.0. Проверьте совпали ли ваши результаты с
ожидаемыми.
Экспериментируя с другими коэффициентами, имейте ввиду, что существуют уравнения
не имеющие решений (у таких уравнений дискриминант меньше нуля), поэтому не
пугайтесь, если в вашей программе возникнет ошибка вида: ValueError: math domain
error. Немного позже мы узнаем, как этого избежать.
§3.6. Создание функций
До сих пор мы использовали встроенные функции Питона и функции из модулей, которые входят в комплект его поставки. Но мощь структурных языков программирования заключается в том, что мы можем создавать свои собственные функции, причем делается это довольно просто. В структурном программировании функция представляет собой именованную последовательность выражений, выполняющих необходимую операцию. В Питоне существует специальный оператор определения функции, имеющий следующий синтаксис:
def ИМЯ_ФУНКЦИИ(СПИСОК_ПАРАМЕТРОВ): ПОСЛЕДОВАТЕЛЬНОСТЬ_ВЫРАЖЕНИЙ
Правила выбора имен функций полностью аналогичны правилам выбора имен переменных, описанным в предыдущей главе. Список параметров определяет набор значений, которые могут быть переданы функции в качестве исходных данных - параметры перечисляются через запятую. Первая строка определения обычно называется заголовком функции, обозначенным ключевым словом def (от англ. «define» - «определить»). Заголовок функции в Питоне завершается двоеточием. После него может следовать любое количество выражений, но они должны быть записаны со смещением относительно начала строки. Для
38
Ревизия: 170
Функции
такого смещения можно использовать один или несколько пробелов, но, пожалуй, удобнее всего вместо пробелов использовать символ табуляции (клавиша [Tab]). Напишем и протестируем нашу первую функцию; для завершения последовательности выражений, составляющих тело функции достаточно еще раз нажать клавишу [Enter] (в редакторе, поддерживающем автоотступы, еще придется нажать [Backspace], чтобы убрать автоматически добавленный отступ):
>» def printAnything (object) : ... print object
>» printAnything ( "Some string")
Some string
>» number = 15
>» printAnything (number)
15
В первых двух строках примера мы определили функцию PrintAnything (), которая печатает объект, переданный в качестве параметра. Мы можем передать этой функции строку или число, что мы и попробовали сделать в четвертой и седьмой строках примера. Полученные результаты совпали с ожидаемыми, но давайте не будем на этом останавливаться и поставим еще один эксперимент.
Что если передать в качестве параметра имя функции? Вызовем PrintAnything (), указав в скобках ее же имя:
>» printAnything (printAnything)
<function printAnything at 0x80d7554>
>»
Питон вывел информацию о функции: ее имя и адрес в памяти, где она хранится! В данном случае адрес равен 0x80d7554, но у вас на компьютере этот адрес может быть другим. Теперь давайте откроем текстовый редактор и напишем такую программу:
def |
printHello(): print "Hello!" |
|
def |
runFunction(function function name() |
name): |
run |
Function(printHello) |
|
Сохраним программу в файле с именем prog2 .py и запустим ее из командной строки (в операционной системе Windows достаточно двойного клика левой кнопки мыши на пиктограмме этого файла6):
$ python prog2.py
Hello!
6 Не забудьте в последней строке программы написать команду ожидания нажатия клавиши, как это описано в разделе «Запуск программ, написанных на Питоне» (см. Введение).
39
Ревизия: 170
Функции
Наверное, вы уже поняли, что сделал Питон, когда мы вызвали функцию runFunction
() и передали ей в качестве параметра имя функции printHello (): он заменил
function_name на значение переданного параметра и вызвал таким образом функцию
printHello (). Такой гибкостью может похвататься редкий язык программирования. В
языках C++ или Pascal это делается далеко не тривиальным способом.
Имейте также ввиду, что вызывать функцию до ее определения нельзя - это приведет к возникновению исключения.
Упражнение. Переделайте программу вычисления корней квадратного уравнения в функцию printRoots (). Параметрами данной функции должны быть коэффициенты квадратного многочлена: а, Ъ и с. Рассчитав корни уравнения, функция должна вывести их на печать.
Упражнение. Напишите функцию, рассчитывающую расстояние между двумя точками на плоскости (координаты (xl, yl) и (х2, у2) даны).
distance(x1 ух х2 у2)— \{х2 ~x\f + {Уг ~У\)2
