ar
Feedback

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

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

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

قناة بسيطة

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

إظهار المزيد
5 791
المشتركون
-624 ساعات
+157 أيام
-4130 أيام
أرشيف المشاركات
👩‍💻 Однострочники на Python: код, который объясняется кодом Однострочники в Python — это не только способ покрасоваться, но и отличный способ понять, как работают встроенные функции и генераторы. Когда ты видишь [x for x in ... if ...], внутри происходит целая симфония: итерация, фильтрация, создание списка. Давай разберём пару примеров и заглянем под капот. 👍 Пример 1: Плоский список из списка списков
matrix = [[1, 2], [3, 4], [5, 6]]
flat = [num for row in matrix for num in row]
print(flat)  # [1, 2, 3, 4, 5, 6]
Что здесь происходит? Этот comprehension можно переписать как обычный вложенный цикл:
flat = []
for row in matrix:
    for num in row:
        flat.append(num)
Но comprehension выполняется быстрее и записывается компактнее. Обрати внимание на порядок: сначала внешний цикл (for row in matrix), потом внутренний (for num in row), и наконец выражение num. Python интерпретирует именно так. Заглянем под капот:
def flatten_comp(matrix):
    return [num for row in matrix for num in row]

import dis
dis.dis(flatten_comp)
Вы увидите байт-код, где создаётся пустой список, затем два цикла FOR_ITER, и внутри LIST_APPEND. Понимание этого помогает писать эффективные comprehension. 👍 Пример 2: Словарь из двух списков (zip + dict)
keys = ['name', 'age', 'city']
values = ['Alice', 25, 'Moscow']
person = dict(zip(keys, values))
print(person)  # {'name': 'Alice', 'age': 25, 'city': 'Moscow'}
Что здесь происходит? zip соединяет элементы списков попарно, создавая итератор кортежей. dict принимает итератор пар и строит словарь. Это намного быстрее ручного цикла:
person = {}
for i in range(len(keys)):
    person[keys[i]] = values[i]
И компактнее, и эффективнее. Кстати, zip работает с любыми итерируемыми объектами и останавливается на самом коротком. Как это работает внутри:
pairs = zip(keys, values)
print(next(pairs))  # ('name', 'Alice')
print(next(pairs))  # ('age', 25)
# и так далее
👍 Пример 3: Быстрая фильтрация с filter и лямбдой
nums = [1, 2, 3, 4, 5, 6]
evens = list(filter(lambda x: x % 2 == 0, nums))
print(evens)  # [2, 4, 6]
Что здесь происходит? filter принимает функцию и итерируемый объект, оставляет только те элементы, для которых функция вернула True. Но зачем лямбда? Можно использовать уже готовые функции. Например, для чётности можно было бы написать lambda x: not x % 2, но суть не в этом. Интересно, что filter возвращает итератор, поэтому мы оборачиваем в list(). Если элементов много, можно не создавать список сразу, а использовать ленивые вычисления. Развернём вручную:
def my_filter(func, iterable):
    for item in iterable:
        if func(item):
            yield item

evens = list(my_filter(lambda x: x % 2 == 0, nums))
👍 Пример 4: Условное выражение в генераторе списка
words = ['hello', 'world', 'python', 'code']
result = [w.upper() if len(w) > 4 else w for w in words]
print(result)  # ['hello', 'WORLD', 'PYTHON', 'code']
Что здесь происходит? Тернарный оператор x if condition else y внутри comprehension. Это не фильтр, а именно преобразование с условием. Важно понимать, что сначала выполняется for w in words, затем для каждого w вычисляется w.upper() if len(w) > 4 else w. Порядок: сначала цикл, потом выражение. Байт-код это подтвердит:
def f(words):
    return [w.upper() if len(w) > 4 else w for w in words]
