ch
Feedback

不要被骗子欺骗!Telemetrio 会找到并标记这些频道 👉 如果想查看标记,请订阅

Программистика

Программистика

关闭频道

Лучший канал про python Ссылка для друга: https://t.me/+Ai6ughKtf5g2ZmFi Купить рекламу: https://telega.in/c/+Ai6ughKtf5g2ZmFi Админ: @JeyRahol По рекламе: @ReivuManager

显示更多
5 799
订阅者
+3224 小时
+187 天
-4030 天
帖子存档
🧠 Отгадка: что выведет этот код про декоратор?
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 печатается для второго вызова перед ошибкой, потому что декоратор выполняется до вызова исходной функции. Программистика || #quiz

🗣 FastAPI — Как установить + 3 способа запуска проекта
📱 Первоисточник
Программистика|| #video

🎖 С Днём Победы, уважаемые коллеги! 9 мая — день, который мы не имеем права забывать. Спасибо ветеранам за мир, свободу и во
🎖 С Днём Победы, уважаемые коллеги!
9 мая — день, который мы не имеем права забывать. Спасибо ветеранам за мир, свободу и возможность жить, работать и создавать. Низкий поклон. Вечная память.
Программистика

📖PyCharm: профессиональная работа на Python Раскройте возможности PyCharm для создания деловых, научных и веб-приложений на
📖PyCharm: профессиональная работа на Python
Раскройте возможности PyCharm для создания деловых, научных и веб-приложений на Python!PyCharm – лучшая профессиональная среда разработки для программистов Python среди множества доступных интегрированных сред. Независимо от того, в каких целях используется Python – для общих задач автоматизации, создания утилит, веб-приложений, анализа данных, машинного обучения или бизнес-приложений, – инструменты PyCharm упрощают выполнение сложных задач и оптимизируют общую производительность
Программистика ||#book

📌 Шпора по типам данных Программистика ||#Шпора
📌 Шпора по типам данных Программистика ||#Шпора

🧠 Загадка на ночь (для профи): что выведет этот код?
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 Пиши свой вариант в комментарии! Ответ и разбор — через пару часов 🔥 Программистика || #quiz

👩‍💻 Click — это библиотека для создания интерфейсов командной строки (CLI). В отличие от argparse, Click использует декорат
👩‍💻 Click — это библиотека для создания интерфейсов командной строки (CLI). В отличие от argparse, Click использует декораторы, делая код коротким и понятным. Поддерживает вложенные команды, цвета, подсказки, пароли и автогенерацию --help. На Click построены инструменты вроде Flask, Black и Pytest. 🐱 Ссылка на GitHub Программистика || #Репозиторий

🔥 Мастхев подборка для каждого айтишника Держите подборку авторских IT-каналов по всем направлениям: курсы, книги, статьи, п
🔥 Мастхев подборка для каждого айтишника Держите подборку авторских IT-каналов по всем направлениям: курсы, книги, статьи, практики, примеры кода, шпаргалки и прохождение собесов. ▪️ Python ▪️ Java ▪️ Frontend ▪️ C / C++ ▪️ ИБ & Хакинг ▪️ DevOps ▪️ Data Science ▪️ Linux ▪️ C# & GameDev ▪️ Курсы IT ▪️ ИИ-бот для IT ▪️ Весь IT 👉🏻 Подписывайся и прокачивай свои навыки

🏷 Секрет 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 — твой друг для безопасного доступа. Программистика|| #tips

💻 Вопрос с собеса: Чем отличается 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

В России можно посещать IT-мероприятия хоть каждый день: как оффлайн, так и онлайн Но где их находить? Как узнавать о них ран
В России можно посещать IT-мероприятия хоть каждый день: как оффлайн, так и онлайн Но где их находить? Как узнавать о них раньше, чем когда все начнут выкладывать фотографии оттуда? Переходите на канал IT-Мероприятия России. В нём каждый день анонсируются мероприятия со всех городов России 📆 в канале размещаются как онлайн, так и оффлайн мероприятия; 👩‍💻 можно найти ивенты по любому стеку: программирование, frontend-backend разработка, кибербезопасность, дата-аналитика, osint, devops и другие; 🎙 разнообразные форматы мероприятий: митапы с коллегами по цеху, конференции и вебинары с известными опытными специалистами, форумы и олимпиады от важных представителей индустрии и многое другое А чтобы не искать по разным форумам и чатам новости о предстоящих ивентах: 🚀 IT-мероприятия России — подписывайся и будь в курсе всех предстоящих мероприятий!

👩‍💻 Принципы SOLID на реальном примере в Python
📱 Первоисточник
Программистика|| #video

🪄 pyinstrument — это профилировщик Python, который показывает, где ваш код тратит время, простым и наглядным способом. В отл
🪄 pyinstrument — это профилировщик Python, который показывает, где ваш код тратит время, простым и наглядным способом. В отличие от cProfile (который выдаёт простыню цифр), pyinstrument рисует красивый древовидный отчёт: сразу видно, какие функции вызывают тормоза и сколько времени ушло на свои и дочерние вызовы. Работает на уровне интерпретатора, не требует изменения кода. Идеально для поиска узких мест в веб-приложениях, скриптах и ETL-пайплайнах.
Установка:
pip install pyinstrument
Запуск:
pyinstrument script.py
🐱 Ссылка на GitHub Программистика || #Репозиторий

🔁 Секрет 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 не случился. Идеально для флагов поиска. Программистика || #tips

💻 Вопрос с собеседования: Что такое 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("Должно быть положительным")
Программистика || #jobs

👩‍💻 Справочник с примерами на C, C++, Java и Python Если вы считаете, что скорость решения той или иной задачи зависит, в п
👩‍💻 Справочник с примерами на C, C++, Java и Python
Если вы считаете, что скорость решения той или иной задачи зависит, в первую очередь, от мощности компьютера, на котором она решается, то эта книга станет для вас откровением с самой первой страницы. Вы узнаете, что наибольший вклад в производительность программы вносят правильно выбранный алгоритм и его реализация в виде компьютерной программы. Выбор подходящего алгоритма среди массы других, способных решить вашу задачу, - дело не из самых простых, и этому вы тоже научитесь в данной книге. В новом издании описано множество алгоритмов для решения задач из самых разных областей, и вы сможете выбрать и реализовать наиболее подходящий для ваших задач алгоритм. Здесь даже совершенно незнакомый с математикой читатель найдет все, что нужно для понимания и анализа производительности алгоритма.
Программистика || #Книги

🔁 Почему нельзя менять список во время итерации (и как это обойти) Многие новички пишут цикл 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):. Программистика|| #article

😒 Подборка каналов по информационной безопасности Проверенные каналы по безопасности, которые реально помогают расти. 👍 Zer
😒 Подборка каналов по информационной безопасности Проверенные каналы по безопасности, которые реально помогают расти. 👍 ZeroDay — Уроки, эксплуатация уязвимостей с нуля 👍 Белый Хакер — Свежие новости из мира ИБ 😎 Бункер Хакера — Статьи, книги, шпаргалки и хакинг 👨‍💻 Серверная Админа — Настройка и уроки по компьютерным сетям 📂 Подписывайся