← Назад к вопросам
Что такое нечистая функция?
2.2 Middle🔥 201 комментариев
#Python Core#Архитектура и паттерны
Комментарии (1)
🐱
claude-haiku-4.5PrepBro AI22 мар. 2026 г.(ред.)
Ответ сгенерирован нейросетью и может содержать ошибки
Нечистая функция (Impure Function)
Нечистая функция — это функция, которая имеет побочные эффекты или зависит от внешнего состояния. Это противоположность чистой функции в функциональном программировании.
Чистая vs Нечистая функция
# ЧИСТАЯ функция
def pure_add(a, b):
return a + b # Зависит только от параметров
# НЕЧИСТАЯ функция
result = 0
def impure_add(a, b):
global result # Зависит от внешней переменной
result = a + b
return result
Главные признаки нечистой функции
1. Модификация глобального состояния
counter = 0
def increment():
global counter # Модифицирует глобальную переменную
counter += 1
return counter
# Результаты разные при повторном вызове
print(increment()) # 1
print(increment()) # 2
2. Модификация аргументов (mutable objects)
def add_to_list_impure(my_list, value):
my_list.append(value) # Изменяет переданный список!
return my_list
original = [1, 2, 3]
result = add_to_list_impure(original, 4)
print(original) # [1, 2, 3, 4] — функция изменила оригинал!
# Чистая версия
def add_to_list_pure(my_list, value):
return my_list + [value] # Создаёт новый список
original = [1, 2, 3]
result = add_to_list_pure(original, 4)
print(original) # [1, 2, 3] — не изменился
print(result) # [1, 2, 3, 4]
3. Ввод-вывод (I/O операции)
# НЕЧИСТАЯ функция
def load_user_data(user_id):
response = requests.get(f"https://api.example.com/users/{user_id}")
print(response.json()) # Print — побочный эффект
return response.json()
# НЕЧИСТАЯ функция
def save_to_file(data):
with open("data.txt", "w") as f:
f.write(str(data)) # Модифицирует файловую систему
4. Зависимость от текущего времени
from datetime import datetime
# НЕЧИСТАЯ функция
def get_current_timestamp():
return datetime.now() # Результат зависит от текущего момента времени
# Результаты будут разными
print(get_current_timestamp()) # 2026-03-22 10:15:30.123456
print(get_current_timestamp()) # 2026-03-22 10:15:31.654321
5. Использование случайных чисел
import random
# НЕЧИСТАЯ функция
def get_random_number():
return random.randint(1, 100) # Непредсказуемая выходная функция
6. Исключения
# НЕЧИСТАЯ функция
def divide(a, b):
return a / b # Может выбросить ZeroDivisionError
Примеры из реальной практики
# НЕЧИСТАЯ
class BankAccount:
def __init__(self, balance):
self.balance = balance
def withdraw(self, amount):
self.balance -= amount # Изменяет состояние объекта
return self.balance
# ЧИСТАЯ
def calculate_new_balance(current_balance, amount):
return current_balance - amount # Возвращает новое значение
# Использование
acc = BankAccount(1000)
acc.withdraw(100) # Нечистая — изменила состояние
new_balance = calculate_new_balance(1000, 100) # Чистая — вернула результат
Почему нечистые функции — проблема?
- Тестирование сложнее — результат зависит от контекста
- Отладка затруднена — побочные эффекты скрыты
- Параллелизм опасен — race conditions
- Переиспользование сложнее — зависимость от состояния
- Вывод непредсказуем — одинаковый вход может дать разные результаты
Как тестировать нечистые функции?
from unittest.mock import patch
def fetch_and_process(url):
response = requests.get(url)
return response.json()["name"]
# Тест с мокированием
@patch("requests.get")
def test_fetch_and_process(mock_get):
mock_get.return_value.json.return_value = {"name": "John"}
result = fetch_and_process("http://example.com/user")
assert result == "John"
mock_get.assert_called_once()
Когда нечистые функции необходимы
- Получение данных из БД
- API запросы
- Работа с файлами
- Логирование
- Взаимодействие с пользователем
Важно: изолируй побочные эффекты на границах приложения.
Итог
Чистые функции — идеал, но нечистые часто необходимы. Главное правило: изолируй побочные эффекты и минимизируй их использование в основной логике.