Функции в Python: Создание переиспользуемых модулей кода
Определение функции
Функция — это блок организованного, переиспользуемого кода, выполняющий единое связанное действие. Функции обеспечивают модульность приложения и высокую степень повторного использования кода.
Python имеет много встроенных функций (print() и др.), но можно создавать свои — пользовательские функции.
Синтаксис определения
Правила определения функции:
- Блок функции начинается с ключевого слова def, за которым следуют имя функции и круглые скобки ().
- Входные параметры (аргументы) размещаются внутри скобок. Можно определять параметры внутри.
- Первый оператор функции может быть опциональной строкой документации — docstring.
- Тело функции начинается с двоеточия : и выделяется отступом.
- Оператор return [expression] завершает функцию, опционально возвращая значение. return без аргументов эквивалентно return None.
def functionname(parameters):
"function_docstring"
function_suite
return [expression]
По умолчанию параметры позиционные — передавать нужно в том же порядке, в каком определены.
Пример
Функция, принимающая строку и печатающая её:
def printme(str):
"This prints a passed string into this function"
print str
return
Вызов функции
Определение только задаёт имя, параметры и структуру. Для выполнения нужно вызвать функцию из другой функции или прямо из интерпретатора.
Live Demo#!/usr/bin/python
def printme(str):
"This prints a passed string into this function"
print str
return
printme("I'm first call to user defined function!")
printme("Again second call to the same function")
Результат:
I'm first call to user defined function! Again second call to the same function
Передача по ссылке vs по значению
Все параметры в Python передаются по ссылке. Если внутри функции изменить объект, на который ссылается параметр, изменение отразится в вызывающем коде.
Live Demo#!/usr/bin/python
def changeme(mylist):
"This changes a passed list into this function"
mylist.append([1,2,3,4])
print "Values inside the function: ", mylist
return
mylist = [10,20,30]
changeme(mylist)
print "Values outside the function: ", mylist
Здесь мы сохраняем ссылку на переданный объект и добавляем значения в тот же объект. Результат:
Values inside the function: [10, 20, 30, [1, 2, 3, 4]] Values outside the function: [10, 20, 30, [1, 2, 3, 4]]
Другой пример — когда ссылка перезаписывается внутри функции:
Live Demo#!/usr/bin/python
def changeme(mylist):
"This changes a passed list into this function"
mylist = [1,2,3,4] # Новая ссылка в mylist
print "Values inside the function: ", mylist
return
mylist = [10,20,30]
changeme(mylist)
print "Values outside the function: ", mylist
Параметр mylist локален для функции. Изменение mylist внутри не влияет на внешний mylist. Функция ничего не делает с оригиналом. Результат:
Values inside the function: [1, 2, 3, 4] Values outside the function: [10, 20, 30]
Аргументы функции
Функцию можно вызывать с четырьмя типами формальных аргументов:
- Обязательные (required)
- Именованные (keyword)
- Со значениями по умолчанию (default)
- Переменной длины (variable-length)
Обязательные аргументы
Передаются в правильном позиционном порядке. Число аргументов при вызове должно точно совпадать с определением.
Для вызова printme() обязательно передать один аргумент, иначе синтаксическая ошибка:
Live Demo#!/usr/bin/python
def printme(str):
"This prints a passed string into this function"
print str
return
printme()
Результат:
Traceback (most recent call last): File "test.py", line 11, inprintme() TypeError: printme() takes exactly 1 argument (0 given)
Именованные аргументы
Связаны с вызовом функции. При использовании вызывающий идентифицирует аргументы по именам параметров.
Это позволяет пропускать аргументы или менять их порядок, так как интерпретатор использует ключевые слова для сопоставления значений с параметрами.
Live Demo#!/usr/bin/python
def printme(str):
"This prints a passed string into this function"
print str
return
printme(str = "My string")
Результат:
My string
Порядок параметров не важен:
Live Demo#!/usr/bin/python
def printinfo(name, age):
"This prints a passed info into this function"
print "Name: ", name
print "Age ", age
return
printinfo(age=50, name="miki")
Результат:
Name: miki Age 50
Аргументы со значениями по умолчанию
Аргумент по умолчанию принимает значение, если в вызове не передано значение для него. Пример — печать возраста по умолчанию:
Live Demo#!/usr/bin/python
def printinfo(name, age = 35):
"This prints a passed info into this function"
print "Name: ", name
print "Age ", age
return
printinfo(age=50, name="miki")
printinfo(name="miki")
Результат:
Name: miki Age 50 Name: miki Age 35
Аргументы переменной длины
Иногда нужно обработать больше аргументов, чем указано в определении. Это variable-length arguments — не именованы в определении, в отличие от обязательных и дефолтных.
Синтаксис для неключевых переменных аргументов:
def functionname([formal_args,] *var_args_tuple):
"function_docstring"
function_suite
return [expression]
Звёздочка * перед именем переменной, содержащей значения всех неключевых переменных аргументов. Кортеж пуст, если дополнительные аргументы не переданы. Пример:
Live Demo#!/usr/bin/python
def printinfo(arg1, *vartuple):
"This prints a variable passed arguments"
print "Output is: "
print arg1
for var in vartuple:
print var
return
printinfo(10)
printinfo(70, 60, 50)
Результат:
Output is: 10 Output is: 70 60 50
Анонимные функции (lambda)
Называются анонимными, так как не объявляются через def. Ключевое слово lambda создаёт маленькие анонимные функции.
- Lambda может принимать любое число аргументов, но возвращает только одно значение в виде выражения. Не может содержать команд или множественных выражений.
- Анонимная функция не может быть прямым вызовом print, так как lambda требует выражение.
- Lambda-функции имеют своё локальное пространство имён и не имеют доступа к переменным, кроме параметров и глобальных.
- Хотя lambda выглядит как однострочная версия функции, она не эквивалентна inline-операторам в C/C++, цель которых — избежать накладных расходов на стек вызовов для производительности.
Синтаксис lambda
lambda [arg1 [,arg2,.....argn]]: expression
Пример работы lambda:
Live Demo#!/usr/bin/python sum = lambda arg1, arg2: arg1 + arg2 print "Value of total : ", sum(10, 20) print "Value of total : ", sum(20, 20)
Результат:
Value of total : 30 Value of total : 40
Оператор return
return [expression] завершает функцию, опционально возвращая значение. return без аргументов = return None.
Пример возврата значения:
Live Demo#!/usr/bin/python
def sum(arg1, arg2):
total = arg1 + arg2
print "Inside the function : ", total
return total
total = sum(10, 20)
print "Outside the function : ", total
Результат:
Inside the function : 30 Outside the function : 30
Область видимости переменных
Не все переменные доступны во всех местах программы. Это зависит от места объявления.
Область видимости (scope) определяет часть программы, где доступен идентификатор. Два основных типа:
- Глобальные переменные
- Локальные переменные
Глобальные vs локальные переменные
Переменные, определённые внутри функции, имеют локальную область видимости. Определённые снаружи — глобальную.
Локальные переменные доступны только внутри своей функции. Глобальные — во всей программе всеми функциями. При вызове функции локальные переменные входят в область видимости.
Live Demo#!/usr/bin/python
total = 0 # глобальная переменная
def sum(arg1, arg2):
total = arg1 + arg2 # здесь total — локальная
print "Inside the function local total : ", total
return total
sum(10, 20)
print "Outside the function global total : ", total
Результат:
Inside the function local total : 30 Outside the function global total : 0
Python
- Lambda-функции в Python: практическое руководство по анонимным функциям
- Генераторы в Python: эффективная итерация и продвинутые сценарии
- Замыкания в Python: как вложенные функции захватывают переменные
- Декораторы в Python: улучшайте функции экспертными техниками
- 10 ключевых функций Insight для оптимизации FDM-печати на Stratasys
- Функции в C++: подробное объяснение с практическими примерами кода
- Мастерство метода strip() в Python: подробное руководство и практические примеры
- Освоение лямбда-функций Python: практические примеры и лучшие практики
- Функция abs() в Python: вычисление абсолютных значений для чисел и комплексных чисел
- Функция round() в Python: подробное объяснение с практическими примерами