Функции представляют блок кода, который выполняет определенную задачу и который можно повторно использовать в других частях программы. Формальное определение функции:
| 1 2 | def имя_функции ([параметры]):инструкции |
Определение функции начинается с выражения def, которое состоит из имени функции, набора скобок с параметрами и двоеточия. Параметры в скобках необязательны. А со следующей строки идет блок инструкций, которые выполняет функция. Все инструкции функции имеют отступы от начала строки.
Например, определение простейшей функции:
| 1 2 | def say_hello():print("Hello") |
Функция называется say_hello. Она не имеет параметров и содержит одну единственную инструкцию, которая выводит на консоль строку «Hello».
Для вызова функции указывается имя функции, после которого в скобках идет передача значений для всех ее параметров. Например:
| 1 2 3 4 5 6 | def say_hello():print("Hello") say_hello()say_hello()say_hello() |
Здесь три раза подряд вызывается функция say_hello. В итоге мы получим следующий консольный вывод:
Hello Hello Hello
Теперь определим и используем функцию с параметрами:
| 1 2 3 4 5 6 | def say_hello(name):print("Hello,",name) say_hello("Tom")say_hello("Bob")say_hello("Alice") |
Функция принимает параметр name, и при вызове функции мы можем передать вместо параметра какой-либо значение:
Hello, Tom Hello, Bob Hello, Alice
Значения по умолчанию
Некоторые параметры функции мы можем сделать необязательными, указав для них значения по умолчанию при определении функции. Например:
| 1 2 3 4 5 | def say_hello(name="Tom"):print("Hello,", name) say_hello()say_hello("Bob") |
Здесь параметр name является необязательным. И если мы не передаем при вызове функции для него значение, то применяется значение по умолчанию, то есть строка «Tom».
Именованные параметры
При передаче значений функция сопоставляет их с параметрами в том порядке, в котором они передаются. Например, пусть есть следующая функция:
| 1 2 3 4 | def display_info(name, age):print("Name:", name, "\t", "Age:", age)display_info("Tom", 22) |
При вызове функции первое значение «Tom» передается первому параметру — параметру name, второе значение — число 22 передается второму параметру — age. И так далее по порядку. Использование именованных параметров позволяет переопределить порядок передачи:
| 1 2 3 4 | def display_info(name, age):print("Name:", name, "\t", "Age:", age)display_info(age=22, name="Tom") |
Именованные параметры предполагают указание имени параметра с присвоением ему значения при вызове функции.
Неопределенное количество параметров
С помощью символа звездочки можно определить неопределенное количество параметров:
| 1 2 3 4 5 6 7 8 9 10 11 | def sum(*params):result = 0for n in params:result += nreturn result sumOfNumbers1 = sum(1, 2, 3, 4, 5) # 15sumOfNumbers2 = sum(3, 4, 5, 6) # 18print(sumOfNumbers1)print(sumOfNumbers2) |
В данном случае функция sum принимает один параметр — *params, но звездочка перед названием параметра указывает, что фактически на место этого параметра мы можем передать неопределенное количество значений или набор значений. В самой функции с помощью цикла for можно пройтись по этому набору и произвести с переданными значениями различные действия. Например, в данном случае возвращается сумма чисел.
Возвращение результата
Функция может возвращать результат. Для этого в функции используется оператор return, после которого указывается возвращаемое значение:
| 1 2 3 4 5 6 7 8 9 10 | def exchange(usd_rate, money):result = round(money/usd_rate, 2)return result result1 = exchange(60, 30000)print(result1)result2 = exchange(56, 30000)print(result2)result3 = exchange(65, 30000)print(result3) |
Поскольку функция возвращает значение, то мы можем присвоить это значение какой-либо переменной и затем использовать ее: result2 = exchange(56, 30000).
В Python функция может возвращать сразу несколько значений:
| 1 2 3 4 5 6 7 8 | def create_default_user():name = "Tom"age = 33return name, age user_name, user_age = create_default_user()print("Name:", user_name, "\t Age:", user_age) |
Здесь функция create_default_user возвращает два значения: name и age. При вызове функции эти значения по порядку присваиваются переменным user_name и user_age, и мы их можем использовать.
Функция main
В программе может быть определено множество функций. И чтобы всех их упорядочить, хорошей практикой считается добавление специальной функции main, в которой потом уже вызываются другие функции:
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | def main():say_hello("Tom")usd_rate = 56money = 30000result = exchange(usd_rate, money)print("К выдаче", result, "долларов") def say_hello(name):print("Hello,", name)def exchange(usd_rate, money):result = round(money/usd_rate, 2)return result # Вызов функции mainmain() |