ar
Feedback

لا تقع ضحية للمخادعين! تيليمتريو يكتشف ويُميّز هذه القنوات 👉 إذا كنت تريد رؤية العلامة، اشترك

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

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

قناة بسيطة

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

إظهار المزيد
5 799
المشتركون
+3224 ساعات
+187 أيام
-4030 أيام
أرشيف المشاركات
💻 Логово Сфинкса - одно из самых активных ИБ-комьюнити во всём телеграме! Сам Сфинкс очень умелый молодой ИБ специалист И на
💻 Логово Сфинкса - одно из самых активных ИБ-комьюнити во всём телеграме! Сам Сфинкс очень умелый молодой ИБ специалист И на своём канале он освещает такие темы, как: — атаки на актив директори — атаки на инфру — обход различных средств защиты и фишинг — C2 Фреймворки — И много опыта из жизни и работы Посуди сам: 🐈‍⬛ Дорожная карта со стажёра до мидла 🐈‍⬛ О важности методологии в ИБ 🐈‍⬛ Переиграли мошенника и угнали его акк Так же он помогает своим подписчикам обучиться ИБ и грамотно войти в профессию не тратясь на бесполезные курсы Подпишись чтобы стать классным спецом👍

📌 Секрет operator.itemgetter: сортируй словари без лямбд Сортировка списка словарей по ключу — частая задача. Многие пишут lambda x: x['key'], но есть более читаемый и быстрый способ. ❌ Было (лямбда):
users = [{'name': 'Боб', 'age': 30}, {'name': 'Алиса', 'age': 25}]
sorted_users = sorted(users, key=lambda x: x['age'])
✔️ Стало (operator.itemgetter):
from operator import itemgetter

sorted_users = sorted(users, key=itemgetter('age'))
itemgetter работает быстрее лямбды и читается как «возьми значение по ключу». Можно передавать несколько ключей для сортировки по нескольким полям:
sorted_users = sorted(users, key=itemgetter('age', 'name'))
Для объектов используйте attrgetter:
from operator import attrgetter
sorted_users = sorted(users, key=attrgetter('age'))
🟢 Запомни: itemgetter и attrgetter — твои помощники для чистого и быстрого кода. Программистика|| #tips

📦 Итераторы: что скрывается за `for` и как написать свой Каждый день вы пишете for x in list:, но задумывались ли вы, как это работает? Цикл for не знает ничего о списках, кортежах или словарях. Он знает только про итераторы. Именно итераторы обеспечивают единообразие обхода любых коллекций в Python. Разбираемся, как это устроено и как написать свой итератор. 🧱 Что такое итератор и зачем он нужен Итератор — это объект, который поддерживает протокол итерации: метод __iter__() (возвращает сам себя) и метод __next__() (возвращает следующий элемент или бросает StopIteration). Когда вы пишете for x in obj:, Python вызывает iter(obj), затем многократно вызывает next() до исключения.
# Что делает for под капотом
it = iter(my_list)
while True:
    try:
        x = next(it)
        # тело цикла
    except StopIteration:
        break
🧠 Создаём свой итератор Допустим, вы хотите итерироваться по числам Фибоначчи, но не хотите хранить их все в списке. Пишем свой итератор.
class FibonacciIterator:
    def __init__(self, limit):
        self.limit = limit
        self.a = 0
        self.b = 1
        self.count = 0
    
    def __iter__(self):
        return self
    
    def __next__(self):
        if self.count >= self.limit:
            raise StopIteration
        result = self.a
        self.a, self.b = self.b, self.a + self.b
        self.count += 1
        return result

for num in FibonacciIterator(10):
    print(num)  # 0, 1, 1, 2, 3, 5, 8, 13, 21, 34
⚡️ `iter` и `next` в действии
lst = [1, 2, 3]
it = iter(lst)
print(next(it))  # 1
print(next(it))  # 2
print(next(it))  # 3
print(next(it))  # StopIteration
Итератор одноразовый. После исчерпания его нельзя использовать повторно. 🧩 Итерируемые объекты vs Итераторы - Итерируемый объект (Iterable) — у него есть метод __iter__(), который возвращает итератор. - Итератор (Iterator) — у него есть __iter__() (возвращает себя) и __next__().
# Список — итерируемый, но не итератор
lst = [1, 2, 3]
print(iter(lst))   # <list_iterator object at 0x...>
print(next(lst))   # TypeError: 'list' object is not an iterator

