Определение функций с помощью def
Ключевое слово 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)) # 100Python первая программа (первая программа на 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
Декоратор принимает любые комбинации аргументов и передаёт их исходной функции. Это универсальный способ логирования.