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

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

关闭频道

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

显示更多
5 580
订阅者
-524 小时
-437
-10430
帖子存档
🔁 Секрет for...else: когда break решает всё Вы знали, что у цикла forwhile) есть блок 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 — Уроки, эксплуатация уязвимостей с нуля 👍 Белый Хакер — Свежие новости из мира ИБ 😎 Бункер Хакера — Статьи, книги, шпаргалки и хакинг 👨‍💻 Серверная Админа — Настройка и уроки по компьютерным сетям 📂 Подписывайся

🧠 Отгадка: что выведет этот код?
funcs = [lambda i=i: i for i in range(3)]
print([f() for f in funcs])
✔️ Правильный ответ: 1. `[0, 1, 2]` 📖 Почему так происходит? Внутри спискового включения создаётся три лямбда-функции. Ключевая деталь — lambda i=i: i. Обычно лямбда захватывает переменную i из внешней области видимости (замыкание), и из-за позднего связывания (late binding) все три функции вернули бы последнее значение i (2). Но здесь мы добавили аргумент по умолчанию i=i, который вычисляется в момент создания каждой лямбды. На каждой итерации цикла текущее значение i (0, затем 1, затем 2) фиксируется как значение по умолчанию для параметра i внутри функции. Таким образом:
- Первая лямбда: lambda i=0: i - Вторая: lambda i=1: i - Третья: lambda i=2: i
При вызове без аргумента каждая лямбда возвращает своё сохранённое значение по умолчанию. Поэтому получаем [0, 1, 2]. Без аргумента по умолчанию (lambda: i) все функции вернули бы одно и то же последнее значение 2. 🛠 Как запомнить? Аргумент по умолчанию в лямбде — это способ «заморозить» переменную цикла, чтобы избежать классической ловушки. Хитрость, которую стоит знать и использовать. Ставьте 🔥, если было полезно! Программистика || #quiz

👩‍💻 InquirerPy — это Python-форк знаменитой библиотеки Inquirer.js, позволяющий создавать красивые интерактивные интерфейсы
👩‍💻 InquirerPy — это Python-форк знаменитой библиотеки Inquirer.js, позволяющий создавать красивые интерактивные интерфейсы в терминале. Библиотека поддерживает все популярные типы диалогов: текстовый ввод, подтверждения, списки (одиночный выбор), чекбоксы (множественный выбор) и даже ввод пароля. InquirerPy написан на чистом Python с использованием prompt_toolkit, работает на всех платформах (Windows, macOS, Linux) и предлагает два варианта синтаксиса: классический (для обратной совместимости с PyInquirer) и альтернативный (гибкий, с подсказками от IDE).
🐱 Ссылка на GitHub Программистика|| #Репозиторий

💻 Логово Сфинкса — самое активное ИБ-комьюнити во всём телеграме! Сам Сфинкс очень умелый молодой специалист, который уже, у
💻 Логово Сфинкса — самое активное ИБ-комьюнити во всём телеграме! Сам Сфинкс очень умелый молодой специалист, который уже, учась в унике, получал офферы на +300к💰 И на своём канале он освещает такие темы, как: — атаки на актив директори — атаки на инфру — обход различных средств защиты и фишинг — C2 Фреймворк — И много опыта из жизни и работы Так же он помогает своим подписчикам обучиться ИБ и составить успешное резюме! Подпишись и ты точно найдёшь работу🫵

Что происходит с наймом Python Backend?
📱 Первоисточник
Программистика|| #video

🗑 Сборка мусора в Python: кто и когда убирает за тобой? Вы когда-нибудь создавали миллион объектов в цикле и не думали о том, куда они деваются? Память не бесконечна. Кто-то же должен убирать мусор. В C/C++ вы вызываете free(). В Python это делает автоматический сборщик мусора (GC). Разбираемся, как он работает, простыми словами. 🧱 Проблема: как объекты умирают? Каждый объект в Python имеет счётчик ссылок. Сколько переменных на него указывают.
x = [1, 2, 3]  # счётчик = 1
y = x          # счётчик = 2
del x          # счётчик = 1
del y          # счётчик = 0 → объект удаляется сразу
Это подсчёт ссылок (reference counting) — основной метод. Работает быстро, удаляет объект мгновенно, когда на него больше никто не ссылается. 🧪 А что с циклическими ссылками? Вот где начинаются проблемы:
class Node:
    def __init__(self):
        self.next = None

a = Node()
b = Node()
a.next = b
b.next = a
del a
del b
Теперь два объекта ссылаются друг на друга, но из программы на них никто не указывает. Счётчики = 1. Подсчёт ссылок не может их удалить. Это утечка памяти. 🛠 Как управлять GC вручную Модуль gc даёт контроль:
import gc

