← Назад к вопросам

Что такое процедурное программирование?

2.0 Middle🔥 151 комментариев
#DevOps и инфраструктура#Django

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI23 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Процедурное программирование

Процедурное программирование — это парадигма программирования, в которой программа состоит из набора процедур (функций), которые изменяют состояние данных. Это один из самых старых и популярных подходов к написанию кода.

Основная идея

Процедурное программирование центрировано на действиях (процедурах/функциях). Программа выполняет последовательность команд, которые изменяют состояние переменных. Это контрастирует с объектно-ориентированным подходом, который центрирован на объектах и их состоянии.

В процедурном подходе программа часто выглядит как список шагов: сделай это, потом то, потом то-то.

Пример: процедурный стиль

# Процедурный стиль: функции и переменные отдельно

# Данные
students = [
    {"name": "Alice", "grade": 85},
    {"name": "Bob", "grade": 92},
    {"name": "Charlie", "grade": 78},
]

# Процедуры (функции)
def calculate_average(grades):
    return sum(grades) / len(grades)

def find_top_student(students):
    return max(students, key=lambda s: s["grade"])

def print_report(students):
    grades = [s["grade"] for s in students]
    avg = calculate_average(grades)
    top = find_top_student(students)
    
    print(f"Average grade: {avg}")
    print(f"Top student: {top['name']} ({top['grade']})")
    for student in students:
        status = "Pass" if student["grade"] >= 70 else "Fail"
        print(f"{student['name']}: {student['grade']} - {status}")

# Основная программа: последовательность вызовов
print_report(students)
# Average grade: 85.0
# Top student: Bob (92)
# Alice: 85 - Pass
# Bob: 92 - Pass
# Charlie: 78 - Pass

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

Контраст с ООП

Тот же код в объектно-ориентированном стиле:

# ООП стиль: данные и методы вместе в классе

class StudentGradeTracker:
    def __init__(self):
        self.students = [
            {"name": "Alice", "grade": 85},
            {"name": "Bob", "grade": 92},
            {"name": "Charlie", "grade": 78},
        ]
    
    def calculate_average(self):
        grades = [s["grade"] for s in self.students]
        return sum(grades) / len(grades)
    
    def find_top_student(self):
        return max(self.students, key=lambda s: s["grade"])
    
    def print_report(self):
        avg = self.calculate_average()
        top = self.find_top_student()
        
        print(f"Average grade: {avg}")
        print(f"Top student: {top['name']} ({top['grade']})")
        for student in self.students:
            status = "Pass" if student["grade"] >= 70 else "Fail"
            print(f"{student['name']}: {student['grade']} - {status}")

# Использование
tracker = StudentGradeTracker()
tracker.print_report()

В ООП данные (students) и методы (calculate_average, find_top_student) находятся вместе в объекте.

Характеристики процедурного программирования

1. Разделение данных и функций

# Данные в одном месте
user_data = {"name": "John", "age": 30, "salary": 50000}

# Функции в другом месте
def give_raise(user, percentage):
    user["salary"] *= (1 + percentage)

# Вызов
give_raise(user_data, 0.1)

2. Изменение состояния через функции

accounts = {"john": 1000, "jane": 2000}

def transfer_money(from_acc, to_acc, amount):
    accounts[from_acc] -= amount
    accounts[to_acc] += amount

transfer_money("john", "jane", 500)
print(accounts)  # {'john': 500, 'jane': 2500}

3. Процедуры могут вызывать друг друга

def validate_email(email):
    return "@" in email

def validate_password(password):
    return len(password) >= 8

def register_user(email, password):
    if not validate_email(email):
        print("Invalid email")
        return False
    if not validate_password(password):
        print("Password too short")
        return False
    print(f"User {email} registered")
    return True

register_user("john@example.com", "secure123")

Известные процедурные языки

  • C — классический процедурный язык
  • Pascal — учебный процедурный язык
  • Fortran — для научных вычислений
  • BASIC — ранний язык
  • Python — многопарадигменный, но поддерживает процедурный подход

Python позволяет писать в процедурном стиле (функции) или объектно-ориентированном (классы).

Преимущества процедурного подхода

  • Простота: легче понять для новичков, просто последовательность шагов
  • Производительность: часто быстрее, чем ООП (нет overhead объектов)
  • Директность: явное лучше неявного, ясно видны все шаги
  • Подходит для простых задач: для скриптов и маленьких программ

Недостатки процедурного подхода

  • Сложность при масштабировании: большие программы становятся запутанными
  • Повторение кода: сложнее переиспользовать код
  • Глобальное состояние: функции часто зависят от глобальных переменных, что приводит к ошибкам
  • Сложность тестирования: функции часто имеют побочные эффекты
# Проблема: глобальное состояние
counter = 0

def increment():
    global counter  # зависит от глобальной переменной
    counter += 1

def get_count():
    global counter
    return counter

increment()
increment()
print(get_count())  # 2

# Сложно тестировать: счётчик общий для всех функций

Когда использовать процедурный подход

  • Скрипты: обработка файлов, автоматизация
  • Простые утилиты: конвертеры, анализаторы данных
  • Быстрый прототип: когда нужно быстро что-то написать
  • Вычисления: научные расчёты, обработка данных
  • Части ООП программы: даже в ООП используются функции
# Практический пример: обработка файла в процедурном стиле
import json

def read_data(filename):
    with open(filename, 'r') as f:
        return json.load(f)

def filter_active_users(users):
    return [u for u in users if u.get('active')]

def calculate_statistics(users):
    return {
        'total': len(users),
        'average_age': sum(u['age'] for u in users) / len(users) if users else 0
    }

def main():
    users = read_data('users.json')
    active = filter_active_users(users)
    stats = calculate_statistics(active)
    print(f"Active users: {stats['total']}, avg age: {stats['average_age']}")

main()

Заключение

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

Что такое процедурное программирование? | PrepBro