В этом уроке мы познакомимся с еще одним очень важным столпом программирования – функциями.
Немного математики
Мы уже использовали математические выражения в предыдущих уроках. Например, мы вводили выражения в строку чтобы получить ответ:
1 2 3 | >>> 6 * (1+6) 42 >>> |
Чтобы увидеть результат вычислений, мы должны вводить выражение заново.
Создадим скрипт arithmetic.py и запишем в него следующие инструкции:
1 2 3 4 | print "2 + 1 =", 2 + 1 print "2 * (2 + 3) =", 2 * (2 + 3) print "1.2 / 0.3 =", 1.2 / 0.3 print "5 / 2 =", 5 / 2 |
Здесь мы используем простую инструкцию print, строку текста и математические выражения. При запуске скрипта, математические выражения будут выполнены.
Пробелы между символами в математических выражениях не являются обязательными. Но существует стандарт написания кода PEP8, который рекомендует это делать.
Когда вы сохраните и выполните скрипт вы увидите следующее:
1 2 3 4 5 6 | >>> 2 + 1 = 3 2 * (2 + 3) = 10 1.2 / 0.3 = 4.0 5 / 2 = 2 >>> |
Минутку… 5 / 2 = 2… Это вычисление не выглядит точным. К сожалению, разработчики механизма деления сделали его немного нелогичным для человека, но технически правильным. Когда мы делим два целых числа, то результат является также целочисленным, а остаток просто отбрасывается.
Чтобы решить эту задачу с понятным нам результатом, необходимо добавить следующую строку в начало скрипта:
1 | from __future__ import division |
Рекомендуем, добавлять ее в каждый скрипт, где вы используете деление целых чисел. В python версии 3.x эта задача решена привычным для человека образом. from __future__ — означает что мы импортируем функционал из будущей версии.
Если сейчас вы все же хотите совершить целочисленное деление, то используйте оператор // вместо одинарного / , например:
1 2 3 | >>> 5 // 2 2 >>> |
Это «удвоение оператора» действительно только для деления. Если вы решите применить,например, оператор **, то он возведет число в степень:
1 2 3 | >>> 2**5 32 >>> |
Напишем собственную функцию
Одним из многочисленных достоинств Python является легкость манипуляций с различными фрагментами кода, похожими на кубики Lego. Кубики Lego в программировании — это функции.
Функция — это, в общем, миниатюрная программа, получающая одни данные и производящая другие. Мы уже видели несколько примеров функций, например, len(). Она принимает переменную и возвращает длину этой переменной.
Создадим собственную функцию, которая будет принимать на вход число, а возвращать его квадрат.
1 2 3 | def square(number): sqr_num = number ** 2 return sqr_num |
def — это сокращение от define, что переводится, как «определить». Эта инструкция говорит о том, что мы объявляем функцию. В этом случае, мы дали функции имя square и она принимает один параметр названый number. Входной параметр называется аргументом функции. Функции могут иметь и более одного аргумента.
Вторая строка кода, является первой в теле функции. В этой строке в функции мы объявляем новую переменную sqr_num и записываем в нее значение number, возведенное в квадрат. Следующая строка возвращает значение переменной sqr_num.
Если вы вставите эти три строки в скрипт и выполните его, то ничего не произойдет. Функция ничего не делает сама по себе. Мы можем использовать функцию в коде программы после ее объявления. Например, как в следующем скрипте:
1 2 3 4 5 6 7 | def square(number): sqr_num = number ** 2 return sqr_num input_num = 7 output_num = square(input_num) print output_num |
В строке utput_num = square(input_num) мы вызываем нашу функцию. Передаем ей аргумент input_num, равный 7. Функция производит вычисления квадрата и сохраняет его в переменной output_num.
Следует обратить внимание на то, что код в теле функции сдвинут отступами от края строки. Python с помощью отступов определяет эти строки как принадлежащие функции.
В одном скрипте можно объявлять множество функций. Функции могут вызывать друг друга, но важно следить, чтобы вызов происходил после определения. Попробуем запустить следующий код:
1 2 3 4 5 6 7 | input_num = 7 output_num = square(input_num) print output_num def square(number): sqr_num = number * number return sqr_num |
На второй строке возникнет ошибка: NameError: name ‘square’ is not defined.
Python не сможет понять, что мы имели в виду, когда упомянули square(), так как он узнал бы о ней позже, только если бы дошел до 5-й строки.
Создадим функцию с двумя аргументами. Аргументы отделяются друг от друга запятыми. Следующая функции вернет разность между двумя аргументами.
1 2 | def return_difference(num1, num2): return num1 — num2 |
Вызовем эту функцию:
1 | print return_difference(5, 7) |
Мы увидим результат работы -2.
Как только функция возвращает значение, она останавливает свое выполнение. Код, который расположен далее команды return выполняться не будет.
Подсказки к функциям
Часто возникает ситуация когда непонятно на первый взгляд, что делает какая-либо функция. Чтобы не терять время на попытках разобраться в ее коде, разработчики Python предоставили возможность оставлять к ним комментарий и функцию help(), его выводящую. Комментарий к функции делается в следующей за ее определением строке:
1 2 3 4 | def return_difference(n1, n2): """Return the difference between two numbers. Subtracts n2 from n1.""" return n1 — n2 |
Затем выполнив help() для нашей функции вы увидите следующее:
1 2 3 4 5 6 | >>> help(return_difference) Help on function return_difference in module __main__: return_difference(n1, n2) Return the difference between two numbers. Subtracts n2 from n1. >>> |
Конечно, вы можете использовать help() для многих других функций, не только написанных вами.
Мы ознакомились с характеристиками, описанием и использованием функций в языке Python. В следующем уроке мы научимся выполнять один и тот же код циклически.