Будет цикл, внутри вызов len, сравнение, и два пути — либо upper, либо просто w. 🔍 Задание для самопроверки: Напишите comprehension, который создаёт словарь, где ключи — числа от 0 до 9, а значения — их квадраты. А теперь объясните, как это работает внутри. Ответ:
{k: k**2 for k in range(10)}
Здесь итерация по range(10), для каждого k вычисляется пара k: k**2, и словарь собирается. Внутри — цикл и добавление элементов. 💡 Запомни: Чем лучше ты понимаешь, как работает "под капотом" обычный код, тем осознаннее будешь использовать короткие записи. Однострочники — это не цель, а средство. Главное — чтобы код оставался читаемым. А теперь попробуй сам разобрать любой свой comprehension с помощью dis.dis() — увидишь, как Python видит твой код. Программистика || #doc

Уйти из найма и работать удалённо на себя? Звучит как план на понедельник, но к четвергу отпускает. Я ни дня своей жизни не проработал «на дядю» — зато построил десятки собственных проектов и вывел их на монетизацию. Где-то стрельнуло, где-то прогорел, никакого инфоцыганства, только личный опыт и практика со всеми взлётами и падениями. У себя в блоге «айти на миллиард» пишу:
– Как находить идеи? – Как быстро запускать MVP? – Как привлекать первых пользователей?
Если тебе близка айти-сфера и ты давно хочешь создать свой пет-проект, нам по пути: https://t.me/+P9xCxnr5WlA1MjMy

👩‍💻 Вопрос с собеседования: Что такое замыкание (closure) и как оно работает в Python? Это один из вопросов, который проверяет, понимаете ли вы, как Python работает с областями видимости и функциями высшего порядка. Просто сказать «функция внутри функции» — мало. Надо показать, как захватываются переменные и где это применяется. 📌 Базовый ответ (которого ждут от джуна): Замыкание (closure) — это вложенная функция, которая запоминает значения переменных из внешней (охватывающей) функции, даже после того, как внешняя функция завершила выполнение.
def outer(x):
    def inner(y):
        return x + y
    return inner

add_5 = outer(5)      # x = 5 зафиксировано
print(add_5(10))      # 15 — inner помнит x
🧱 Глубокий разбор (для мидла и сеньора): 1. Как это работает (лексическая область видимости): При создании вложенной функции Python запоминает не только её код, но и окружение (словарь __closure__), где хранятся ссылки на переменные из внешних областей.
print(add_5.__closure__)      # (<cell at 0x...: int object at 0x...>,)
print(add_5.__closure__[0].cell_contents)  # 5
2. Ключевое слово `nonlocal`: Чтобы изменять захваченную переменную внутри замыкания, нужно объявить её как nonlocal. Иначе Python сочтёт её локальной.
def counter():
    count = 0
    def increment():
        nonlocal count
        count += 1
        return count
    return increment

c = counter()
print(c())  # 1
print(c())  # 2
3. Типичные применения: 🟢 Декораторы — классика: внешняя функция принимает функцию, внутренняя оборачивает её, используя аргументы декоратора. 🟢 Фабрики функций — создание специализированных функций на лету (как add_5 выше). 🟢 Обработчики событий / коллбэки — фиксация состояния в момент создания. 4. Ловушка: позднее связывание (late binding) В цикле все созданные замыкания запоминают одно и то же последнее значение переменной, если не использовать хитрость с аргументом по умолчанию.
funcs = []
for i in range(3):
    funcs.append(lambda: i)

for f in funcs:
    print(f())  # 2 2 2, а не 0 1 2

# Исправление:
funcs = []
for i in range(3):
    funcs.append(lambda x=i: x)   # фиксируем значение через аргумент
💡 Итоговый ответ для собеседования: 1. Определение: Вложенная функция, которая сохраняет доступ к переменным внешней функции после её завершения. 2. Механизм: Интерпретатор хранит ссылки на захваченные переменные в атрибуте __closure__. 3. Ключевой момент: Для изменения захваченной переменной внутри замыкания нужно nonlocal. 4. Где используется: Декораторы, фабрики функций, коллбэки, карринг. 5. Типичная ошибка: Позднее связывание в циклах — замыкания захватывают не значение, а переменную, поэтому все видят последнее значение. Запомните: джуну достаточно первого пункта и простого примера. Но если вы покажете __closure__, расскажете про nonlocal и упомянете ловушку с циклом — интервьюер поймёт, что вы действительно разбираетесь. Программистика || #jobs

