Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Чаплыгин А.Н. Учимся програмировать вместе с Пи...doc
Скачиваний:
3
Добавлен:
01.07.2025
Размер:
3 Мб
Скачать
☆

§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