В программировании функции могут не только возвращать данные, но и принимать их, используя так называемые параметры, которые указываются в скобках внутри заголовка функции. Количество параметров может варьироваться.
Параметры служат для создания локальных переменных, которым значения присваиваются в момент вызова функции. Значения, передаваемые в функцию, называют аргументами. Также используется иная терминология, например: "формальные параметры" и "фактические параметры". В Python чаще принято всё называть аргументами.
Рассмотрим схему и пример, иллюстрирующий этот процесс:
При вызове функции ей передаются аргументы. В примере рассматриваются глобальные переменные num1 и num2, но фактически передаются их значения — числа 100 и 12. То есть мы могли бы просто записать mathem(100, 12)
— результат был бы аналогичным.
Когда интерпретатор начинает исполнять функцию, он присваивает переменным-параметрам значения-аргументы. В данном примере переменной a будет присвоено значение 100, а b — 12.
Изменения значений a и b внутри функции не повлияют на значения переменных num1 и num2. Это характерно для неизменяемых типов данных в Python, таких как числа и строки. Говорят, что данные передаются по значению. Число 100 при присвоении переменной a копируется в отдельное место в памяти, не изменяя при этом данные переменной num1.
Существуют и изменяемые типы данных, такие как списки и словари. При их использовании данные передаются по ссылке. В функцию передаётся не сами данные, а их ссылка, которая связывается с локальной переменной. Изменения в таких данных, произведённые через локальную переменную, будут видны, если обратиться к ним через глобальную переменную, так как обе ссылаются на одну и ту же область памяти.
Передача по ссылке позволяет экономить память, аналагично когда мы работаем со сложными структурами данных, так как их копирование может быть нецелесообразным. Однако, если необходимо, можно принудительно создать копию таких данных.
Произвольное количество аргументов
Важно также отметить, что количество аргументов и параметров функции должны совмещаться. Нельзя передать три аргумента функции, которая принимает только два, и наоборот, если требуется два аргумента, нельзя передать только один. В примере обязательные параметры.
Но в Python можно определить параметры со значениями по умолчанию. Это позволяет не передавать аргументы для таких параметров. Однако, если аргумент всё же передан, то значение по умолчанию будет заменено на переданное значение.
def cylinder(h, r = 1): side = 2 * 3.14 * r * h circle = 3.14 * r**2 full = side + 2 * circle return full figure1 = cylinder(4, 3) figure2 = cylinder(5) print(figure1) print(figure2)
Вывод:
131.88 37.68
При втором вызове cylinder() указывается только один аргумент, присваиваемый параметру h, тогда как r получает значение по умолчанию, равное 1.
Разрешено определять параметры со значениями по умолчанию после тех параметров, у которых нет начального значения. Это правило синтаксиса Python.
Во время вызова функции можно явно указать, какое значение должно соответствовать какому параметру. В этом случае порядок следования значений становится неважным:
… figure3 = cylinder(10, 2) figure4 = cylinder(r=2, h=10) print(figure3) print(figure4)
Оба вызова одинаковы по значению аргументов: первый использует порядок следования параметров, а второй — явное указание имен параметров.
Определение и вызов функций в Python имеют множество других особенностей, но они требуют более глубокого изучения. Можно лишь отметить, что функции могут быть определены так, чтобы принимать любое количество аргументов или обходиться вовсе без них:
def oneOrMany(*a): print(a) oneOrMany(1) oneOrMany('1',1, 2, 'abc') oneOrMany()
Результат:
(1,) ('1', 1, 2, 'abc') ()
Здесь мы видим кортежи, обсуждавшиеся в прошлом уроке.
Практическая работа
Создайте программу, которая включает следующие четыре функции:
- Функция getInput() без параметров запрашивает ввод с клавиатуры и возвращает полученное значение в программу.
- Функция testInput() принимает один параметр и проверяет, возможно ли его преобразование в целое число. Возвращает True, если возможно, и False в противном случае.
- Функция strToInt() с одним параметром преобразует его в целое число и возвращает результат.
- Функция printInt() с одним параметром выводит переданное значение на экран и ничего не возвращает.
В основной части программы сначала вызовите первую функцию. Ее результат передайте во вторую функцию. Если возвращено True, передайте данные в третью функцию и результат третьей функции — в четвертую.