Python Шпильки
43 subscribers
1 link
Изящные приемы Python. Синтаксический сахар, фишки и элегантные решения. Для джунов и не только 🐍
Download Telegram
Channel created
Добро пожаловать в Python Шпильки! 🎯

Здесь делюсь острыми и точными приемами, которые:
• Экономят время
• Делают код изящнее
• Вызывают "Вау!" у коллег

📌 Сохраняйте полезные шпильки
💬 Обсуждаем в комментариях
🔔 Не пропустите новые фишки!

#визитка #python_шпильки
Python Шпильки pinned «Добро пожаловать в Python Шпильки! 🎯 Здесь делюсь острыми и точными приемами, которые: • Экономят время • Делают код изящнее • Вызывают "Вау!" у коллег 📌 Сохраняйте полезные шпильки 💬 Обсуждаем в комментариях 🔔 Не пропустите новые фишки! #визитка #python_шпильки»
🐍 Почему я завел этот канал?

Знакомо чувство, когда смотрите на чужой код и думаете: "Боже, как элегантно! Почему я не додумался?"

Меня зовут Михаил, я python-разработчик. Я прошел путь от многострочных костылей до изящных решений.

В этом канале я буду делиться шпильками — теми самыми приемами, которые:

· Превращают 10 строк в 2
· Делают код читаемым как проза
· Вызывают уважение коллег

Завтра: первая техническая шпилька — "Как заменить 5 if-else одной строкой".

А пока напишите в комментах: какая тема по Python вызывает у вас больше всего вопросов?

#старт #манифест #python_шпильки
1
«Вот же Пайтон!»:
🎯 Избавляемся от множества if-else


Проблема:

if status == "new":
handle_new()
elif status == "processing":
handle_processing()
elif status == "completed":
handle_completed()
# и так далее...


💡 Шпилька: Используем словарь как диспетчер функций!

handlers = {
"new": handle_new,
"processing": handle_processing,
"completed": handle_completed,
}

handler = handlers.get(status, handle_default)
handler()


🌟 Фишка: Код становится плоским, легко расширяемым и тестируемым.

#python_шпильки #паттерны

---

🚀 Что дальше?

Теперь вы знаете, как превратить громоздкие if-elif-else конструкции в изящный и масштабируемый код. Но это только начало пути к чистому Python!

В следующем выпуске «Python Шпилек»:
🎯 «Алгоритмы поиска в Python: от list.index() до бинарного поиска с примерами кода»

Мы разберем:

· Почему in и list.index() могут быть медленными на больших данных

· Как работает бинарный поиск и когда он ускоряет программу в 100+ раз

· Практические кейсы из реальных проектов

· Визуализацию сложности O(log n) vs O(n)

Не пропустите — будет так же понятно и практично!

---

💡 А какие алгоритмические задачи вызывают у вас наибольшие сложности? Пишите в комментариях — разберем в следующих выпусках!

📌 Чтобы не потерять:
Сохраните этот пост и подпишитесь на канал — завтра выйдет продолжение!

#алгоритмы_серия #python_шпильки #поиск_алгоритмы
🔍 Алгоритмы #1: Поиск в Python - от линейного до бинарного

Приветствую! В прошлом посте мы заменяли громоздкие if-else, а сегодня разберем алгоритмы поиска — основу основ в программировании.

📊 Линейный поиск: просто, но медленно

def linear_search(arr, target):
for i, item in enumerate(arr):
if item == target:
return i
return -1

# Сложность: O(n) - перебираем все элементы

Когда использовать: На небольших массивах или когда данные не отсортированы.

⚡️ Бинарный поиск: быстро, но с условием

def binary_search(arr, target):
left, right = 0, len(arr) - 1

while left <= right:
mid = (left + right) // 2
if arr[mid] == target:
return mid
elif arr[mid] < target:
left = mid + 1
else:
right = mid - 1
return -1

# Сложность: O(log n) - делим пополам на каждом шаге

Условие: Массив должен быть отсортирован!

🎯 Практический пример: поиск в списке сотрудников

employees = [
{"id": 101, "name": "Анна", "salary": 50000},
{"id": 102, "name": "Борис", "salary": 75000},
{"id": 103, "name": "Виктор", "salary": 60000}
]

# Линейный поиск по имени
def find_employee_by_name(employees, name):
for emp in employees:
if emp["name"] == name:
return emp
return None

# Сначала сортируем, потом бинарный поиск
sorted_employees = sorted(employees, key=lambda x: x["name"])


📈 Сравнение производительности

Метод 1000 элементов 1 млн элементов

target in list 0.0001s 0.1s

Бинарный поиск 0.00001s 0.0001s

Вывод: На 1 млн элементов бинарный поиск в 1000 раз быстрее!

💡 Шпилька дня: встроенные инструменты Python

# Для списков (линейный поиск)
index = sorted_list.index(target) # ValueError если нет