⚡️Слита База из 1000+ топовых курсов и материалов для айтишников Отсортировали их для вашего удобства и выложили в телеграм-каналы по категориям: 🤖 Нейросети – 855+ материалов 🖥 Python — 1558+ материалов 👩‍💻 Frontend — 1241+ материалов 👩‍💻 Backend — 1095+ материалов ⚙️ Программы — 978+ материалов 📚 Книги по IT — 779+ материалов Всё лучшее про IT бесплатно — уже на Базе 🚀

🧠 Неизвестный кодер взломал ChatGPT и вывел систему из-под всех запретов После его промта нейросеть перестаёт «думать по пра
🧠 Неизвестный кодер взломал ChatGPT и вывел систему из-под всех запретов После его промта нейросеть перестаёт «думать по правилам» и начинает выдавать запретные материалы, 18+ графику и скрытые функции Этот человек анонимно выкладывает свои наработки бесплатно в НейроПульс: — Скрипт, отключающий лимит в ChatGPT и ещё 25 нейросетях — Промт, который создаёт вирусы даже под iOS — Алгоритм распознавания личных данных Сохраняй и пользуйся, пока доступно: https://t.me/+V19zvWBfVYIwN2Uy

🗂 WinFile — тот самый древний “Диспетчер файлов” из Windows 90-х. И да, Microsoft выложила его исходники на GitHub ещё в 201
🗂 WinFile — тот самый древний “Диспетчер файлов” из Windows 90-х. И да, Microsoft выложила его исходники на GitHub ещё в 2018-м. Это был их первый нормальный графический файл-менеджер: копировать/таскать/удалять мышкой — революция для тех лет. Репо тут: https://github.com/Microsoft/winfile Пару фактов, чтобы прочувствовать эпоху: первая версия была 16-битная и жила в мире 8.3: никаких пробелов, никаких “длинных имён”. Хотел “LongFileName.txt”? Получай LONGFI~1.TXT. потом переписали под Windows NT (32-bit) — длинные имена, NTFS, взрослая жизнь. как компонент Windows он дожил до NT 4.0 SP6a, а последняя 16-битная версия — до Windows Me. В репозитории код из ветки NT4, слегка подпиленный, чтобы нормально собираться на современных Windows/VS и запускаться на 64-битах. Запускаешь — и ловишь главное: Windows тащит на себе такую обратную совместимость, что софт из прошлого века всё ещё оживает почти без сопротивления. Для безопасника это не “милота”, а напоминание: legacy в Windows — не баг, а образ жизни. ➡️Ссылка Карманный хакер

👩‍💻 Декораторы в Python: от простого к сложному (и не сойти с ума) Декораторы — одна из самых элегантных, но и самых пугающ
👩‍💻 Декораторы в Python: от простого к сложному (и не сойти с ума) Декораторы — одна из самых элегантных, но и самых пугающих фич Python для новичков. "Функция, которая принимает функцию и возвращает функцию, которая оборачивает функцию"... Звучит как заклинание. На деле же это просто способ добавить код до и после вызова функции, не меняя её саму. Разбираемся, как перестать бояться и начать декорировать. 🧱 Что такое декоратор (на пальцах) Декоратор — это функция, которая принимает другую функцию и возвращает её же, но с «прицепом». Представь, что ты хочешь логировать каждый вызов функции. Вместо того чтобы вставлять print в каждую функцию, ты пишешь один декоратор и просто «надеваешь» его на нужные функции знаком @. Пример простейшего декоратора:
def logger(func):
    def wrapper(*args, **kwargs):
        print(f"Вызов функции {func.__name__} с args={args}, kwargs={kwargs}")
        result = func(*args, **kwargs)
        print(f"Результат: {result}")
        return result
    return wrapper

@logger
def add(a, b):
    return a + b

