Три способа думать о коде
Код как последовательность шагов
data = [1, 2, None, 4]
result = []
i = 0
while i < len(data):
if data[i] == None:
j = 0
while j < len(result):
result[j] = result[j] * 2
j += 1
else:
result.append(data[i])
i += 1
def clean_data(data):
return [x for x in data if x is not None]
def double_list(lst):
return [x * 2 for x in lst]
# Последовательность действий
clean = clean_data(raw_data)
doubled = double_list(clean)
🔹 Убрал goto и вложенные циклы
🔹 Читается сверху вниз
Функции как математические выражения
results = []
def normalize(data):
total = sum(data)
for i in range(len(data)):
data[i] /= total # меняет оригинал!
results.append(total) # глобальное изменение
return data
def normalize(data):
total = sum(data)
return [x / total for x in data], total
# Никаких side effects
normalized, total = normalize([1, 2, 3])
🔹 Один ввод → один вывод
🔹 Нет изменений внешнего мира
# map, filter, reduce
norm = list(map(lambda x: x / total, data))
# или через списковые включения
norm = [x / total for x in data]
Чистота помогает воспроизводимости
Код как взаимодействие объектов
def user_create(name, email):
return {'name': name, 'email': email}
def user_validate(user):
return '@' in user['email']
def user_save(user, db):
db.insert(user)
class User:
def __init__(self, name, email):
self.name = name
self.email = email
def is_valid(self):
return '@' in self.email
def save(self, db):
if self.is_valid():
db.insert(self.__dict__)
🔹 Данные + поведение вместе
| Задача | Парадигма |
|---|---|
| ETL, обработка данных | Функциональная |
| Скрипт с шагами | Структурная |
| API, сервисы, модели | ООП |