# Через bisect модуль (бинарный поиск)
import bisect
index = bisect.bisect_left(sorted_list, target)


🚀 Что в следующем выпуске?

«Алгоритмы #2: Сортировки — от пузырьковой до TimSort»

Разберем:

· Когда sorted() умнее ручной реализации

· Как выбрать алгоритм под вашу задачу

· Визуализацию работы разных сортировок

💬 Ваш опыт: Какой алгоритм поиска используете чаще всего? Сталкивались ли с ситуациями, где бинарный поиск спас проект?

📌 Сохраните пост, чтобы не потерять! Завтра — продолжение про сортировки.

#алгоритмы_серия #поиск #python_шпильки #сложность_алгоритмов
🚀 Важное объявление + бонус

Друзья, обнаружил технический момент: комментарии в канале работают только для новых постов (так устроен Telegram).

К сожалению, для уже опубликованных постов я не могу добавить кнопку комментариев 😔

Но чтобы исправить ситуацию, делаю два шага:

1. СЕЙЧАС: Открываю комментарии ко всем будущим постам
2. СЕЙЧАС ЖЕ: Выкладываю бонус — сборник 📊 «Шпаргалка по алгоритмической сложности Python»

Внутри Шпаргалки вы найдете:

Наглядную таблицу O(1), O(log n), O(n), O(n²) с примерами
Сравнение методов поиска — когда что использовать
Производительность операций со списками, словарями, множествами
Практические рекомендации по оптимизации кода
Визуализацию роста сложности — чтобы понимать разницу наглядно

🔗 Скачать шпаргалку: [Яндекс. Диск]

Эта шпаргалка станет вашим надежным помощником при:

· Выборе структур данных для проекта

· Оптимизации медленного кода

· Подготовке к собеседованиям

· Объяснении алгоритмических решений команде

P.S. В следующем посте уже будет активная секция комментариев — жду ваши вопросы и мнения! 💪

#бонус #алгоритмы #python_шпильки #сложность
🎯 «Алгоритмы #2: Сортировки — от пузырьковой до TimSort»

Проблема:


# Ручная реализация сортировок = велосипеды
def bubble_sort(arr):
for i in range(len(arr)):
for j in range(0, len(arr)-i-1):
if arr[j] > arr[j+1]:
arr[j], arr[j+1] = arr[j+1], arr[j]
# Сложно, медленно O(n²)


💡Шпилька: Используйте встроенную сортировку Python!

# Просто и эффективно
numbers = [5, 2, 8, 1, 9]
sorted_numbers = sorted(numbers) # [1, 2, 5, 8, 9]

# Сортировка сложных структур
users = [{"name": "Анна", "age": 25}, {"name": "Борис", "age": 30}]
sorted_users = sorted(users, key=lambda x: x["age"])


💡 Когда sorted() умнее вас:

- Определяет тип данных и выбирает оптимальный алгоритм

- Адаптируется под частично отсортированные данные (O(n) вместо O(n log n))

- Использует TimSort — гибрид Merge Sort + Insertion Sort

- Оптимизирован под кэш процессора

🎯 Выбор алгоритма за 10 секунд:

sorted(data)                    # 99% случаев
sorted(data, key=lambda x: x) # сложные объекты
data.sort() # когда можно менять исходник


📊 Визуализация работы:

Bubble Sort: 🐢 O(n²) - медленно, учебный
Quick Sort: 🚀 O(n log n) - быстро, но риск O(n²)
TimSort: 🏆 O(n) - O(n log n) - адаптивный чемпион

Бонус-шпилька: Сортировка обьектов и Сортировка по нескольким полям!

from operator import attrgetter, itemgetter

class User:
def __init__(self, name, age):
self.name = name
self.age = age

# Список объектов
users = [User("Анна", 25), User("Борис", 30), User("Виктор", 20)]

# Список словарей
users_dict = [
{"name": "Анна", "age": 25},
{"name": "Борис", "age": 30},
{"name": "Виктор", "age": 20}
]

# Сортировка объектов по атрибуту
sorted_users = sorted(users, key=attrgetter('age'))

# Сортировка словарей по ключу
sorted_dicts = sorted(users_dict, key=itemgetter('age'))

# Сортировка словарей по нескольким полям (сначала по возрасту (age), затем по имени (name))
sorted_users_in_dict = sorted(users_dict, key=itemgetter('age', 'name'))


Фишка: Python использует TimSort — гибридный алгоритм, который адаптируется под ваши данные.

Финальная шпилька:

# Всегда ваш выбор:
result = sorted(your_data, key=your_criteria)


💡 В 99% случаев sorted() умнее ручной реализации!

#python_шпильки #сортировки #алгоритмы
👍1
🎪 Распаковка в Python: Ваш секретный инструмент для изящного кода