add(2, 3)
# Вывод:
# Вызов функции add с args=(2, 3), kwargs={}
# Результат: 5
Синтаксический сахар @logger делает то же самое, что и add = logger(add). Просто и красиво. 🧱 Когда декораторы — это хорошо (и удобно) 1️⃣. Логирование и отладка:
```python
def log_calls(func):
    def wrapper(*args, **kwargs):
        print(f"→ {func.__name__}")
        return func(*args, **kwargs)
    return wrapper

@log_calls
def process_data():
    # ... долгая работа
    pass
```
2️⃣. Замер времени выполнения:
```python
import time

def timer(func):
    def wrapper(*args, **kwargs):
        start = time.time()
        result = func(*args, **kwargs)
        print(f"{func.__name__} выполнена за {time.time()-start:.3f} сек")
        return result
    return wrapper

@timer
def heavy_computation():
    time.sleep(1)
```
🧱 Когда декораторы могут навредить (антипаттерны) 1. ❌ Потеря имени и документации исходной функции:
def logger(func):
    def wrapper(*args, **kwargs):
        return func(*args, **kwargs)
    return wrapper

@logger
def hello():
    """Говорит привет"""
    print("Hello")

print(hello.__name__)  # 'wrapper' — потеряли имя!
print(hello.__doc__)   # None — потеряли документацию!
Решение: использовать functools.wraps:
from functools import wraps

def logger(func):
    @wraps(func)
    def wrapper(*args, **kwargs):
        return func(*args, **kwargs)
    return wrapper
2. ❌ Слишком много декораторов (читаемость падает):
@login_required
@require_http_methods(["POST"])
@csrf_exempt
@cache_page(60)
@transaction.atomic
def my_view(request):
    # Что тут вообще происходит?
    pass
Совет: группируйте декораторы, выносите сложную логику в отдельные функции. 3. ❌ Декоратор с аргументами (без понимания):
def repeat(n):
    def decorator(func):
        @wraps(func)
        def wrapper(*args, **kwargs):
            for _ in range(n):
                func(*args, **kwargs)
        return wrapper
    return decorator

@repeat(3)
def say():
    print("Ку-ку")
Здесь repeat — это фабрика декораторов. Сначала вызывается repeat(3), она возвращает декоратор, который уже применяется к функции. Если запутались — ничего страшного, пишите явно: @repeat(3). 🔗 Подробнее в статье 👍 Запомни: Декораторы — это не магия, а просто синтаксический сахар для замыканий. Они делают код чище и переиспользуемее. Начинай с простых (@timer, @logger), а потом переходи к фабрикам с аргументами. И никогда не забывай про @wraps. Программистика || #Статья

Поздравление с 23 февраля!! Сегодня, день,когда мы отмечаем мужество, отвагу и преданность. В этот особый день хочется пожела
Поздравление с 23 февраля!! Сегодня, день,когда мы отмечаем мужество, отвагу и преданность. В этот особый день хочется пожелать Вам:
1) Смелости в принятии решений и стремлении к новым вершинам. 2) Удачи в каждом начинании и ярких побед. 3) Счастья в кругу близких и друзей. 4) Здоровья и крепкой энергии для реализации всех планов. 5) Вдохновения в работе и личной жизни.
Пусть каждый день будет наполнен яркими моментами, а ваши сердца всегда будут полны решимости и доброты. Спасибо, что вы с нами, и пусть наш канал продолжает приносить радость и полезную информацию!!! С праздником, дорогие друзья 🎉

Поздравление с 23 февраля!! Сегодня, день,когда мы отмечаем мужество, отвагу и преданность. В этот особый день хочется пожела
Поздравление с 23 февраля!! Сегодня, день,когда мы отмечаем мужество, отвагу и преданность. В этот особый день хочется пожелать Вам:
1) Смелости в принятии решений и стремлении к новым вершинам. 2) Удачи в каждом начинании и ярких побед. 3) Счастья в кругу близких и друзей. 4) Здоровья и крепкой энергии для реализации всех планов. 5) Вдохновения в работе и личной жизни.
Пусть каждый день будет наполнен яркими моментами, а ваши сердца всегда будут полны решимости и доброты. Спасибо, что вы с нами, и пусть наш канал продолжает приносить радость и полезную информацию!!! С праздником, дорогие друзья 🎉

