Функции: часть 2
@Pycoders
Аннотация принимаемых и возвращаемых типов
def add(a, b):
return a + b
Выше мы не указывали явно, какого типа параметры функция ожидает, потому что Python - это язык с динамической типизацией. Но, например, в языке C типы аннотируются, т.е. явно указывается, какого типа должен быть параметр функции и какого типа возвращаемые значения. В Python последних версий появилась возможность аннотировать типы, и делается это с помощью двоеточия в случае параметров, а стрелочкой указывают тип возвращаемого значения. Однако, если мы передадим в функцию параметры других типов, код все равно выполнится, потому что Python - это динамический язык, и аннотация типов призвана лишь помочь программисту или его IDE отловить какието ошибки.
def add(a: int, b: int) -> int:
return a + b
print(add(10, 15)) # 25
print(add('still', 'works')) # 'still works'
Принцип передачи аргументов
Во многих других языках программирования значения параметра передаются в функцию либо по ссылке, либо по значению (и между двумя этими случаями проводится строгая граница). В Python каждая переменная является связью имени с объектом в памяти, и именно эта ссылка на объект передается в функцию. Таким образом, если мы передадим в функцию список и в ходе выполнения функции изменим его, этот список измениться глобально:
def extender(source_list, extend_list):
source_list.extend(extend_list)
values = [1, 2, 3]
extender(values, [4, 5, 6])
print(values)
# Output: [1, 2, 3, 4, 5, 6]
Однако изменение глобальных переменных внутри функции является плохим тоном, потому что часто бывает не очевидно, какие глобальные объекты как изменяются в каких функциях. В таких ситуациях советуют использовать возвращаемые значения.
Типы аргументов
Можно ставить дефолтные значения аргуменов, поэтому при вызове функций можно опускать некоторые параметры функции. Такие аргументы называют необязательными. Значения по умолчанию задаются через знак равно прямо при создании функции.
def add(a, b, c=0):
return a + b + c
print(add(2, 3)) # 5
print(add(2, 3, 5)) # 10
Также есть возможность передавать значения не по позициями, а по именам переменных.
def add(a, b):
return a - b
print(add(b=2, a=3)) # 1
В итоге получается, что функция может принимать произвольное количество аргументов или не принимать их вовсе. Существуют функции с произвольным числом аргументов, функции с позиционными и именованными аргументами, обязательными и необязательными.