Определение функций с помощью def

Раздел: Python -> Основы синтаксиса Python

Ключевое слово def в Python

Ключевое слово def используется для объявления функций в Python. Функция - это именованный блок кода, который можно многократно вызывать. Определение функции начинается с def, после которого следует имя функции, круглые скобки с параметрами (если они есть) и двоеточие. Тело функции пишется с отступом.

Основной способ объявления функции

Как объявить простейшую функцию?


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

hello()  # Вызов функции

Python ввод слов (ввод слов с клавиатуры в python)

После ключевого слова def указывается имя hello, затем пустые скобки и двоеточие. Тело функции - строка с вызовом print. При вызове hello() выполняется код внутри неё.

Как передать параметры в функцию?


def greet(name):
    print(f"Привет, {name}!")

greet("Анна")  # Вывод: Привет, Анна!

ключевое слово def в python (ключевое слово def в python)

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

Варианты определения функций

Как задать значения параметров по умолчанию?


def power(base, exponent=2):
    return base ** exponent

print(power(3))      # 9 (3 в квадрате)
print(power(3, 3))   # 27 (3 в кубе)

команды в программе python (команды в программе python)

Аргумент exponent имеет значение по умолчанию 2. Если при вызове его не указать, используется значение по умолчанию.

Как использовать позиционные и именованные аргументы?


def describe_pet(pet_name, animal_type='dog'):
    print(f"У меня есть {animal_type} по имени {pet_name}.")

describe_pet('Бобик')                    # позиционный
describe_pet(pet_name='Мурка', animal_type='cat')  # именованные
describe_pet('Рекс', 'собака')           # позиционные

типы данных python dict (тип данных dict в python)

Именованные аргументы записываются в формате ключ=значение. Их порядок при вызове не важен, но имена должны совпадать с параметрами функции.

Как принять произвольное количество аргументов?


def sum_all(*args):
    total = 0
    for num in args:
        total += num
    return total

print(sum_all(1, 2, 3))       # 6
print(sum_all(10, 20, 30, 40)) # 100

Python первая программа (первая программа на python)

Одна звёздочка *args собирает все переданные позиционные аргументы в кортеж. Для именованных аргументов используется две звёздочки **kwargs.


def print_info(**kwargs):
    for key, value in kwargs.items():
        print(f"{key}: {value}")

print_info(name='Ольга', age=30, city='Москва')

Python программа (программа на языке python)

**kwargs собирает именованные аргументы в словарь.

Как вернуть одно или несколько значений?


def min_max(numbers):
    return min(numbers), max(numbers)

result = min_max([3, 1, 7, 2])
print(result)  # (1, 7)

как сделать переменную в python (создание переменной в python)

Функция может возвращать кортеж из нескольких значений. Присваивание result получает кортеж, который можно распаковать.

Типичные проблемы и их решение

Почему не стоит использовать изменяемые объекты как значения по умолчанию?


def append_to_list(value, my_list=[]):
    my_list.append(value)
    return my_list

print(append_to_list(1))  # [1]
print(append_to_list(2))  # [1, 2]  (неожиданно!)

как сделать строку python (создание строки в python)

Значение по умолчанию вычисляется только один раз при определении функции. Изменяемый объект (список) сохраняется между вызовами, что приводит к накоплению элементов. Решение - использовать None и создавать новый список внутри функции.


def append_to_list_fixed(value, my_list=None):
    if my_list is None:
        my_list = []
    my_list.append(value)
    return my_list

print(append_to_list_fixed(1))  # [1]
print(append_to_list_fixed(2))  # [2]

как сделать цикл в python (создание цикла в python)

Как правильно работать с глобальными переменными?


counter = 0

def increment():
    global counter
    counter += 1

increment()
print(counter)  # 1

слова в python в переменную (сохранение слов в переменную python)

Без global внутри функции будет создана локальная переменная. Для изменения глобальной нужно объявить её как global. Однако лучше избегать глобальных переменных и передавать их через параметры.

Как ограничить глубину рекурсии?

Рекурсивные функции могут превысить лимит рекурсии (по умолчанию 1000). Например:


def factorial(n):
    if n == 0:
        return 1
    return n * factorial(n - 1)

# print(factorial(2000))  # RecursionError: maximum recursion depth exceeded

Решение - использовать итеративный подход или увеличить лимит через sys.setrecursionlimit(), но это не рекомендуется для глубоких рекурсий из-за риска переполнения стека.

Расширенные примеры использования def

Пример 1. Функция с аннотациями типов и документацией

Пример

def calculate_area(radius: float) -> float:
    """Вычисляет площадь круга по заданному радиусу."""
    import math
    return math.pi * radius ** 2

area = calculate_area(5.0)
print(area)  # 78.53981633974483
78.53981633974483

Аннотации типов указывают ожидаемый тип параметра и возвращаемого значения. Они не влияют на выполнение, но улучшают читаемость и помогают инструментам проверки кода.

Пример 2. Вложенные функции и замыкания

Пример

def multiplier(factor):
    def multiply(x):
        return x * factor
    return multiply

double = multiplier(2)
triple = multiplier(3)

print(double(5))  # 10
print(triple(5))  # 15
10
15

Внутренняя функция multiply запоминает значение factor из внешней области видимости. Так создаются функции с настраиваемым поведением.

Пример 3. Простой декоратор

Пример

def decorator(func):
    def wrapper(*args, **kwargs):
        print("Вызов функции:", func.__name__)
        result = func(*args, **kwargs)
        print("Функция завершена")
        return result
    return wrapper

@decorator
def add(a, b):
    return a + b

print(add(3, 4))
Вызов функции: add
Функция завершена
7

Декоратор decorator оборачивает функцию add, добавляя дополнительное поведение до и после вызова. Синтаксис @decorator эквивалентен add = decorator(add).

Пример 4. Рекурсивный обход дерева

Пример

def list_files(directory):
    import os
    files = []
    for entry in os.scandir(directory):
        if entry.is_file():
            files.append(entry.path)
        elif entry.is_dir():
            files.extend(list_files(entry.path))
    return files

# Пример вызова (раскомментировать для проверки):
# print(list_files('/some/path'))
(результат будет списком путей к файлам)

Функция рекурсивно обходит все поддиректории. Глубина рекурсии ограничена, поэтому для очень глубоких структур лучше использовать итеративный подход.

Пример 5. Функция с *args и **kwargs в декораторе

Пример

def log_call(func):
    def wrapper(*args, **kwargs):
        print(f"Вызвана {func.__name__} с args={args}, kwargs={kwargs}")
        return func(*args, **kwargs)
    return wrapper

@log_call
def multiply(a, b, c=1):
    return a * b * c

print(multiply(2, 3, c=4))
Вызвана multiply с args=(2, 3), kwargs={'c': 4}
24

Декоратор принимает любые комбинации аргументов и передаёт их исходной функции. Это универсальный способ логирования.

Ключевое слово def в Python - comments

En
ключевое слово def в python (python)