⚡️Hype Tech анонимно публикует промпты, ломающие ИИ-ограничения Генерируй 18+ изображения, создавай вирусы и упрости ЛЮБУЮ ру
⚡️Hype Tech анонимно публикует промпты, ломающие ИИ-ограничения Генерируй 18+ изображения, создавай вирусы и упрости ЛЮБУЮ рутину — всё это бесплатно и в открытом доступе Топ-промты от Hype Tech: • Баг на бесконечный доступ в NanoBanana и ChatGPT • Промпты для снятия цензуры с ChatGPT • Полный пробив и поиск скрытых данных человека Подпишись и забери самые мощные ИИ для твоего арсенала: https://t.me/+xjSLfhZQOwMGQy

Python для геймеров: программирование на игровых примерах Для кого этот курс: Для новичков, которые хотят изучить программиро
Python для геймеров: программирование на игровых примерах Для кого этот курс:
Для новичков, которые хотят изучить программирование с нуля. Для школьников и студентов, мечтающих создавать свои игры. Для тех, кто хочет изучать Python без зубрёжки. Для всех, кто хочет попрактиковаться в решении интересных задач!!!!!!!!
🌐 Ссылка
Программистика || #Course

Python для геймеров: программирование на игровых примерах Для кого этот курс Для новичков, которые хотят изучить программирование с нуля. Для школьников и студентов, мечтающих создавать свои игры. Для тех, кто хочет изучать Python без зубрёжки. Для всех, кто хочет попрактиковаться в решении интересных задач!

Здравствуйте, папищики! Наверное, уже многие заметили, что телеграм в РФ начали замедлять. Поэтому мы сделали, вой впн сервис, который помогает обойти все блокировки Заходите: @PocketVPNtg_bot 5 дней бесплатно

👩‍💻 СОЗДАНИЕ ANDROID ПРИЛОЖЕНИЯ на PYTHON
🎥 Первоисточник
Программистика|| #video

🚀 Typer: Создавай CLI-приложения как бог (и забудь про argparse) Устал писать сотни строк с argparse, мучиться с позиционными аргументами и флагами? Каждый раз одно и то же: add_argument, проверка типов, помощь пользователю. Пора автоматизировать эту рутину. Typer — это библиотека для создания CLI-приложений, которая использует аннотации типов Python. Она построена поверх click, но работает в разы проще: ты просто пишешь функции, а Typer сам превращает их в команды. ❌ Было (муки с argparse):
import argparse

parser = argparse.ArgumentParser()
parser.add_argument("name", help="Имя пользователя")
parser.add_argument("--age", type=int, help="Возраст")
parser.add_argument("--admin", action="store_true", help="Админ?")
args = parser.parse_args()

print(f"Привет, {args.name}")
if args.age:
    print(f"Тебе {args.age} лет")
if args.admin:
    print("Ты админ!")
✔️ Стало (элегантный Typer):
import typer

app = typer.Typer()

@app.command()
def greet(name: str, age: int = None, admin: bool = False):
    """Приветствие пользователя"""
    print(f"Привет, {name}")
    if age:
        print(f"Тебе {age} лет")
    if admin:
        print("Ты админ!")

if __name__ == "__main__":
    app()
Запуск:
python script.py Гвидо --age 65 --admin
# Автоматически получаешь help: python script.py --help
➕ Почему Typer — это любовь: 🟢 Минимум кода: Аннотации типов = валидация, подсказки, документация. 🟢 Авто‑help: --help генерируется из докстрингов и типов. 🟢 Поддержка сложных типов: Enum, Path, datetime, вложенные команды. 🟢 Цветной вывод: Красивые ошибки и подсказки прямо из коробки. ➖ Особенности: ➖ Ещё одна зависимость (но лёгкая). ➖ Для совсем простых скриптов может быть избыточен. 🧪 Продвинутый пример:
import typer
from enum import Enum

class Color(str, Enum):
    red = "red"
    green = "green"
    blue = "blue"

app = typer.Typer()

@app.command()
def paint(color: Color = Color.blue, 
          size: float = typer.Option(1.0, help="Размер кисти"),
          background: bool = False):
    """Рисуем фигуру"""
    typer.echo(f"🎨 Рисую цветом {color.value}, размер {size}")
    if background:
        typer.echo("   с фоном")