# Итератор — и итерируемый, и итератор
it = iter(lst)
print(iter(it) is it)  # True
📌 Встроенные итераторы - range() — итератор (ленивый, не хранит все числа). - enumerate() — итератор. - zip() — итератор. - map(), filter() — итераторы.
# Все они ленивые — не хранят данные, пока не пройдёшь
r = range(1_000_000)  # 0 байт
lst = list(r)         # 8 МБ
🧪 Итератор для бесконечной последовательности
class InfiniteCounter:
    def __init__(self, start=0):
        self.current = start
    
    def __iter__(self):
        return self
    
    def __next__(self):
        result = self.current
        self.current += 1
        return result

counter = InfiniteCounter()
for _ in range(10):
    print(next(counter))  # 0, 1, 2, 3, 4, 5, 6, 7, 8, 9
⚠️ Ловушки и ограничения 1. Итератор можно использовать только один раз — после исчерпания он перестаёт работать.
   it = iter([1, 2, 3])
   print(list(it))  # [1, 2, 3]
   print(list(it))  # []
2. Не все итерируемые объекты поддерживают `len()` — итераторы не знают свою длину. 3. Не путайте итератор с генератором — генератор — это частный случай итератора, создаваемый через yield. Генератор проще писать, но он менее гибкий для сложной логики. 4. Итератор не может быть скопирован — состояние хранится внутри. 💡 Запомни:
🟢 Итератор — это объект с __iter__() и __next__(). Он выдаёт элементы по одному. 🟢 Итерируемый объект — это объект, у которого есть __iter__(), возвращающий итератор. 🟢 for работает с любым итерируемым объектом — для списков, строк, файлов, генераторов. 🟢 Итератор одноразовый — после исчерпания его нельзя использовать повторно. 🟢 Встроенные функции range(), enumerate(), zip(), map(), filter() возвращают итераторы.
Программистика|| #Статья

🗺 Что должен знать джун Python Backend?
📱 Первоисточник
Программистика|| #video

🖥 tzlocal — это модуль на языке Python, предназначенный для определения локального часового пояса системы и предоставления с
🖥 tzlocal — это модуль на языке Python, предназначенный для определения локального часового пояса системы и предоставления соответствующего объекта tzinfo! 🐱 Ссылка на GitHub Программистика|| #Репозиторий

🖥 tzlocal — это модуль на языке Python, предназначенный для определения локального часового пояса системы и предоставления с
🖥 tzlocal — это модуль на языке Python, предназначенный для определения локального часового пояса системы и предоставления соответствующего объекта tzinfo! 🐱 Ссылка на GitHub Программистика|| #Репозиторий

Пишешь на Python и задумываешься о повышении грейда? А уверен, что потянешь? Есть способ проверить себя — не дожидаясь реальн
+2
Пишешь на Python и задумываешься о повышении грейда? А уверен, что потянешь? Есть способ проверить себя — не дожидаясь реального собеседования. Кирилл Коданев — Senior Python-разработчик, который сам проводит собеседования. За плечами 17 офферов — среди них Avito, Т-Банк, X5. Он собрал тест-собеседование по Python: 15 вопросов на каждый грейд, от Intern до Senior. И это не просто вопросы — а именно те, на которых чаще всего валят на интервью. Не нагенеренные нейронкой, а реальные: Кирилл отобрал их сам, потому что точно знает, что и зачем спрашивают. Один из них, для примера:
Почему list.append() — это амортизированная O(1), хотя иногда Python копирует весь массив целиком?
Знаешь ответ — отлично. Нет — тебе точно сюда. Пройдёшь за ~10 минут и получишь: ⏺ свой реальный грейд и вилку зарплаты под него ⏺ темы, которые проседают (пока есть время подтянуть) ⏺ разбор каждого ответа лично от Кирилла Тест бесплатный, доступен по ссылке. P.S. У него же в канале — вся правда про найм в IT: что скрывают рекрутеры, как узнать реальную зарплату в вакансии и почему тебя не зовут на собесы.

⚡️ Секрет `functools.cache`: запоминай результаты одной строкой Устали писать словарь для кэширования результатов функции? В Python 3.9+ есть встроенный декоратор, который делает это автоматически.
from functools import cache

@cache
def fib(n):
    if n < 2:
        return n
    return fib(n-1) + fib(n-2)

print(fib(100))  # Мгновенно
@cache — это как @lru_cache(maxsize=None), только короче. Идеально для чистых функций, которые часто вызываются с одинаковыми аргументами. 🟢 Запомни: cache автоматически запоминает результаты вызовов. Не пишите свои кэши вручную. Программистика|| #tips

🧠 Отгадка: что выведет этот код?
def func(x):
    x = x + [1]
    return x

