Программистика
Yopiq kanal
Лучший канал про python Ссылка для друга: https://t.me/+Ai6ughKtf5g2ZmFi Купить рекламу: https://telega.in/c/+Ai6ughKtf5g2ZmFi Админ: @JeyRahol По рекламе: @ReivuManager
Ko'proq ko'rsatish5 791
Obunachilar
-624 soatlar
+157 kun
-4130 kun
Postlar arxiv
5 791
🧠 Отгадка: что выведет этот код про декоратор?
def deco(func):
def wrapper(*args, **kwargs):
print("start")
return func(*args, **kwargs)
return wrapper
@deco
def add(a, b):
return a + b
result1 = add(2, 3)
result2 = add(2, 3, 4)
print(result1, result2)
✔️ Правильный ответ: 2. start затем 5, затем TypeError
📖 Почему так происходит?
1. Декоратор @deco заменяет функцию add на wrapper, которая печатает "start" и затем вызывает исходную add.
2. При первом вызове add(2, 3) — всё ок. Печатается start, возвращается 5.
3. При втором вызове add(2, 3, 4) — обёртка пропускает три аргумента, но исходная функция add ожидает ровно два (a, b). Python выбрасывает TypeError: add() takes 2 positional arguments but 3 were given.
4. Исключение возникает до того, как код вернётся в print(), поэтому result2 никогда не присваивается, и print(result1, result2) даже не выполняется. Вместо этого программа падает с ошибкой.
Что в консоли:
start start TypeError: add() takes 2 positional arguments but 3 were givenОбратите внимание:
start печатается для второго вызова перед ошибкой, потому что декоратор выполняется до вызова исходной функции.
Программистика || #quiz5 791
🎖 С Днём Победы, уважаемые коллеги!
9 мая — день, который мы не имеем права забывать. Спасибо ветеранам за мир, свободу и возможность жить, работать и создавать. Низкий поклон. Вечная память.Программистика
5 791
📖PyCharm: профессиональная работа на Python
Раскройте возможности PyCharm для создания деловых, научных и веб-приложений на Python!PyCharm – лучшая профессиональная среда разработки для программистов Python среди множества доступных интегрированных сред. Независимо от того, в каких целях используется Python – для общих задач автоматизации, создания утилит, веб-приложений, анализа данных, машинного обучения или бизнес-приложений, – инструменты PyCharm упрощают выполнение сложных задач и оптимизируют общую производительностьПрограммистика ||#book
5 791
🧠 Загадка на ночь (для профи): что выведет этот код?
def deco(func):
def wrapper(*args, **kwargs):
print("start")
return func(*args, **kwargs)
return wrapper
@deco
def add(a, b):
return a + b
result1 = add(2, 3)
result2 = add(2, 3, 4)
print(result1, result2)
Варианты:
1. 5 и TypeError
2. start затем 5, затем TypeError
3. 5 и 9
4. start затем 5, затем start затем 9
Пиши свой вариант в комментарии! Ответ и разбор — через пару часов 🔥
Программистика || #quiz5 791
👩💻 Click — это библиотека для создания интерфейсов командной строки (CLI). В отличие от
argparse, Click использует декораторы, делая код коротким и понятным. Поддерживает вложенные команды, цвета, подсказки, пароли и автогенерацию --help. На Click построены инструменты вроде Flask, Black и Pytest.
🐱 Ссылка на GitHub
Программистика || #Репозиторий5 791
🔥 Мастхев подборка для каждого айтишника
Держите подборку авторских IT-каналов по всем направлениям: курсы, книги, статьи, практики, примеры кода, шпаргалки и прохождение собесов.
▪️ Python ▪️ Java
▪️ Frontend ▪️ C / C++
▪️ ИБ & Хакинг ▪️ DevOps
▪️ Data Science ▪️ Linux
▪️ C# & GameDev ▪️ Курсы IT
▪️ ИИ-бот для IT ▪️ Весь IT
👉🏻 Подписывайся и прокачивай свои навыки
5 791
🏷 Секрет
getattr: читай атрибуты без try/except
Устали писать try/except AttributeError чтобы проверить, есть ли у объекта нужное поле?
❌ Было:
try:
value = obj.some_attr
except AttributeError:
value = "default"
✅ Стало:
value = getattr(obj, 'some_attr', 'default')
getattr(object, name, default) пытается получить атрибут. Если его нет — возвращает default (по умолчанию None). Никаких исключений.
Где пригодится:
🟢 Работа с динамическими объектами (API, JSON, конфиги)
🟢 Безопасное чтение вложенных атрибутов
🟢 Функции с опциональными аргументами-аттрибутами
Запомни: getattr — твой друг для безопасного доступа.
Программистика|| #tips5 791
💻 Вопрос с собеса: Чем отличается list от tuple?
Это один из тех вопросов, который задают почти всем - и все равно на нем спотыкаются. Просто сказать «list изменяемый, а tuple нет» - мало. Надо понимать последствия.
👉 Базовый ответ (которого ждут):
-
list - изменяемый (mutable). Можно менять, добавлять, удалять элементы.
- tuple - неизменяемый (immutable). После создания его нельзя изменить.
👉 Глубокий разбор:
1. Производительность и память:
Из-за неизменяемости tuple работает быстрее и занимает меньше памяти. Python может кэшировать и оптимизировать их.
import sys
import timeit
lst = [1, 2, 3]
tup = (1, 2, 3)
print(sys.getsizeof(lst)) # 120 байт (может меняться)
print(sys.getsizeof(tup)) # 72 байта
2. Безопасность и хэшируемость:
tuple можно использовать как ключ в словаре, list - нет. Это важно для кэшей, индексов.
valid_cache = {(1, 2): "result"} # Работает
invalid_cache = {[1, 2]: "result"} # TypeError: unhashable type
3. Семантическое различие:
- list - это однородная коллекция (все элементы обычно одного типа).
- tuple - это гетерогенная коллекция, часто используется как запись с полями (как namedtuple или дата-класс).
# Плохо: tuple как list
for item in ("apple", "banana", "cherry"):
print(item)
# Хорошо: tuple как структура
person = ("Alice", 30, "engineer") # имя, возраст, профессия
4. Неизменяемость - только на верхнем уровне:
Важный подвох! Если внутри tuple лежит изменяемый объект - его можно изменить.
danger = (1, 2, [3, 4])
danger[2].append(5) # Опасно! Работает!
print(danger) # (1, 2, [3, 4, 5])
💡 Итоговый ответ для собеса:
1. Основное: list - mutable, tuple - immutable 2. Следствия: tuple быстрее, занимает меньше памяти, хэшируем 3. Семантика: list для однородных данных, tuple для структур 4. Ловушка: неизменяемость только на верхнем уровне 5. Когда что использовать: - tuple для константных данных, ключей словаря - list для динамических коллекцийЗапомни: на джуньорских позициях хватит первого пункта, но сеньоры ждут все пять. Программистика||#jobs
5 791
В России можно посещать IT-мероприятия хоть каждый день: как оффлайн, так и онлайн
Но где их находить? Как узнавать о них раньше, чем когда все начнут выкладывать фотографии оттуда?
Переходите на канал IT-Мероприятия России. В нём каждый день анонсируются мероприятия со всех городов России
📆 в канале размещаются как онлайн, так и оффлайн мероприятия;
👩💻 можно найти ивенты по любому стеку: программирование, frontend-backend разработка, кибербезопасность, дата-аналитика, osint, devops и другие;
🎙 разнообразные форматы мероприятий: митапы с коллегами по цеху, конференции и вебинары с известными опытными специалистами, форумы и олимпиады от важных представителей индустрии и многое другое
А чтобы не искать по разным форумам и чатам новости о предстоящих ивентах:
🚀 IT-мероприятия России — подписывайся и будь в курсе всех предстоящих мероприятий!
5 791
🪄 pyinstrument — это профилировщик Python, который показывает, где ваш код тратит время, простым и наглядным способом. В отличие от cProfile (который выдаёт простыню цифр), pyinstrument рисует красивый древовидный отчёт: сразу видно, какие функции вызывают тормоза и сколько времени ушло на свои и дочерние вызовы. Работает на уровне интерпретатора, не требует изменения кода. Идеально для поиска узких мест в веб-приложениях, скриптах и ETL-пайплайнах.Установка:
pip install pyinstrument
Запуск:
pyinstrument script.py
🐱 Ссылка на GitHub
Программистика || #Репозиторий5 791
🔁 Секрет
for...else: когда break решает всё
Вы знали, что у цикла for (и while) есть блок else, который выполняется только если цикл завершился без `break`?
❌ Без фишки (нужен флаг):
found = False
for item in items:
if item == target:
found = True
print("Нашли!")
break
if not found:
print("Не нашли")
✅ С фишкой (код чище):
for item in items:
if item == target:
print("Нашли!")
break
else:
print("Не нашли")
Где пригодится: поиск элемента, проверка всех условий, обработка исключений в цикле.
🟢 Запомни: else после цикла срабатывает только если break не случился. Идеально для флагов поиска.
Программистика || #tips5 791
💻 Вопрос с собеседования: Что такое
dataclass и зачем он нужен (и чем отличается от обычного класса)?
Современный Python предлагает множество декораторов и утилит, которые экономят часы написания однотипного кода. Один из самых полезных — @dataclass. Новички часто пишут десятки строк __init__, __repr__, __eq__ вручную, не подозревая, что dataclass делает это автоматически. Разбираемся, как это работает и когда применять.
📌 Базовый ответ (которого ждут от джуна):
dataclass — это декоратор из модуля dataclasses, который автоматически генерирует специальные методы для класса: __init__, __repr__, __eq__ и другие на основе объявленных атрибутов. Это уменьшает boilerplate-код и делает классы, которые хранят данные, чище и понятнее.
❌ Было (обычный класс – много рутины):
class Person:
def __init__(self, name: str, age: int = 0):
self.name = name
self.age = age
def __repr__(self):
return f"Person(name='{self.name}', age={self.age})"
def __eq__(self, other):
if not isinstance(other, Person):
return False
return self.name == other.name and self.age == other.age
p = Person("Алиса", 30)
✅ Стало (dataclass – всё генерируется):
from dataclasses import dataclass
@dataclass
class Person:
name: str
age: int = 0
p = Person("Алиса", 30)
print(p) # Person(name='Алиса', age=30)
🧱 Глубокий разбор (для мидла и сеньора):
1. Что именно генерирует `@dataclass` по умолчанию?
- __init__ – инициализатор с параметрами в том порядке, как объявлены поля.
- __repr__ – строковое представление, показывающее имя класса и значения полей.
- __eq__ – сравнение по всем полям (если не указано иначе).
- Порядок полей в сравнениях (__lt__, __le__ и т.д.) можно добавить параметром order=True.
2. Настройка поведения через параметры декоратора:
@dataclass(init=True, repr=True, eq=True, order=False, frozen=False)
class Config:
host: str
port: int = 8080
- frozen=True – делает экземпляры неизменяемыми (как namedtuple). После создания нельзя изменить атрибут.
- order=True – генерирует методы сравнения (<, <=, >, >=) на основе порядка полей.
3. Поля с значениями по умолчанию и `field()`:
Для сложных значений (например, список) нужно использовать default_factory, иначе все экземпляры будут использовать один и тот же изменяемый объект.
from dataclasses import dataclass, field
@dataclass
class ShoppingCart:
items: list = field(default_factory=list) # каждый раз новый список
owner: str = "guest"
4. Наследование:
Dataclasses поддерживают наследование, но порядок полей важен — поля родителя идут перед дочерними.
@dataclass
class Vehicle:
wheels: int
@dataclass
class Car(Vehicle):
brand: str
# __init__ будет (wheels, brand)
5. Пост-инициализация через `__post_init__`:
Этот метод вызывается автоматически после __init__ и позволяет выполнять валидацию или преобразования.
@dataclass
class Positive:
value: int
def __post_init__(self):
if self.value <= 0:
raise ValueError("Должно быть положительным")
Программистика || #jobs5 791
👩💻 Справочник с примерами на C, C++, Java и Python
Если вы считаете, что скорость решения той или иной задачи зависит, в первую очередь, от мощности компьютера, на котором она решается, то эта книга станет для вас откровением с самой первой страницы. Вы узнаете, что наибольший вклад в производительность программы вносят правильно выбранный алгоритм и его реализация в виде компьютерной программы. Выбор подходящего алгоритма среди массы других, способных решить вашу задачу, - дело не из самых простых, и этому вы тоже научитесь в данной книге. В новом издании описано множество алгоритмов для решения задач из самых разных областей, и вы сможете выбрать и реализовать наиболее подходящий для ваших задач алгоритм. Здесь даже совершенно незнакомый с математикой читатель найдет все, что нужно для понимания и анализа производительности алгоритма.Программистика || #Книги
5 791
🔁 Почему нельзя менять список во время итерации (и как это обойти)
Многие новички пишут цикл
for item in my_list и внутри пытаются удалять или добавлять элементы. Кажется логичным: «нашёл ненужное — удали». Но Python так не работает. Изменяя список во время итерации, вы ломаете внутренний механизм итератора. Результат — пропущенные элементы, исключения или странное поведение.
🧱 Проблема: что происходит под капотом
Когда вы пишете for x in lst:, Python создаёт итератор, который запоминает текущую позицию по индексу. Если внутри цикла вы удаляете элемент, все последующие элементы сдвигаются влево, а итератор продолжает двигаться вперёд. В итоге часть элементов пропускается.
lst = [1, 2, 3, 4, 5]
for x in lst:
if x % 2 == 0:
lst.remove(x)
print(lst) # [1, 3, 5] — может показаться, что работает
Но попробуйте другой список:
lst = [2, 4, 6, 8, 10]
for x in lst:
if x % 2 == 0:
lst.remove(x)
print(lst) # [4, 8] — где остальные?
Потому что после удаления 2, список сдвинулся, итератор перешёл к следующему индексу, где оказалось 6 (изначальное 4 было пропущено). Аналогично с добавлением — можно уйти в бесконечный цикл.
lst = [1, 2, 3]
for x in lst:
lst.append(x) # бесконечный цикл
🧠 Как правильно: 3
безопасных способа
1. Итерируйтесь по копии
Самый простой способ — создать копию списка и итерироваться по ней, а изменения вносить в оригинал.
lst = [1, 2, 3, 4, 5]
for x in lst[:]: # копия
if x % 2 == 0:
lst.remove(x)
print(lst) # [1, 3, 5]
Или через list(lst) или .copy().
2. Создавайте новый список
Часто проще собрать новый список из нужных элементов, чем мутировать старый.
lst = [1, 2, 3, 4, 5]
lst = [x for x in lst if x % 2 != 0]
print(lst) # [1, 3, 5]
Это самый идиоматичный способ.
3. Итерируйтесь в обратном порядке
Если нужно удалять элементы, можно идти с конца. Тогда сдвиги не влияют на ещё не пройденные элементы.
lst = [1, 2, 3, 4, 5]
for i in range(len(lst)-1, -1, -1):
if lst[i] % 2 == 0:
del lst[i]
print(lst) # [1, 3, 5]
🧪 Что насчёт словарей?
Со словарями ещё строже: изменение размера во время итерации вызывает RuntimeError.
d = {'a': 1, 'b': 2}
for k in d:
d['c'] = 3 # RuntimeError: dictionary changed size during iteration
Решение — итерироваться по копии ключей: for k in list(d):.
Программистика|| #article5 791
😒 Подборка каналов по информационной безопасности
Проверенные каналы по безопасности, которые реально помогают расти.
👍 ZeroDay — Уроки, эксплуатация уязвимостей с нуля
👍 Белый Хакер — Свежие новости из мира ИБ
😎 Бункер Хакера — Статьи, книги, шпаргалки и хакинг
👨💻 Серверная Админа — Настройка и уроки по компьютерным сетям
📂 Подписывайся
