Программистика
کانال بسته
Лучший канал про python Ссылка для друга: https://t.me/+Ai6ughKtf5g2ZmFi Купить рекламу: https://telega.in/c/+Ai6ughKtf5g2ZmFi Админ: @JeyRahol По рекламе: @ReivuManager
نمایش بیشتر5 791
مشترکین
-624 ساعت
+157 روز
-4130 روز
آرشیو پست ها
5 791
👩💻 Однострочники на 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 видит твой код.
Программистика || #doc5 791
Уйти из найма и работать удалённо на себя?
Звучит как план на понедельник, но к четвергу отпускает.
Я ни дня своей жизни не проработал «на дядю» — зато построил десятки собственных проектов и вывел их на монетизацию.
Где-то стрельнуло, где-то прогорел, никакого инфоцыганства, только личный опыт и практика со всеми взлётами и падениями.
У себя в блоге «айти на миллиард» пишу:
– Как находить идеи? – Как быстро запускать MVP? – Как привлекать первых пользователей?Если тебе близка айти-сфера и ты давно хочешь создать свой пет-проект, нам по пути: https://t.me/+P9xCxnr5WlA1MjMy
5 791
👩💻 Вопрос с собеседования: Что такое замыкание (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 и упомянете ловушку с циклом — интервьюер поймёт, что вы действительно разбираетесь.
Программистика || #jobs5 791
⚡️Слита База из 1000+ топовых курсов и материалов для айтишников
Отсортировали их для вашего удобства и выложили в телеграм-каналы по категориям:
🤖 Нейросети – 855+ материалов
🖥 Python — 1558+ материалов
👩💻 Frontend — 1241+ материалов
👩💻 Backend — 1095+ материалов
⚙️ Программы — 978+ материалов
📚 Книги по IT — 779+ материалов
Всё лучшее про IT бесплатно — уже на Базе 🚀
5 791
🧠 Неизвестный кодер взломал ChatGPT и вывел систему из-под всех запретов
После его промта нейросеть перестаёт «думать по правилам» и начинает выдавать запретные материалы, 18+ графику и скрытые функции
Этот человек анонимно выкладывает свои наработки бесплатно в НейроПульс:
— Скрипт, отключающий лимит в ChatGPT и ещё 25 нейросетях
— Промт, который создаёт вирусы даже под iOS
— Алгоритм распознавания личных данных
Сохраняй и пользуйся, пока доступно: https://t.me/+V19zvWBfVYIwN2Uy
5 791
Repost from Карманный хакер
🗂 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 — не баг, а образ жизни.
➡️Ссылка
Карманный хакер
5 791
👩💻 Декораторы в 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.
Программистика || #Статья5 791
Поздравление с 23 февраля!!
Сегодня, день,когда мы отмечаем мужество, отвагу и преданность. В этот особый день хочется пожелать Вам:
1) Смелости в принятии решений и стремлении к новым вершинам. 2) Удачи в каждом начинании и ярких побед. 3) Счастья в кругу близких и друзей. 4) Здоровья и крепкой энергии для реализации всех планов. 5) Вдохновения в работе и личной жизни.Пусть каждый день будет наполнен яркими моментами, а ваши сердца всегда будут полны решимости и доброты. Спасибо, что вы с нами, и пусть наш канал продолжает приносить радость и полезную информацию!!! С праздником, дорогие друзья 🎉
5 791
Поздравление с 23 февраля!!
Сегодня, день,когда мы отмечаем мужество, отвагу и преданность. В этот особый день хочется пожелать Вам:
1) Смелости в принятии решений и стремлении к новым вершинам. 2) Удачи в каждом начинании и ярких побед. 3) Счастья в кругу близких и друзей. 4) Здоровья и крепкой энергии для реализации всех планов. 5) Вдохновения в работе и личной жизни.Пусть каждый день будет наполнен яркими моментами, а ваши сердца всегда будут полны решимости и доброты. Спасибо, что вы с нами, и пусть наш канал продолжает приносить радость и полезную информацию!!! С праздником, дорогие друзья 🎉
5 791
⚡️Hype Tech анонимно публикует промпты, ломающие ИИ-ограничения
Генерируй 18+ изображения, создавай вирусы и упрости ЛЮБУЮ рутину — всё это бесплатно и в открытом доступе
Топ-промты от Hype Tech:
• Баг на бесконечный доступ в NanoBanana и ChatGPT
• Промпты для снятия цензуры с ChatGPT
• Полный пробив и поиск скрытых данных человека
Подпишись и забери самые мощные ИИ для твоего арсенала: https://t.me/+xjSLfhZQOwMGQy
5 791
Python для геймеров: программирование на игровых примерах
Для кого этот курс:
Для новичков, которые хотят изучить программирование с нуля. Для школьников и студентов, мечтающих создавать свои игры. Для тех, кто хочет изучать Python без зубрёжки. Для всех, кто хочет попрактиковаться в решении интересных задач!!!!!!!!
🌐 СсылкаПрограммистика || #Course
5 791
Python для геймеров: программирование на игровых примерах
Для кого этот курс
Для новичков, которые хотят изучить программирование с нуля. Для школьников и студентов, мечтающих создавать свои игры. Для тех, кто хочет изучать Python без зубрёжки. Для всех, кто хочет попрактиковаться в решении интересных задач!
5 791
Здравствуйте, папищики!
Наверное, уже многие заметили, что телеграм в РФ начали замедлять.
Поэтому мы сделали, вой впн сервис, который помогает обойти все блокировки
Заходите: @PocketVPNtg_bot
5 дней бесплатно
5 791
🚀 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]"
🐱 Ссылка на репозиторий
Программистика|| #Library5 791
📸 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