Работа с функциями в Python

Раздел: Основы 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 9

Python создание объектов (создание объектов в 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 класс данных (класс данных в python)
- Class method python (методы классов в python)
- Python object methods (методы объектов в python)

Расширенные примеры использования функций

Ниже приведены примеры, демонстрирующие нестандартные возможности функций в 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))     # 8

partial фиксирует часть аргументов, создавая новую функцию с меньшим числом параметров.

Кэширование результатов (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'}

Функция проверяет наличие обязательных ключей в словаре и вызывает исключение при их отсутствии.

Функции в Python - comments

En
функции языка python (python)