Программистика
Yopiq kanal
Лучший канал про python Ссылка для друга: https://t.me/+Ai6ughKtf5g2ZmFi Купить рекламу: https://telega.in/c/+Ai6ughKtf5g2ZmFi Админ: @JeyRahol По рекламе: @ReivuManager
Ko'proq ko'rsatish5 580
Obunachilar
-524 soatlar
-437 kunlar
-10430 kunlar
Postlar arxiv
5 581
🔁 Секрет
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 581
💻 Вопрос с собеседования: Что такое
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 581
👩💻 Справочник с примерами на C, C++, Java и Python
Если вы считаете, что скорость решения той или иной задачи зависит, в первую очередь, от мощности компьютера, на котором она решается, то эта книга станет для вас откровением с самой первой страницы. Вы узнаете, что наибольший вклад в производительность программы вносят правильно выбранный алгоритм и его реализация в виде компьютерной программы. Выбор подходящего алгоритма среди массы других, способных решить вашу задачу, - дело не из самых простых, и этому вы тоже научитесь в данной книге. В новом издании описано множество алгоритмов для решения задач из самых разных областей, и вы сможете выбрать и реализовать наиболее подходящий для ваших задач алгоритм. Здесь даже совершенно незнакомый с математикой читатель найдет все, что нужно для понимания и анализа производительности алгоритма.Программистика || #Книги
5 581
🔁 Почему нельзя менять список во время итерации (и как это обойти)
Многие новички пишут цикл
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 581
😒 Подборка каналов по информационной безопасности
Проверенные каналы по безопасности, которые реально помогают расти.
👍 ZeroDay — Уроки, эксплуатация уязвимостей с нуля
👍 Белый Хакер — Свежие новости из мира ИБ
😎 Бункер Хакера — Статьи, книги, шпаргалки и хакинг
👨💻 Серверная Админа — Настройка и уроки по компьютерным сетям
📂 Подписывайся
5 581
🧠 Отгадка: что выведет этот код?
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.
🛠 Как запомнить?
Аргумент по умолчанию в лямбде — это способ «заморозить» переменную цикла, чтобы избежать классической ловушки. Хитрость, которую стоит знать и использовать.
Ставьте 🔥, если было полезно!
Программистика || #quiz5 581
👩💻 InquirerPy — это Python-форк знаменитой библиотеки Inquirer.js, позволяющий создавать красивые интерактивные интерфейсы в терминале. Библиотека поддерживает все популярные типы диалогов: текстовый ввод, подтверждения, списки (одиночный выбор), чекбоксы (множественный выбор) и даже ввод пароля. InquirerPy написан на чистом Python с использованием prompt_toolkit, работает на всех платформах (Windows, macOS, Linux) и предлагает два варианта синтаксиса: классический (для обратной совместимости с PyInquirer) и альтернативный (гибкий, с подсказками от IDE).🐱 Ссылка на GitHub Программистика|| #Репозиторий
5 581
💻 Логово Сфинкса — самое активное ИБ-комьюнити во всём телеграме!
Сам Сфинкс очень умелый молодой специалист, который уже, учась в унике, получал офферы на +300к💰
И на своём канале он освещает такие темы, как:
— атаки на актив директори
— атаки на инфру
— обход различных средств защиты и фишинг
— C2 Фреймворк
— И много опыта из жизни и работы
Так же он помогает своим подписчикам обучиться ИБ и составить успешное резюме!
Подпишись и ты точно найдёшь работу🫵
5 581
🗑 Сборка мусора в 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()
Программистика || #Статья5 581
🧠 Загадка на ночь: что выведет этот код?
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. Ошибка
Пиши свой вариант в комментарии! Ответ и разбор — через пару часов 🔥
Программистика || #quiz5 581
⚡️ Tyro — это библиотека для создания CLI-приложений прямо из аннотаций типов Python. Забудьте про многострочный argparse: достаточно описать функцию с типами, добавить
tyro.cli() — и у вас готово приложение с авто-документацией, парсингом, проверкой типов и поддержкой вложенных dataclass-структур. IDE и mypy подскажут все аргументы, а ошибки в конфигурации отловятся до запуска.
Программистика|| #Репозиторий5 581
Айтишник, который не умеет использовать командную строку bash – так себе специалист.
Если посетить несколько собеседований уровня от миддл, то можно убедиться, что вопросы про опыт работы в консоли появляются довольно часто.
Сходу научиться всем командам bash нереально – их очень много.
К счастью, появился канал BashMaster, в котором каждый день можно узнавать по одной небольшой связке команд и сразу же внедрять их в свою работу.
Подпишись, освоишь bash на изи 👍
5 581
Beginner Guide to Python - Tasks
Задания для открытого курса по Python, подходит всем - от новичков в программировании до тех, кто захотел изучить стремительно развивающуюся технологию в мире ИТ (Python занимает 1-3 место в популярности среди языков программирования за 2019 год)
🌐 СсылкаПрограммистика || #Course
5 581
На Stepik запустили годный курс по «Troubleshooting Docker и Kubernetes: поиск и устранение проблем»
В программе только важные аспекты:
— troubleshooting Docker и образов
— диагностика сетевых проблем
— настройка readiness/liveness probes
— отладка pod’ов, деплоев и ingress
— анализ логов контейнеров и кластера
— разбор ошибок CrashLoopBackOff, OOMKilled, ImagePullBackOff и других
Собеседования на DevOps/SRE сейчас всё чаще строятся вокруг реальных инцидентов. Данный курс фокусируется именно на таких сценариях и помогает в подготовке к практическим вопросам
48 часов доступен со скидкой 25%
↗️ Пройти курс на Stepik
5 581
👩💻 python-mss — модуль для создания снимков экрана (скриншотов) на нескольких платформах, таких как Windows, macOS и Linux!
Модуль реализован на чистом Python с использованием ctypes, что делает его лёгким, быстрым и не зависящим от внешних библиотек. MSS поддерживает захват скриншотов с отдельных мониторов или всех мониторов одновременно, а также интеграцию с библиотеками, такими как Pillow, Numpy и OpenCV, для последующей обработки изображений.Программистика|| #Репозиторий
5 581
⚡️ Linux теперь в Telegram!
Ребята делают реально классный канал про IT - просто, понятно и без воды.
О Linux, DevOps, разработке, безопасности и инструментах, которые помогают работать эффективнее.
Подписывайтесь: @recura_tech
5 581
📦 `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
Endi mavjud! Telegram Tadqiqoti 2025 — yilning asosiy insaytlari 
