58174
Всё самое интересное из мира Python Связь: @devmangx РКН: https://clck.ru/3GMMF6
Немного базы Python. День 6 - Обмен значениями переменных
В Python можно менять местами переменные после того, как им уже присвоены объекты. Ниже мы сначала присваиваем 20 переменной x и 30 переменной y, а потом меняем их местами: x становится 30, а y становится 20. Этот способ называется упаковкой и распаковкой кортежа (tuple packing/unpacking).
x, y = 20, 30
x, y = y, x
print('x is: ', x)
print('y is: ', y)
x is 30
y is 20
x и y.x = 20
y = 30
# шаг первый
x ^= y
# шаг второй
y ^= x
# шаг третий
x ^= y
print(f'x is: {x}')
print(f'y is: {y}')
x is: 30
y is: 20
# Используем арифметические операции
x = 5
y = 10
x = x + y
y = x - y
x = x - y
print("After swapping:")
print("x =", x)
print("y =", y)
After swapping:
x = 10
y = 5
x и y были фактически поменяны местами. После обмена x содержит исходное значение y (10), а y содержит исходное значение x (5).
Чувак сжал 2,87 ГБ данных до 8,9 МБ (!) с помощью своего кастомного компрессора данных :D
Там было 21k JSON-файлов с данными о крикетных матчах, он использовал их структуру и сжал это до ~42,46 МБ
Максимум, что смог gzip, это ~53 МБ, а 7z ~45 МБ.
Потом он скомбинировал свой компрессор + 7z и ужал до 8,9 МБ
Это ЧИСТАЯ случайность, дальше сжать уже просто нельзя.
Ему пришлось почитать про энтропию Шеннона и алгоритмическое сжатие данных
Полный разбор в GitHub-репозитории 😎
👉 @PythonPortal
Совет для AI-инженеров 💡
Небольшая VLM, дообученная на вашем кастомном датасете, по точности может быть на уровне GPT-5 и при этом стоит в 50 раз дешевле.
Например, LFM2.5-VL-1.6B от Liquid Ai можно гонять локально на полной скорости через llama.cpp ↓
- Python CLI пример
👉 @PythonPortal
Немного базы. День 3: Календарь в Python
В Python есть встроенный модуль calendar. Мы можем импортировать этот модуль, чтобы вывести календарь. С календарём можно делать много разных вещей.
Допустим, мы хотим посмотреть апрель 2022 года. Мы используем класс month из модуля calendar и передадим год и месяц в качестве аргументов. См. ниже:
import calendar
month = calendar.month(2022, 4)
print(month)
calendar. Например, с его помощью можно проверить, является ли заданный год високосным или нет. Давай проверим, високосный ли 2022 год.import calendar
month = calendar.isleap(2022)
print(month)
False
На Stepik добавили курс «Linux с нуля»
Этот курс закрывает всю обязательную Linux-базу для работы в IT. Подойдёт для:
- разработчиков
- девопсов и админов
- специалистов по данным и ML
- специалистов поддержки и сопровождения
- тестировщиков и безопасников
23LINUX30»: открыть курс на Stepik
Читать полностью…
Немного базы Python. День 2: cлияние словарей
Если у тебя есть два словаря, которые нужно объединить, это можно сделать двумя простыми способами. Можно использовать оператор merge (|) или оператор (**). Ниже у нас есть два словаря: first_dict и second_dict. Мы будем использовать эти два метода, чтобы объединить словари. Вот код:
1️⃣ Использование оператора merge (|)
first_dict = {"kelly": 23,
"Derick": 14, "John": 7}
second_dict = {"Ravi": 45, "Mpho": 67}
combined_dict = first_dict | second_dict
print(combined_dict){'kelly': 23, 'Derick': 14, 'John': 7, 'Ravi': 45, 'Mpho': 67}**)*. Оба словаря заключены в фигурные скобки и разделены запятой.first_dict = {"kelly": 23,
"Derick": 14, "John": 7}
second_dict = {"Ravi": 45, "Mpho": 67}
combined_dict = {**first_dict, **second_dict}
print(combined_dict){'kelly': 23, 'Derick': 14, 'John': 7, 'Ravi': 45, 'Mpho': 67}
Немного базы Python: print по горизонтали
Когда вы проходите циклом по итерируемому объекту, функция print печатает каждый элемент с новой строки. Это потому, что у print есть параметр end. По умолчанию значение этого параметра содержит символ перевода строки (end="\n"). Чтобы печатать в одну строку, нужно убрать перевод строки и заменить его на пустую строку (end="").
В примере ниже обратите внимание на пробел между кавычками (" "): он нужен, чтобы числа печатались с пробелами между ними. Если убрать пробел (""), числа выведутся слитно, вот так: 1367. Вот код, который это показывает:
In [1]: my_list = [1, 3, 6, 7]
for number in my_list:
print(number, end=" ")
// 1 3 6 7
print есть еще один параметр: sep. Мы используем sep, чтобы задать, чем разделять выводимые значения. Ниже в качестве разделителя используется символ /:In [2]: print('12', '12', '1990', sep='/')
// 12/12/1990
Некоторые SQL-грабли, на которые до сих пор наступают даже сеньоры (мне тоже иногда приходится лезть в доки и перепроверять):
1. = NULL никогда не бывает true. Используй IS NULL / IS NOT NULL (трехзначная логика: true, false, unknown).
2. NOT IN (...) + один NULL в списке может вернуть ноль строк. Чаще безопаснее NOT EXISTS.
3. LEFT JOIN + фильтр в WHERE превращается в INNER JOIN. Фильтры по джойну клади в ON.
4. COUNT(col) пропускает NULL, а COUNT(*) нет. Из-за этого метрики потом “магически” не сходятся.
5. NULL ломает конкатенацию и сравнения. Используй COALESCE осознанно.
👉 @PythonPortal
Посмотрим как ты знаешь классы в Python 🤩
Вопрос по Python:
Какой будет вывод у этого кода и почему?
👉 @PythonPortal
В Python 3.15 появится полноценный иммутабельный словарь.
В модуль builtins добавляется новый публичный неизменяемый тип frozendict.
Ожидается, что frozendict будет “safe by design”, потому что он предотвращает любые непреднамеренные изменения. Это полезно не только для стандартной библиотеки CPython, но и для сторонних мейнтейнеров: можно опираться на надежный неизменяемый тип словаря.
Зачем это вообще нужно:
▪️Хочешь использовать мапу как ключ в другом dict или засунуть в set? Обычный dict нельзя, а frozendict можно (если значения тоже хэшируемые).
▪️ @functools.lru_cache() и аргументы-словари: с dict будет сложно, с frozendict нормально.
▪️Дефолты в аргументах функций: вместо “мутабельного дефолта” можно давать frozendict(...) и не ловить сюрпризы.
Как выглядит по API:
▪️Конструктор “как у dict”: frozendict(), frozendict(**kwargs), frozendict(mapping) или iterable пар, плюс можно смешивать с **kwargs.
▪️Порядок вставки сохраняется (как в обычном dict).
▪️Хэш не зависит от порядка элементов (логика через frozenset(items)), и сравнение тоже по содержимому, а не по порядку.
▪️Есть объединение через | и “обновление” |= (но |= не мутирует объект, а создает новый).
▪️.copy() в CPython по сути возвращает тот же объект (shallow), а если надо глубоко, то copy.deepcopy().
Важный момент: frozendict НЕ наследуется от dict. Это специально, чтобы нельзя было обойти “неизменяемость” вызовом dict.__setitem__ и подобных трюков.
И бонус для stdlib: авторы наметили места, где можно заменить константные/публичные мапы на frozendict (в том числе там, где сейчас MappingProxyType).
👉 @PythonPortal
Твоя Python-прога может внезапно встать колом на несколько секунд. Обычно виноват garbage collector, который пошел “наводить порядок” в памяти.
И важный момент: это может случиться даже если ты сейчас почти не аллоцируешь и не освобождаешь память. И пауза не из-за того, что он долго “чистит” память в прямом смысле.
Достаточно, чтобы программа когда-то создала очень много объектов. Даже если ты эти объекты удержал (они живые и никуда не деваются), проблема все равно останется.
В Python есть инструменты, чтобы с этим разбираться. А если спросишь, твой любимый ИИ разложит все по полочкам.
Читать статью 🙈
👉 @PythonPortal
Кто-то собрал ИИ, который одновременно пишет код и лазит по вебу.
Называется Accomplish и работает локально, не сжигая API-кредиты.
Без Claude Desktop. Без Cursor. Без ежемесячных подписок.
Большинство AI-инструментов для кодинга заставляют выбирать что-то одно:
Claude Desktop → только работа с компьютером
Cursor → только кодинг
Windsurf → только кодинг
Accomplish объединяет обе возможности, чтобы Claude мог и изучить библиотеку, и сразу внедрить ее, не переключаясь между инструментами.
Ты просишь: "Найди самые свежие доки Stripe API и собери платежную интеграцию"
Accomplish:
1. Открывает браузер → читает документацию Stripe
2. Пишет Python-код на основе актуального API
3. Тестирует интеграцию
4. Дебажит ошибки
Все в одной сессии. Без переключения контекста.
100% open source.
👉 @PythonPortal
Перестаньте использовать if obj == None, используйте if obj is None
В Python, когда вы пишете:
obj == None
obj значением None. Вместо этого вы спрашиваете, равен ли объект None.obj is None
obj == None
__eq__ у объекта. То есть сам объект решает, что значит "равен None". А этот метод можно переопределить.obj это экземпляр класса, в котором __eq__ реализован так, что при сравнении с None возвращается True (даже если объект на самом деле не None), тогда obj == None может ошибочно дать True.class Weird:
def __eq__(self, other):
return True # Всегда утверждает, что равен
obj = Weird()
print(obj == None) # True
print(obj is None) # False
obj == None возвращает True из-за кастомного поведения оператора __eq__ в классе.obj == None результат не всегда предсказуем.obj is None
is, который нельзя переопределить. Это значит, что результат всегда будет одинаковым и предсказуемым.is проверяет идентичность объектов, то есть указывают ли две ссылки на один и тот же объект. Поскольку None это singleton (единственный экземпляр), obj is None это правильный и самый эффективный способ такой проверки.obj is None вместо obj == None ради предсказуемости и эффективности.
Немного базы Python. День 5. Сортировка списка по убыванию
Метод sort() сортирует список по возрастанию (по умолчанию).
Чтобы sort() работал, элементы списка должны быть одного типа. Нельзя сортировать список со смешанными типами данных, например числа и строки.
У метода sort() есть параметр reverse; чтобы отсортировать список по убыванию, установите reverse=True.
list1 = [2, 5, 6, 8, 1, 8, 9, 11]
list1.sort(reverse=True)
print(list1)
# [11, 9, 8, 8, 6, 5, 2, 1]
sort() это строго метод списка (list). Его нельзя использовать для сортировки set, tuple, string или dictionary.sort() не возвращает новый список; он сортирует существующий список на месте (in place).sort(), он вернет None. Пример ниже:list1 = [2, 5, 6, 8, 1, 8, 9, 11]
list2 = list1.sort(reverse=True)
print(list2)
# None
sort() есть необязательный параметр key, который позволяет настроить поведение сортировки.key вместе с lambda-функцией, можно реализовать такую кастомную сортировку. См. ниже:students = [
("Alice", 22),
("Bob", 20),
("Charlie", 24)
]
# Сортируем студентов по возрасту, используя lambda-функцию как key
students.sort(key=lambda students: students[1])
print(students)
# [('Bob', 20), ('Alice', 22), ('Charlie', 24)]
sort() является стабильным (stable), то есть сохраняет относительный порядок равных элементов в отсортированном списке."Alice" и "Bob" одинаковый возраст, их порядок останется прежним. Это и называется стабильной сортировкой (stable sorting). См. пример:students = [
("Alice", 22),
("Bob", 22),
("Charlie", 24)
]
# Сортируем студентов по возрасту, используя lambda-функцию как key
students.sort(key=lambda students: students[1])
print(students)
# [('Alice', 22), ('Bob', 22), ('Charlie', 24)]
"Alice" и "Bob" не изменился, потому что у них одинаковый возраст.
Немного базы Python. День 4: Получение текущего времени и даты
Ниже приведенный код показывает, как можно получить текущее время с помощью модуля datetime. Метод now() возвращает объект datetime, представляющий текущие дату и время в соответствии с системными часами. Метод strftime() форматирует время для нужного вывода. Этот код показывает, как использовать модуль datetime вместе с методом strftime(), чтобы получить отформатированную строку времени в формате часов, минут и секунд.
from datetime import datetime
time_now = datetime.now().strftime('%H:%M:%S')
print(f'Текущее время: {time_now}')
Текущее время: 17:37:28
date из модуля datetime. Ниже используется метод today():from datetime import date
today_date = date.today()
print(today_date)
2023-09-20
Ускорь JSON-ответы FastAPI в 2 раза, а то и больше
1. Обновись до только что вышедшего FastAPI 0.131.0
2. Объявляй response model (тип возврата)
После этого @pydantic будет заниматься JSON-сериализацией на стороне Rust 🦀
https://fastapi.tiangolo.com/advanced/custom-response/#json-performance
👉 @PythonPortal
Google раздал шума: в Chrome выкатили ранний превью WebMCP, и это приподносят как замену веб-скрейпингу
Теперь любой сайт может стать нативным инструментом для AI-агентов. 😶
👉 @PythonPortal
Если ты только начинаешь с Python, остановись и внимательно посмотри
Не меняй список во время прохода по нему.
Когда ты модифицируешь список прямо во время итерации, итератор начинает путаться. Он не “знает”, что список изменился прямо у него под ногами.
Например, этот код сломан:
items = [1, 2, 2, 3, 4]
for item in items:
if item == 2:
items.remove(item)
print(items)
# Output: [1, 2, 3, 4]
remove(), чтобы удалить все двойки из списка. Но если посмотреть на вывод, одна 2 все равно осталась. Почему так происходит: когда ты удаляешь элемент из списка, все элементы справа сдвигаются влево. А цикл продолжает идти дальше. В итоге происходит вот что: находится и удаляется первая 2. Вторая 2 сдвигается на ее место. Цикл переходит к следующему индексу и пропускает эту 2.for item in items[:]:
if item == 2:
items.remove(item)
print(items)
# Output: [1, 3, 4]
items = [x for x in items if x != 2]
RuntimeError. Это плохая практика.
Делюсь этим Python-скриптом под OSINT: это простая, но полезная штука для расследований по возможным группам киберпреступности, потому что она позволяет в реальном времени логировать статусы присутствия в Telegram. Мониторинг определяет такие состояния:
- В СЕТИ
- БЫЛ(А)
- БЫЛ(А) НЕДАВНО
- БЫЛ(А) НА ЭТОЙ НЕДЕЛЕ
- БЫЛ(А) В ЭТОМ МЕСЯЦЕ
- БЫЛ(А) ОЧЕНЬ ДАВНО
- СТАТУС НЕИЗВЕСТЕН
Хотя это только видимые метаданные, анализ временных паттернов может помочь заметить синхронные всплески активности, возможные смены между аккаунтами, повторное использование профилей или профили, которые выглядят разными, но ведут себя синхронно.
Бот может работать по запросу (через кнопку проверки), но его также можно доработать под мониторинг изменений в реальном времени, логирование переходов статусов и авто-алерты, когда аккаунт становится В СЕТИ или меняет паттерн активности. Это позволяет заранее видеть операционные пики, выявлять неактивные или приманочные аккаунты и усиливать стратегический анализ, строго в рамках закона и для легитимных целей исследования.
👉 @PythonPortal
Этот тул умеет скачивать буквально что угодно по ссылке
100% бесплатно. опенсорс. без рекламы.
https://cobalt.tools/
👉 @PythonPortal
Разраб придумал гениальную капчу против ИИ-агентов: чтобы записаться к нему на созвон, нужно 10 раз громко сказать «NIGGA».
👉 @PythonPortal
🔥 Пожизненная PRO-подписка на easyoffer по цене одного года.
Беспрецедентная акция на PRO-тариф сайта для подготовки к собеседованию на программиста, тестировщика, проектного менеджера и другие IT-профессии.
⚙️ Доступные функции сейчас:
1. База вопросов из реальных технических собеседований с вероятностью встречи и примерами ответов.
2. База задач с этапа live-coding.
3. База 1100+ реальных собеседований, в том числе в топовые компании (Сбер, Авито, Яндекс, WB, OZON, МТС и др.) на позиции Junior/Middle/Senior.
4. База 400+ тестовых заданий от компаний.
5. Аналитика ТОП-требований из вакансий для лучшего написания резюме по ключевым словам.
6. Тренажеры для подготовки к собеседованию. В том числе тренажер «Реальное собеседование» со сценарием вопросов под конкретную компанию.
⌛️ Функции, которые появятся в ближайшие полгода:
1. Агрегатор вакансий из Telegram, сайтов компаний и джоббордов.
2. Улучшение и оптимизация резюме, чтобы проходить ATS-системы.
3. Генерация уникального резюме и сопроводительного письма под вакансию.
Акция до 20 февраля (включительно) на PRO-тариф. Покупаешь сейчас один раз — пользуешься всю жизнь без лимита, включая все будущие функции.
👉 Смотри подробности тарифа и покупай на easyoffer
Пока ElevenLabs 🤩
Вышел новый сервис Voicebox и он клонирует почти любой голос всего по нескольким секундам аудио и полностью локально на твоей машине.
Без загрузок в облако. Никакие голосовые данные не покидают девайс.
Работает на Qwen3-TTS, прорывной голосовой модели от Alibaba.
→ Загружаешь пару секунд аудио
→ Получаешь почти идеальный клон голоса
→ Генеришь речь на любом языке
→ Миксуешь мульти-голосовые диалоги в DAW-подобном таймлайне
Всё локально. Ноль зависимости от облака.
100% open source. Лицензия MIT.
macOS + Windows уже доступны. Linux скоро.
👉 @PythonPortal