Работа с функциями в Python
Основные понятия и синтаксис функций
Функция в Python - это именованный блок кода, который принимает аргументы, выполняет действия и может возвращать результат. Объявление начинается с ключевого слова def, после которого указывается имя, круглые скобки и двоеточие. Тело функции записывается с отступом.
def greet(name):
return f"Привет, {name}!"
print(greet("Анна"))атрибуты класса python (атрибуты классов и объектов в python)
Привет, Анна!
библиотека классов python (библиотека классов в python)
Здесь greet принимает один параметр name и возвращает строку. Вызов функции выполняется с передачей аргумента.
Как указать аргумент со значением по умолчанию?
def power(base, exp=2):
return base ** exp
print(power(3)) # 9
print(power(2, 4)) # 16
метод объекта python (методы объектов в python)
Параметры со значениями по умолчанию должны следовать после обязательных. Если аргумент не передан, используется значение по умолчанию.
Типичная ошибка:
Изменяемый объект в качестве значения по умолчанию (например, список) сохраняет своё состояние между вызовами. Пример:
def add_item(item, lst=[]):
lst.append(item)
return lst
print(add_item(1)) # [1]
print(add_item(2)) # [1, 2] (ожидалось [2])метод call python (метод __call__ в python)
Исправление: использовать None и создавать новый список внутри функции.
Как передать произвольное количество аргументов?
def sum_all(*args):
return sum(args)
print(sum_all(1, 2, 3, 4)) # 10
def print_kwargs(**kwargs):
for key, value in kwargs.items():
print(f"{key}: {value}")
print_kwargs(name="Иван", age=30)Python структура объекта (структура объекта в python)
*args собирает позиционные аргументы в кортеж, **kwargs - именованные в словарь. Имена могут быть любыми, но звёздочка обязательна.
Ошибка: передача именованного аргумента без звёздочки при распаковке словаря. Правильный вызов: func(**{'a':1}).
Как вернуть несколько значений?
def min_max(numbers):
return min(numbers), max(numbers)
minimum, maximum = min_max([4, 2, 9, 1])
print(minimum, maximum) # 1 9Python создание объектов (создание объектов в python)
Функция возвращает кортеж, который можно распаковать в переменные.
Как создать анонимную функцию?
double = lambda x: x * 2
print(double(5)) # 10
# Использование с filter
numbers = [1, 2, 3, 4, 5]
even = list(filter(lambda x: x % 2 == 0, numbers))
print(even) # [2, 4]Self object python (объект self в python)
Лямбда-функции - это однострочные выражения, возвращающие результат. Они удобны для кратковременного использования.
Как добавить документацию к функции?
def factorial(n):
"""Вычисляет факториал числа n (n >= 0)."""
if n == 0:
return 1
return n * factorial(n-1)
help(factorial)Строка документации (docstring) записывается сразу после заголовка функции. Её можно прочитать через help() или атрибут __doc__.
Расширенные примеры использования функций
Ниже приведены примеры, демонстрирующие нестандартные возможности функций в Python.
Рекурсивная функция (факториал)
def factorial(n):
if n == 0:
return 1
return n * factorial(n - 1)
print(factorial(5))120
Функция вызывает саму себя, постепенно уменьшая аргумент. Важно задать условие выхода, иначе возникнет бесконечная рекурсия и превышение глубины стека.
Декоратор для логирования
def log_decorator(func):
def wrapper(*args, **kwargs):
print(f"Вызов {func.__name__} с аргументами {args}")
result = func(*args, **kwargs)
print(f"Результат: {result}")
return result
return wrapper
@log_decorator
def add(a, b):
return a + b
add(3, 5)Вызов add с аргументами (3, 5) Результат: 8
Декоратор изменяет поведение функции, не меняя её код. Здесь log_decorator оборачивает вызов в логирование.
Функция-генератор (yield)
def fibonacci(limit):
a, b = 0, 1
while a < limit:
yield a
a, b = b, a + b
for num in fibonacci(10):
print(num, end=' ')0 1 1 2 3 5 8
Генератор возвращает последовательность значений по одному, экономя память. yield приостанавливает выполнение, сохраняя состояние.
Функция высшего порядка (map)
words = ['hello', 'world', 'python']
upper_words = list(map(str.upper, words))
print(upper_words)['HELLO', 'WORLD', 'PYTHON']
map применяет функцию к каждому элементу итерируемого объекта. Результат преобразуется в список.
Замыкание (closure)
def make_multiplier(n):
def multiplier(x):
return x * n
return multiplier
double = make_multiplier(2)
triple = make_multiplier(3)
print(double(5)) # 10
print(triple(5)) # 15Внутренняя функция multiplier запоминает значение n из внешней области видимости. Замыкание используется для создания функций с предустановленными параметрами.
Частичное применение (functools.partial)
from functools import partial
def power(base, exp):
return base ** exp
square = partial(power, exp=2)
cube = partial(power, exp=3)
print(square(4)) # 16
print(cube(2)) # 8partial фиксирует часть аргументов, создавая новую функцию с меньшим числом параметров.
Кэширование результатов (lru_cache)
from functools import lru_cache
@lru_cache(maxsize=None)
def fib(n):
if n < 2:
return n
return fib(n-1) + fib(n-2)
print(fib(35)) # 9227465Декоратор lru_cache запоминает результаты вызовов функции, ускоряя повторные вычисления. Особенно полезен для рекурсивных алгоритмов.
Аннотации типов
def greet(name: str, age: int) -> str:
return f"{name} is {age} years old"
print(greet("Alice", 30))Alice is 30 years old
Аннотации не влияют на выполнение, но улучшают читаемость и могут использоваться статическими анализаторами.
Функция с произвольным числом именованных аргументов и их валидация
def create_user(**kwargs):
required = ['name', 'email']
for key in required:
if key not in kwargs:
raise ValueError(f"Отсутствует обязательный параметр: {key}")
return kwargs
print(create_user(name='Иван', email='ivan@example.com')){'name': 'Иван', 'email': 'ivan@example.com'}Функция проверяет наличие обязательных ключей в словаре и вызывает исключение при их отсутствии.