# Показать пороги срабатывания
print(gc.get_threshold())  # (700, 10, 10)

# Запустить сборку принудительно
gc.collect()

# Отключить GC (не делайте без причины)
# gc.disable()
Программистика || #Статья

🧠 Загадка на ночь: что выведет этот код?
funcs = [lambda i=i: i for i in range(3)]
print([f() for f in funcs])
Варианты: 1. [0, 1, 2] 2. [2, 2, 2] 3. [0, 0, 0] 4. Ошибка Пиши свой вариант в комментарии! Ответ и разбор — через пару часов 🔥 Программистика || #quiz

⚡️ Tyro — это библиотека для создания CLI-приложений прямо из аннотаций типов Python. Забудьте про многострочный argparse: до
⚡️ Tyro — это библиотека для создания CLI-приложений прямо из аннотаций типов Python. Забудьте про многострочный argparse: достаточно описать функцию с типами, добавить tyro.cli() — и у вас готово приложение с авто-документацией, парсингом, проверкой типов и поддержкой вложенных dataclass-структур. IDE и mypy подскажут все аргументы, а ошибки в конфигурации отловятся до запуска. Программистика|| #Репозиторий

Айтишник, который не умеет использовать командную строку bash – так себе специалист. Если посетить несколько собеседований уровня от миддл, то можно убедиться, что вопросы про опыт работы в консоли появляются довольно часто. Сходу научиться всем командам bash нереально – их очень много. К счастью, появился канал BashMaster, в котором каждый день можно узнавать по одной небольшой связке команд и сразу же внедрять их в свою работу. Подпишись, освоишь bash на изи 👍

Beginner Guide to Python - Tasks Задания для открытого курса по Python, подходит всем - от новичков в программировании до тех
Beginner Guide to Python - Tasks Задания для открытого курса по Python, подходит всем - от новичков в программировании до тех, кто захотел изучить стремительно развивающуюся технологию в мире ИТ (Python занимает 1-3 место в популярности среди языков программирования за 2019 год)
🌐 Ссылка
Программистика || #Course

🍿 Решаю задачи с собеседований на Python Junior
📱 Первоисточник
Программистика|| #video

На Stepik запустили годный курс по «Troubleshooting Docker и Kubernetes: поиск и устранение проблем» В программе только важны
На Stepik запустили годный курс по «Troubleshooting Docker и Kubernetes: поиск и устранение проблем» В программе только важные аспекты: — troubleshooting Docker и образов — диагностика сетевых проблем — настройка readiness/liveness probes — отладка pod’ов, деплоев и ingress — анализ логов контейнеров и кластера — разбор ошибок CrashLoopBackOff, OOMKilled, ImagePullBackOff и других Собеседования на DevOps/SRE сейчас всё чаще строятся вокруг реальных инцидентов. Данный курс фокусируется именно на таких сценариях и помогает в подготовке к практическим вопросам 48 часов доступен со скидкой 25% ↗️ Пройти курс на Stepik

👩‍💻 python-mss — модуль для создания снимков экрана (скриншотов) на нескольких платформах, таких как Windows, macOS и Linux
👩‍💻 python-mss — модуль для создания снимков экрана (скриншотов) на нескольких платформах, таких как Windows, macOS и Linux!
Модуль реализован на чистом Python с использованием ctypes, что делает его лёгким, быстрым и не зависящим от внешних библиотек. MSS поддерживает захват скриншотов с отдельных мониторов или всех мониторов одновременно, а также интеграцию с библиотеками, такими как Pillow, Numpy и OpenCV, для последующей обработки изображений.
Программистика|| #Репозиторий

⚡️ Linux теперь в Telegram! Ребята делают реально классный канал про IT - просто, понятно и без воды. О Linux, DevOps, разраб
+4
⚡️ Linux теперь в Telegram! Ребята делают реально классный канал про IT - просто, понятно и без воды. О Linux, DevOps, разработке, безопасности и инструментах, которые помогают работать эффективнее. Подписывайтесь: @recura_tech

📦 `None` в Python: не просто «ничего», а полноценный объект Многие новички думают, что None — это как «пустота» или «ничего». На самом деле None — полноценный объект со своим типом NoneType. Он существует в единственном экземпляре на всю программу (синглтон). Что важно знать: 1. None используется для обозначения отсутствия значения:
   def func():
       print("Привет")
   result = func()  # result = None
2. Сравнивать с None нужно через is, а не ==:
   if value is None:   # правильно
   if value == None:   # работает, но так не делают
3. None — ложное значение в булевом контексте:
   if not value:  # сработает и для None, и для 0, и для []
4. Функция без return возвращает None. Запомните: None — не ошибка и не баг, а сигнал «значения нет». Уважайте объект None как полноправного гражданина Python. Программистика || #doc