a = [0]
b = func(a)
print(a, b)
✅ Правильный ответ: 1. `[0] [0, 1]` 📖 Почему так происходит? Внутри функции func выполняется x = x + [1]. Это конкатенация, которая создаёт новый список, а не изменяет существующий. Переменная x становится локальной и указывает на новый объект [0, 1], а исходный список a остаётся нетронутым. Если бы мы использовали x.append(1), то изменили бы исходный список, и ответ был бы [0, 1] [0, 1]. Но здесь — создание нового объекта через +, поэтому a не меняется. Ключевой момент: + для списков возвращает новый объект, а += или append() изменяют существующий. Программистика|| #quiz

🧩 `functools.partial`: заморозь аргументы и получи новую функцию Вы когда-нибудь ловили себя на том, что передаёте одну и ту же функцию с одними и теми же аргументами в несколько мест? Или хотите создать специализированную версию существующей функции без переписывания кода? functools.partial — это инструмент, который "замораживает" часть аргументов функции, создавая новую функцию с меньшим количеством параметров. Идеально для колбэков, адаптеров и упрощения кода.
from functools import partial

def power(base, exponent):
    return base ** exponent

square = partial(power, exponent=2)
cube = partial(power, exponent=3)

print(square(5))  # 25
print(cube(5))    # 125
Где реально пригодится: - GUI-колбэки: когда обработчик требует функцию без аргументов, а вам нужно передать данные. - Сортировка с параметрами: заморозить key для sorted(). - API-клиенты: зафиксировать базовый URL или заголовки. - map/filter: когда нужно передать функцию с дополнительными параметрами.
# Пример с сортировкой
from operator import mul
double = partial(mul, 2)
print(list(map(double, range(5))))  # [0, 2, 4, 6, 8]

# Пример с колбэком
def log(level, message):
    print(f"[{level}] {message}")

info = partial(log, "INFO")
error = partial(log, "ERROR")

info("Сервер запущен")   # [INFO] Сервер запущен
error("Ошибка сети")     # [ERROR] Ошибка сети
💡 Запомни: partial — не магия, а удобный способ уменьшить дублирование и сделать код чище. Работает с любыми функциями, методами и даже классами. Программистика|| #doc

👩‍💻 FastAPI — Разбираем популярные вопросы с собеседований
📱 Первоисточник
Программистика|| #video

Утраиваем бюджет на продвижение в Директе Запустите первое продвижение в Яндекс Директе с утроенным бюджетом и ИИ-помощником
Утраиваем бюджет на продвижение в Директе Запустите первое продвижение в Яндекс Директе с утроенным бюджетом и ИИ-помощником ✨ Используйте один из промокодов : При пополнении от 10 000 ₽ +20 000 ₽ Промокод START20 При пополнении от 15 000 ₽ +30 000 ₽ Промокод START30 Зарегистрироваться #реклама 16+ direct.yandex.ru О рекламодателе

🧠 Загадка на ночь: что выведет этот код?
def func(x):
    x = x + [1]
    return x

a = [0]
b = func(a)
print(a, b)
Варианты: 1. [0] [0, 1] 2. [0, 1] [0, 1] 3. [0] [1] 4. Ошибка Пиши свой вариант в комментарии! Ответ и разбор — через пару часов 🔥 Программистика|| #quiz

Вы не пользуетесь даже 10% функциями нейросетей Вы знали, что с помощью ChatGPT можно пересылать деньги с карты на карту? А с
Вы не пользуетесь даже 10% функциями нейросетей Вы знали, что с помощью ChatGPT можно пересылать деньги с карты на карту? А слышали про режим в Claude, где он по голосовому сообщению создает 5-10 минутный ролик на YouTube? Чтобы выжать из нейронок максимум, пользуйтесь каналом ИИнтеллигенция. Там узнаете: ➜ Как бесплатно активировать Pro-тариф в ChatGPT и Gemini ➜ Какая нейронка за вас пройдет собеседование на работу ➜ Как с помощью ИИ восстановить удалённые сообщения в ТГ Подписывайтесь, потом сами себе спасибо скажете: https://t.me/+oyn1gm14ZwZhNDAy

🔍 Секрет `next()`: найди первый подходящий элемент без цикла Нужно найти первый элемент в списке, удовлетворяющий условию? Вместо цикла с break используйте next() с генератором. ❌ Было (цикл с флагом):
first = None
for item in items:
    if item > 10:
        first = item
        break
✅ Стало (одна строка):
first = next((item for item in items if item > 10), None)
next(iterable, default) возвращает следующий элемент итератора или default, если элементов больше нет. Идеально для поиска без лишнего кода. 🟢 Где пригодится: поиск первого валидного элемента, чтение первой строки из файла по условию, получение первого значения из генератора.
Запомни: next() + генератор = чистый и быстрый поиск.
Программистика|| #tips

