Функции

Функции в Python: от основ до продвинутого использования

Что такое функции в Python и зачем они нужны

Функция в Python — это блок организованного и повторно используемого кода, разработанный для выполнения определенной задачи. Представьте себе функцию как мини-программу внутри вашей программы. Один раз написав функцию, вы можете вызывать ее многократно в разных частях кода.

Основные причины использовать функции:

  • Повторное использование кода — вместо дублирования, вы пишете код один раз и используете многократно
  • Модульность — разбиение сложных задач на управляемые подзадачи
  • Улучшение читаемости — отделение логических блоков делает код более понятным
  • Тестируемость — небольшие функции проще тестировать и отлаживать
  • Абстракция — сокрытие сложной логики за простым интерфейсом
Аспект Код без функций Код с функциями
Объем кода Значительный (с повторениями) Компактный, без дублирования
Внесение изменений Необходимо менять в каждом месте Изменение только в одном месте
Читаемость Сложно понять общую структуру Ясная иерархия и назначение блоков
Командная работа Сложно распределять задачи Легко делить работу по функциям
Отладка Трудоёмкий поиск ошибок Локализованный поиск проблем

Без функций вам пришлось бы писать одни и те же инструкции снова и снова. Например, если вы хотите вычислить квадрат числа в нескольких местах программы, вместо повторения операции умножения числа на само себя каждый раз, вы можете создать функцию square(x) и вызывать её когда нужно. 🧮

Синтаксис создания функций и передача аргументов

Синтаксис для создания функции в Python прост и интуитивен. Каждая функция начинается с ключевого слова def, за которым следует имя функции и круглые скобки. В скобках можно указать параметры (или аргументы), которые функция принимает. Определение функции завершается двоеточием, после которого следует тело функции с отступом.

def имя_функции(параметр1, параметр2, ...):
    # тело функции
    # здесь выполняются действия
    return результат  # необязательно

Рассмотрим примеры создания функций с разными типами аргументов:

Функция без аргументов

def приветствие():
    print("Привет, мир!")

приветствие()  # Выведет: Привет, мир!

Функция с позиционными аргументами

def сумма(a, b):
    return a + b

результат = сумма(5, 3)
print(результат)  # 8

Функция с именованными аргументами и значениями по умолчанию

def приветствие_пользователя(имя, сообщение="Привет"):
    print(f"{сообщение}, {имя}!")

приветствие_пользователя("Анна")                 # Привет, Анна!
приветствие_пользователя("Иван", "Добрый день")  # Добрый день, Иван!

Функция с произвольным числом аргументов (*args, **kwargs)

def сумма_всех(*числа):
    total = 0
    for число in числа:
        total += число
    return total

print(сумма_всех(1, 2, 3))        # 6
print(сумма_всех(1, 2, 3, 4, 5)) # 15

def инфо_пользователя(**данные):
    for ключ, значение in данные.items():
        print(f"{ключ}: {значение}")

инфо_пользователя(имя="Алексей", возраст=30, город="Москва")

При работе с функциями важен порядок аргументов: позиционные, затем именованные, затем *args, затем **kwargs. 🔄

def комплексная_функция(обязательный, опциональный=None, *args, **kwargs):
    print(f"Обязательный: {обязательный}")
    print(f"Опциональный: {опциональный}")
    print(f"args: {args}")
    print(f"kwargs: {kwargs}")

Возвращаемые значения и область видимости в функциях

Ключевое слово return возвращает результат работы функции. Если return отсутствует, функция возвращает None. Можно возвращать несколько значений в виде кортежа.

def периметр_и_площадь(длина, ширина):
    периметр = 2 * (длина + ширина)
    площадь = длина * ширина
    return периметр, площадь  # возвращает кортеж

p, s = периметр_и_площадь(4, 5)
print(f"Периметр: {p}, Площадь: {s}")

Область видимости определяет, где переменная доступна. В Python есть локальная, нелокальная (для вложенных функций), глобальная и встроенная области (правило LEGB).

глобальная = "Я глобальная"

def внешняя():
    внешняя_переменная = "Я внешняя"
    
    def внутренняя():
        локальная = "Я локальная"
        print(локальная)          # доступна
        print(внешняя_переменная) # доступна (из внешней)
        print(глобальная)         # доступна (глобальная)
    
    внутренняя()

Для изменения глобальных переменных внутри функции используют global, а для переменных из внешней функции — nonlocal.

счетчик = 0

def увеличить():
    global счетчик
    счетчик += 1
    return счетчик

Продвинутые возможности функций Python

После освоения основ, стоит познакомиться с более продвинутыми возможностями, которые делают Python гибким и мощным. 💪

Лямбда-функции

Анонимные функции, определяемые выражением. Полезны для кратковременного использования.

square = lambda x: x**2
list(map(lambda x: x**2, [1,2,3]))

Функции высшего порядка

Принимают другие функции как аргументы или возвращают их. Примеры: map, filter, reduce.

Декораторы

Модифицируют поведение функции без изменения её кода.

@timer
def my_func(): ...

Замыкания

Функции, запоминающие состояние из внешней области видимости.

Лямбда-функции

числа = [1, 5, 4, 3, 2]
отсортированные = sorted(числа, key=lambda x: x)  # [1,2,3,4,5]
четные = list(filter(lambda x: x % 2 == 0, числа)) # [4,2]

Функции высшего порядка

from functools import reduce
сумма = reduce(lambda x, y: x + y, [1,2,3,4,5])  # 15

def применить_дважды(функция, значение):
    return функция(функция(значение))
print(применить_дважды(lambda x: x*2, 3))  # 12

Декораторы

def мой_декоратор(func):
    def обертка(*args, **kwargs):
        print("Вызывается функция", func.__name__)
        результат = func(*args, **kwargs)
        print("Функция завершена")
        return результат
    return обертка

@мой_декоратор
def привет(имя):
    print(f"Привет, {имя}!")

привет("Алиса")

Замыкания и фабрики функций

def создать_счетчик():
    счет = 0
    def увеличить():
        nonlocal счет
        счет += 1
        return счет
    return увеличить

счетчик = создать_счетчик()
print(счетчик())  # 1
print(счетчик())  # 2

Практические задачи с функциями для начинающих

Практика — лучший способ закрепить теорию. Вот несколько задач разного уровня. 📝

Задача 1: Геометрические функции

import math

def площадь_круга(радиус):
    return math.pi * радиус**2

def периметр_прямоугольника(длина, ширина):
    return 2 * (длина + ширина)

print(площадь_круга(5))

Задача 2: Подсчёт гласных

def подсчет_гласных(строка):
    гласные = "аеёиоуыэюяaeiou"
    return sum(1 for символ in строка if символ.lower() in гласные)

print(подсчет_гласных("Привет, мир!"))  # 3

Задача 3: Решето Эратосфена (простые числа)

def решето_эратосфена(n):
    простые = []
    sieve = [True] * (n + 1)
    for p in range(2, n + 1):
        if sieve[p]:
            простые.append(p)
            for i in range(p * p, n + 1, p):
                sieve[i] = False
    return простые

print(решето_эратосфена(30))

Задача 4: Рекурсивный факториал

def факториал(n):
    if n <= 1:
        return 1
    return n * факториал(n - 1)

print(факториал(5))  # 120

Задача 5: Генератор паролей

import random
import string

def генератор_паролей(длина=8, цифры=True, спецсимволы=True):
    символы = string.ascii_letters
    if цифры: символы += string.digits
    if спецсимволы: символы += string.punctuation
    return ''.join(random.choice(символы) for _ in range(длина))

print(генератор_паролей(12))