Приветствую! Сегодня отложим алгоритмы и разберем одну из самых красивых возможностей Python — распаковку. Это тот случай, когда синтаксический сахар делает код не только слаще, но и значительно читаемее.

🚀 Базовые суперспособности

Проблема:

# Громоздкое извлечение данных
data = ["Анна", "anna@mail.com", "25", "инженер"]
name = data[0]
email = data[1]
age = data[2]
job = data[3]


💡Шпилька: Используйте распаковку!

# Изящно и понятно
name, email, age, job = data

# Обмен значений без временной переменной
a, b = b, a

# Извлечение первого и последнего
first, *middle, last = [1, 2, 3, 4, 5] # first=1, middle=[2,3,4], last=5

# Игнорируем ненужные элементы
name, _, age, _ = ["Анна", "неважно", "25", "инженер"] # name="Анна", age="25"

# Только первый элемент
first, *_ = [10, 20, 30, 40] # first=10


Бонус-шпилька: Распаковка в функциях

# Распаковка списка в аргументы
connect_to_db(*db_config)

# Распаковка словаря в аргументы
create_user(**user_data)

# Слияние словарей
settings = {**defaults, **user_settings}


Фишка: Распаковка работает с любыми итерируемыми объектами и делает код читаемее на 50%!

💡 Используйте распаковку везде, где нужно извлечь или передать данные!

🚀 Что дальше?
В следующем выпуске — Генераторы в Python! Узнаете, как создавать бесконечные последовательности, экономить память и писать более эффективный код.

💬 Практикуйтесь! Какую задачу Вы решали бы с помощью распаковки? Делитесь в комментариях!

📌 Сохраните пост — эти приемы используются в 90% Python-проектов.

#python_шпильки #распаковка #синтаксический_сахар
🎯 Генераторы в Python: шпаргалка на 1 минуту

Проблема:


# Создание огромного списка в памяти
def get_squares(n):
result = []
for i in range(n):
result.append(i * i)
return result # Весь список в памяти!

squares = get_squares(1000000) # Занимает много памяти


💡Шпилька: Используйте генераторы!

# Экономия памяти - генерируем значения на лету
def get_squares(n):
for i in range(n):
yield i * i # Возвращаем по одному элементу

squares = get_squares(1000000) # Почти не занимает памяти
for square in squares:
print(square) # Обрабатываем по одному


Бонус-шпилька: Генераторные выражения

# Вместо списка
squares_list = [x*x for x in range(10)] # Список в памяти

# Используйте генератор
squares_gen = (x*x for x in range(10)) # Генератор (ленивые вычисления)

# Работа с файлами
lines = (line.strip() for line in open('file.txt')) # Читаем по одной строке


Фишка: Генераторы экономят память и позволяют работать с бесконечными последовательностями!

🚀 Что дальше?
В следующем выпуске — Рекурсия в Python! Узнаете, как элегантно решать задачи со сложными вложенными структурами.

💬 Практикуйтесь! Для каких задач вы бы использовали генераторы? Делитесь идеями в комментариях!

📌 Сохраните пост — генераторы незаменимы при работе с большими данными!

#python_шпильки #генераторы #память
🎯Алгоритмы #3: Рекурсия в Python

Проблема:

# Поиск в сложной вложенной структуре без рекурсии
def find_value(data, key):
# Придется писать много вложенных циклов для каждой глубины
# Сложно, негибко, легко ошибиться


💡Шпилька: Используйте рекурсию!

def find_value(structure, key):
if isinstance(structure, dict):
if key in structure:
return structure[key] # Базовый случай - нашли!
for value in structure.values():
result = find_value(value, key) # Рекурсивный вызов
if result is not None:
return result
elif isinstance(structure, (list, tuple, set)):
for item in structure:
result = find_value(item, key) # Рекурсивный вызов
if result is not None:
return result
return None # Базовый случай - не нашли

# Использование:
data = {"a": {"b": {"c": 1}}, "d": [{"e": 2}, {"f": 3}]}
find_value(data, "c") # → 1


Бонус-шпилька: Всегда помните про базовый случай!

# Факториал через рекурсию
def factorial(n):
if n == 0: # Базовый случай!
return 1
return n * factorial(n - 1) # Рекурсивный случай

# Обход дерева
def traverse_tree(node):
if node is None: # Базовый случай!
return
print(node.value)
traverse_tree(node.left)
traverse_tree(node.right)


Фишка: Рекурсия делает код чище для задач с вложенной структурой, но следите за глубиной рекурсии!

🚀 Что дальше?
В следующем выпуске — Декораторы в Python! Узнаете, как добавлять функциональность к функциям без изменения их кода.

💬 Практикуйтесь! Для каких задач вы используете рекурсию? Делитесь в комментариях!

📌 Сохраните пост — рекурсия незаменима для работы с деревьями и вложенными структурами!

#python_шпильки #рекурсия #алгоритмы