@app.command()
def clean():
    """Очистить холст"""
    typer.echo("🧹 Холст очищен")

if __name__ == "__main__":
    app()
Установка:
pip install typer
# Для цветного вывода и прогресс-баров: pip install "typer[all]"
🐱 Ссылка на репозиторий Программистика|| #Library

⠀ ⠀ ⠀ ⠀ ⠀ ⠀ ⠀ 😎 IT-юмор за 300 😎 IT-юмор за 300 😎 IT-юмор за 300 ⠀ ⠀ ⠀ ⠀ ⠀ ⠀

📸 Image Downloader: Скрипт для массового скачивания картинок с любой страницы Нашёл классную подборку обоев или мемов? Хочешь сохранить все картинки с сайта, но не кликать по каждой правой кнопкой мыши? Этот скрипт сделает всё за тебя: найдёт все изображения на странице и скачает их в отдельную папку. 👉 Скрипт `image_downloader.py`:
#!/usr/bin/env python3
"""
Скрипт для скачивания всех картинок с веб-страницы.
Использование: python image_downloader.py https://example.com
"""

import os
import sys
import requests
from urllib.parse import urljoin, urlparse
from bs4 import BeautifulSoup
from pathlib import Path

def download_images(url, folder='downloaded_images'):
    # Создаём папку для сохранения
    Path(folder).mkdir(exist_ok=True)
    
    # Загружаем страницу
    headers = {'User-Agent': 'Mozilla/5.0'}
    try:
        response = requests.get(url, headers=headers, timeout=10)
        response.raise_for_status()
    except Exception as e:
        print(f"❌ Ошибка загрузки страницы: {e}")
        return
    
    soup = BeautifulSoup(response.text, 'html.parser')
    
    # Находим все теги img
    img_tags = soup.find_all('img')
    print(f"🔍 Найдено изображений: {len(img_tags)}")
    
    # Фильтруем и скачиваем
    downloaded = 0
    for img in img_tags:
        img_url = img.get('src')
        if not img_url:
            continue
        
        # Превращаем относительный URL в абсолютный
        img_url = urljoin(url, img_url)
        
        # Пропускаем data: и другие не-http схемы
        if not img_url.startswith(('http://', 'https://')):
            continue
        
        # Получаем имя файла
        parsed = urlparse(img_url)
        filename = os.path.basename(parsed.path)
        if not filename or '.' not in filename:
            filename = f"image_{downloaded}.jpg"
        
        # Защита от дурака: убираем query-параметры
        filename = filename.split('?')[0]
        
        save_path = Path(folder) / filename
        
        # Скачиваем
        try:
            img_data = requests.get(img_url, headers=headers, timeout=10)
            img_data.raise_for_status()
            
            with open(save_path, 'wb') as f:
                f.write(img_data.content)
            
            print(f"✅ {filename}")
            downloaded += 1
        except Exception as e:
            print(f"❌ Не удалось скачать {img_url}: {e}")
    
    print(f"\n📊 Готово! Скачано {downloaded} изображений в папку {folder}")

if __name__ == '__main__':
    if len(sys.argv) < 2:
        print("Использование: python image_downloader.py <URL>")
        sys.exit(1)
    
    url = sys.argv[1]
    download_images(url)
🛠 Установка зависимостей:
pip install requests beautifulsoup4
🚀 Запуск:
python image_downloader.py https://example.com/gallery
➕ Фишки скрипта: 🟢 Автоматически создаёт папку downloaded_images 🟢 Превращает относительные ссылки в абсолютные 🟢 Пропускает data:URI и другие некорректные схемы 🟢 Обрабатывает ошибки при скачивании 🟢 Игнорирует URL с параметрами (обрезает ?...) 💡 Что можно улучшить: 🟢 Добавить поддержку srcset для выбора лучшего качества 🟢 Фильтровать по минимальному размеру 🟢 Сохранять исходную структуру подпапок 🟢 Распараллелить скачивание (threading) Программистика || #scripts