Проблема: написал код расчёта скидки, нужен в 10 местах — копируешь 10 раз. Нашёл ошибку — исправляешь в 10 местах.
Решение: функция — именованный блок кода, который вызывают много раз.
Создание функции
def имя_функции(параметры):
код
return результат # опционально
def— ключевое слово- Двоеточие
:обязательно - Тело функции — с отступом
def say_hello():
print("Привет!")
print("Как дела?")
say_hello() # Привет! Как дела?
say_hello() # можно вызывать сколько угодно раз
Параметры и аргументы
Параметр — имя в определении функции. Аргумент — значение при вызове.
Один или несколько параметров
def greet(name):
print(f"Привет, {name}!")
greet("Анна") # Привет, Анна!
greet("Боб") # Привет, Боб!
def introduce(name, age, city):
print(f"{name}, {age} лет, из {city}")
introduce("Анна", 16, "Москва") # Анна, 16 лет, из Москва
Параметры по умолчанию
def greet(name="Гость"):
print(f"Привет, {name}!")
greet() # Привет, Гость!
greet("Анна") # Привет, Анна!
Именованные аргументы (keyword arguments)
def create_profile(name, age, city):
print(f"{name}, {age}, {city}")
create_profile(age=16, city="Москва", name="Анна") # порядок не важен
Return: возврат значения
# Без return — функция возвращает None
def add_print(a, b):
print(a + b)
result = add_print(5, 3) # Выведет 8
print(result) # None ❌
# С return — возвращает значение для использования
def add(a, b):
return a + b
result = add(5, 3) # result = 8 ✅
print(result) # 8
return также останавливает выполнение функции:
def check_age(age):
if age < 18:
return "Несовершеннолетний" # выход здесь
return "Взрослый"
Несколько возвращаемых значений
def get_stats(numbers):
return min(numbers), max(numbers), sum(numbers) / len(numbers)
low, high, avg = get_stats([4, 7, 2, 9, 1])
print(low, high, avg) # 1 9 4.6
Область видимости (scope)
Локальные переменные — существуют только внутри функции:
def test():
x = 10
print(x) # 10
test()
print(x) # ❌ NameError: x не существует!
Глобальные переменные — созданы вне функций, читаются везде:
x = 10
def test():
print(x) # читает глобальную
test() # 10
Чтобы изменить глобальную внутри функции — нужно global:
counter = 0
def increment():
global counter
counter += 1
increment()
print(counter) # 1
Лучше избегать global — передавай значения через параметры и return:
# ❌ С global
score = 0
def add_points(points):
global score
score += points
# ✅ Через параметры
def add_points(current_score, points):
return current_score + points
score = add_points(0, 10) # 10
score = add_points(score, 5) # 15
Практический пример: калькулятор
def calculate(a, b, operation):
if operation == "+":
return a + b
elif operation == "-":
return a - b
elif operation == "*":
return a * b
elif operation == "/":
if b != 0:
return a / b
return "Ошибка: деление на ноль"
return "Неизвестная операция"
print(calculate(10, 5, "+")) # 15
print(calculate(10, 5, "/")) # 2.0
print(calculate(10, 0, "/")) # Ошибка: деление на ноль
print(calculate(10, 5, "?")) # Неизвестная операция
Docstrings
Кратко документируй функции тройными кавычками:
def calculate_area(width, height):
"""Вычисляет площадь прямоугольника. Возвращает float."""
return width * height
help(calculate_area) # показать документацию
Лучшие практики
1. Именуй функции глаголами:
# ✅ Хорошо
def calculate_total(): ...
def validate_password(): ...
def send_email(): ...
# ❌ Плохо
def func1(): ...
def x(): ...
2. Одна функция — одна задача. Если функция делает 5 вещей, раздели её на 5 функций.
3. Используй return вместо print — результат можно будет использовать в коде:
# ❌ Только печатает, нельзя использовать результат
def calculate(a, b):
print(a + b)
# ✅ Возвращает значение
def calculate(a, b):
return a + b
total = calculate(5, 3)
if total > 10:
print("Больше 10")
Частые ошибки
1. Забыл двоеточие или отступ:
def greet() # ❌ нет ':'
print("Hi") # ❌ нет отступа
def greet(): # ✅
print("Hi")
2. Не вызвал функцию (нет скобок):
greet # ❌ это объект функции, ничего не выполняется
greet() # ✅
💬 Комментарии (0)
Комментариев пока нет
Станьте первым, кто поделится мнением об этой статье!