🧰 Pelutils: швейцарский нож для Python-проектов
В каждом проекте рано или поздно появляется один и тот же набор утилит: удобный логгер с цветным выводом, парсер конфигов, таймер для замеров производительности, работа с JSON… Можно каждый раз писать это заново, а можно взять готовый инструмент, который уже всё умеет. Pelutils — это именно такой набор. Логгер с цветным выводом, стектрейсами и ротацией файлов, парсер, объединяющий CLI-аргументы и конфиги, таймер в стиле Matlab (tic/toc), профайлер, расширение для pydantic с сериализацией в человекочитаемый JSON, форматирование таблиц с поддержкой LaTeX и даже unique для массивов, работающий за линейное время.
📦 Установка:
pip install pelutils
Поддерживается Python 3.9+. 🧪 Пример:
from pelutils import TT

# Замер времени
TT.tick()
# ... ваш код ...
print(f"Время: {TT.tock():.2f} сек")

# Профилирование
with TT.profile("Мой код"):
    # ... код ...
print(TT)  # Таблица с результатами
Программистика|| #Репозиторий

🔠 Слили 4 ТБ по IT, хакингу и разработке. ⚪️ Все лучшие инструкции, гайды, книги и инструменты — без воды. 🖥 Курсы & GitHub
🔠 Слили 4 ТБ по IT, хакингу и разработке. ⚪️ Все лучшие инструкции, гайды, книги и инструменты — без воды. 🖥 Курсы & GitHub — 579GB ☁️ Хакинг & ИБ — 756GB 🤒 OSINT — 315GB ⌨️ Python — 955GB 🙃 Linux & Bash — 459GB 😦 Работа в IT — 278GB 🖥 Общий архив — 946GB ➡️ Присоединяйтесь и скачивайте. Пост будет удален через 48 часов.

💻 Вопрос из собеседования: Чем отличается `__getattr__` от `__getattribute__`? Этот вопрос проверяет, насколько глубоко вы понимаете механизм доступа к атрибутам в Python. Оба метода перехватывают обращение к атрибутам, но работают по‑разному и в разных ситуациях. Путаница в них может привести к трудноуловимым багам, особенно в прокси‑классах и ORM.
class Example:
    def __getattr__(self, name):
        print(f"__getattr__: {name}")
        return None

    def __getattribute__(self, name):
        print(f"__getattribute__: {name}")
        return super().__getattribute__(name)

obj = Example()
obj.x  # __getattribute__: x → __getattr__: x → None
👉 Базовый ответ (которого ждут): - __getattribute__ вызывается при любом обращении к атрибуту (даже если он существует). - __getattr__ вызывается только если обычный поиск атрибута не удался (т.е. атрибут не найден ни в __dict__, ни в родителях, ни через дескрипторы). 👉 Глубокий разбор (для мидла+): 1. `__getattribute__` — это первая точка входа. Он перехватывает все обращения, включая доступ к self.__dict__, и если вы не будете осторожны, легко уйти в бесконечную рекурсию. 2. `__getattr__` — это «запасной аэродром». Он срабатывает только после того, как стандартный поиск провалился. 3. Порядок поиска атрибута: - data‑дескриптор в классе → атрибут экземпляра → non‑data дескриптор → __getattr__ → AttributeError. 4. Где применяются: - __getattr__ удобен для динамических атрибутов (например, в ORM, где поле может отсутствовать в модели, но быть в базе данных). - __getattribute__ используется реже — для строгого контроля доступа (логирование, валидация), но требует аккуратной работы с super(). ⚠️ Ловушки и частые ошибки: 1. Бесконечная рекурсия в `__getattribute__` — если внутри него обратиться к self.attr, он вызовет сам себя.
   def getattribute(self, name):
       return self.dict[name]  # ❌ рекурсия!
Правильно: return super().__getattribute__(name). 2. Забыть, что `__getattr__` не сработает для существующих атрибутов — если вы динамически создаёте атрибут, он станет существующим, и __getattr__ больше не будет вызван. 3. Путаница с `__setattr__` — есть отдельный метод для перехвата записи атрибутов. 🧪 Пример: динамический доступ с `__getattr__`
class DynamicAttrs:
    def __init__(self):
        self.data = {'name': 'Алиса', 'age': 30}
    def __getattr__(self, name):
        if name in self.data:
            return self.data[name]
        raise AttributeError(f"Нет атрибута {name}")

obj = DynamicAttrs()
print(obj.name)  # Алиса
print(obj.age)   # 30
print(obj.city)  # AttributeError
Пример: логирование через `__getattribute__`
class LoggedAttrs:
    def __getattribute__(self, name):
        value = super().__getattribute__(name)
        print(f"Доступ к {name}: {value}")
        return value
Программистика|| #jobs