ru
Feedback
Python Portal

Python Portal

Открыть в Telegram

Всё самое интересное из мира Python Сотрудничество, реклама: @devmangx Менеджер: @Spiral_Yuri РКН: https://clck.ru/3GMMF6

Больше

📈 Аналитический обзор Telegram-канала Python Portal

Канал Python Portal (@pythonportal) языкового сегмента Русский является активным участником. Сейчас сообщество объединяет 52 460 подписчиков, занимая 2 547 место в категории Технологии и приложения и 11 911 место в регионе Россия.

📊 Показатели аудитории и динамика

С момента создания невідомо проект демонстрирует стремительный рост, собрав аудиторию из 52 460 подписчиков.

Согласно последним данным от 10 июня, 2026, канал показывает стабильную активность. За последние 30 дней изменение числа участников составило -783, а за последние 24 часа — -20, при этом общий охват остаётся высоким.

  • Статус верификации: Не верифицирован
  • Уровень вовлечённости (ER): Средний показатель вовлечённости аудитории составляет 9.32%. В первые 24 часа после публикации контент обычно набирает 5.78% реакций от общего числа подписчиков.
  • Охват публикаций: В среднем каждый пост получает 4 892 просмотров. В течение первых суток публикация набирает 3 033 просмотров.
  • Реакции и взаимодействия: Аудитория активно поддерживает контент: среднее количество реакций на один пост — 25.
  • Тематические интересы: Контент сосредоточен на ключевых темах, таких как строка, none, true, модуль, peter.

📝 Описание и контентная политика

Автор описывает ресурс как площадку для выражения субъективного мнения:
Всё самое интересное из мира Python Сотрудничество, реклама: @devmangx Менеджер: @Spiral_Yuri РКН: https://clck.ru/3GMMF6

Благодаря высокой частоте обновлений (последние данные получены 11 июня, 2026) канал поддерживает актуальность и высокий уровень охвата публикаций. Аналитика показывает, что аудитория активно взаимодействует с контентом, что делает его важной точкой влияния в категории Технологии и приложения.

52 460
Подписчики
-2024 часа
-1877 дней
-78330 день
Архив постов
Хорошо там, где нас нет 🤣🤣🤣 👉 @PythonPortal
Хорошо там, где нас нет 🤣🤣🤣 👉 @PythonPortal

Монолит VS микросервисы 👉 @PythonPortal

Оказалось, что история с покупкой доступа к якобы топовым моделям, а по факту к подменённым, наконец получила подтверждение в статье. Исследователи провели аудит 17 сторонних API для LLM-агентов и выяснили: • почти 46% endpoint'ов не проходят fingerprint-тесты • API заявляет, что это GPT-5 или Gemini-2.5, а на бэкенде тихо подставлен GLM-4 • точность на медицинском бенчмарке падает с 83% до 37% Эти фейковые API уже процитированы в 187 научных статьях, а некоторые связанные с ними проекты набрали почти 60 тысяч звёзд на GitHub. И главная проблема тут в том, что научные выводы строятся на поддельных моделях. Статья: https://arxiv.org/abs/2603.01919 👉 @PythonPortal

🤔🤔🤔 👉 @PythonPortal
🤔🤔🤔 👉 @PythonPortal

Немного базы Python. # 12 - Startswith и Endswith startswith() и endswith() это строковые методы, которые возвращают True, если строка начинается или заканчивается указанным значением. Эти методы можно использовать в разных ситуациях, когда нужно проверить префикс или суффикс у строки. Они особенно полезны для фильтрации и задач валидации. - Использование метода Startswith Допустим, ты хочешь получить все имена в списке, которые начинаются на a. Вот как можно использовать startswith() для этого:
list1 = ['lemon', 'Orange',
         'apple', 'apricot']

new_list = [fruit for fruit in list1 if fruit.startswith('a')]
print(new_list)
['apple', 'apricot']
- Использование метода Endswith Метод endswith() можно использовать для валидации ввода пользователя. Например, если нужно проверить, что пользователь ввёл корректный Gmail-адрес, можно убедиться, что ввод заканчивается на gmail.com:
user_input = input("Введите email-адрес: ")

if user_input.endswith("@gmail.com"):
    print("Валидный email-адрес.")
else:
    print("Невалидный email-адрес.")
👉 @PythonPortal #100daysofpython

Новый PEP Ограничения в софтверной инженерии созданы, чтобы их ломать. Годами меня бесил разрыв между Python и TypeScript: у
Новый PEP Ограничения в софтверной инженерии созданы, чтобы их ломать. Годами меня бесил разрыв между Python и TypeScript: у одного невероятно динамичный и мощный рантайм, у другого невероятно динамичная и мощная система типов. Так почему бы не совместить и то, и другое? 🔥 Встречайте PEP 827, результат годового ресерча о том, что нужно, чтобы прокачать type checking в Python до уровня его динамичности. Вот как можно реализовать Record, сравнив варианты бок о бок: TypeScript
type Record<K extends string, V> = {
  [P in K]: V
}

// так что...

type Fruit = Record<
  'apple' | 'banana' | 'orange',
  string
>

// развернется в
//
// {
//   apple: string;
//   banana: string;
//   orange: string;
// }
Python
type Record[K, V] = NewTypedDict[
  *[Member[k, V] for k in Iter[FromUnion[K]]]
]

# так что...

type Fruit = Record[
  Literal["apple", "banana", "orange"],
  str
]

# развернется в
#
# class <Fruit>:
#   apple: str
#   banana: str
#   orange: str
Вот пример Pick: TypeScript
type Pick<T, K extends keyof T> = {
  [P in K]: T[P]
}
Python
type Pick[T, K] = NewProtocol[*[
  p for p in Iter[Attrs[T]]
  if IsAssignable[p.name, K]
]]
А вот Omit. Обрати внимание: версия на Python по сути не изменилась по сравнению с реализацией Pick, в отличие от TS. TypeScript
ts id="5ehk8a"
type Omit<T, K extends keyof T> = {
  [P in Exclude<keyof T, K>]: T[P]
}
Python
py id="g6u8k1"
type Omit[T, K] = NewProtocol[*[
  p for p in Iter[Attrs[T]]
  if not IsAssignable[p.name, K]
]]
👉 @PythonPortal

🧠🧠🧠 👉 @PythonPortal
🧠🧠🧠 👉 @PythonPortal

Гвидо ван Россум (отец Python) выпустил новую версию typeagent, Python-библиотеки, над которой он работал с середины прошлого года, и все больше делал это вместе с Claude. Она реализует память для агентов. Установка: pip install typeagent. CHANGELOG.md 👉 @PythonPortal

Agentic RAG для чайников Модульный agentic RAG, собранный на LangGraph. Разберись с RAG-агентами за считанные минуты. Этот репозиторий показывает, как собрать agentic RAG на LangGraph с минимумом кода. Что обещают в README, если коротко: - иерархическая индексация (parent/child чанки: ищем по мелким, достаём крупные для контекста) - память диалога - уточнение запроса (вплоть до паузы и вопроса пользователю) - оркестрация пайплайна через LangGraph, плюс параллельный map-reduce для сложных запросов - автоперезапрос, если результатов мало, и компрессия контекста, чтобы не раздувать промпт https://github.com/GiovanniPasq/agentic-rag-for-dummies 👉 @PythonPortal

VPN за 60 секунд 👉 @PythonPortal

Немного базы Python. День 11 - Добавление разделителя тысяч Если вы работаете с большими числами и хотите добавить разделитель, чтобы их было проще читать, есть несколько способов это сделать. Вот некоторые из них: ▪️Использование функции format List comprehension проходит по каждому элементу (числу) в my_list. Для каждого числа он форматирует его в строку с разделителями тысяч запятыми, используя строку формата '{:,}'.format(num).
my_list = [10898767, 9876780, 9908763]

new_list = ['{:,}'.format(num) for num in my_list]
print(new_list)

# ['10,898,767', '9,876,780', '9,908,763']
Вывод печатает new_list, который содержит отформатированные строки с разделителями запятыми. ▪️Использование f-строк Также можно использовать f-строки, чтобы добавить разделители тысяч. Обратите внимание ниже: вместо запятой (,) как разделителя мы используем подчёркивание (_).
my_list = [10898767, 9876780, 9908763]

new_list = [f"{num:_}" for num in my_list]
print(new_list)

# ['10_898_767', '9_876_780', '9_908_763']
Заметили, что в обоих случаях мы используем list comprehension, чтобы добавить разделитель? Крутая штука, правда? 😉 ▪️Использование модуля locale Модуль locale даёт способ форматировать числа с разделителями тысяч в соответствии с текущими настройками локали. Вы можете выставить нужную локаль и использовать метод locale.format_string(). Вот как это выглядит на практике:
import locale

my_list = [10898767, 9876780, 9908763]
formatted_list = []

for num in my_list:
    # Set the locale
    locale.setlocale(locale.LC_ALL, 'en_US.UTF-8')
    formatted_list.append(locale.format_string("%d", num, grouping=True))

print(formatted_list)
Этот код проходит по каждому числу в my_list через цикл for. Он задаёт нужную локаль 'en_US.UTF-8' с помощью locale.setlocale(locale.LC_ALL, 'en_US.UTF-8'). Это выставляет локаль на США с кодировкой UTF-8, где для тысяч используются запятые. Дальше locale.format_string('%d', num, grouping=True) форматирует число (num) в строку с разделителями тысяч. Спецификатор формата '%d' означает, что число нужно форматировать как целое, а grouping=True указывает, что разделители тысяч должны быть включены. 👉 @PythonPortal #100daysofpython

10 библиотек Python для генеративного ИИ, которые нужно освоить в 2026 году 👉 @PythonPortal
10 библиотек Python для генеративного ИИ, которые нужно освоить в 2026 году 👉 @PythonPortal

Советы от реальных экспертов по оптимизации 👉 @PythonPortal
Советы от реальных экспертов по оптимизации 👉 @PythonPortal

Немного базы Python. День 10 - Абсолютное значение (модуль) числа Допустим, у тебя есть отрицательное число и ты хочешь получить его абсолютное значение. Для этого можно использовать функцию abs(). Функция abs() возвращает абсолютное значение любого числа (положительного, отрицательного и комплексного). Ниже показано, как получить список абсолютных значений из списка, где есть и отрицательные, и положительные числа. Используем list comprehension.
list1 = [-12, -45, -67, -89, 34, 67, -13]

print([abs(num) for num in list1])
[12, 45, 67, 89, 34, 67, 13]
Также abs() можно применять к числу с плавающей точкой, и она вернет абсолютное значение. Смотри ниже:
num = -23.12

print(abs(num))
23.12
➡️Использование модуля math Если тебе нужны более продвинутые математические функции, можно использовать fabs() из модуля math. Эта функция всегда возвращает float.
import math

num = -23.12
absolute_value = math.fabs(num)
absolute_value
23.12
➡️Использование lambda-функции Можно также использовать lambda, чтобы превратить отрицательное число в модуль. Код ниже проверяет, меньше ли x нуля (то есть отрицательное ли значение). Если да, возвращает -x, по сути убирая минус и делая число положительным. Если x не отрицательное (больше или равно 0), возвращает x как есть.
num = -23.12
absolute_value = (lambda x: -x if x < 0 else x)(num)
absolute_value
23.12
👉 @PythonPortal #100daysofpython

Этот Python-фреймворк может скрейпить ЛЮБОЙ сайт и вытаскивать структурированные данные за считанные минуты. Называется Scrap
Этот Python-фреймворк может скрейпить ЛЮБОЙ сайт и вытаскивать структурированные данные за считанные минуты. Называется Scrapy. Он краулит сайты и извлекает структурированные данные целиком с твоей машины. Никаких счетов за SaaS-скрейпинг. Никаких лимитов облачных API. Никакие данные не уходят за пределы твоей инфраструктуры. Работает на самом “боевом” краулинг-движке в Python: 59K звёзд и 15+ лет продакшен-использования. → Описал spider один раз → Получил чистые структурированные данные → Масштабируешься до миллионов страниц → Экспорт в JSON, CSV, XML в один момент Всё локально. Ноль зависимости от облака. Но это не просто скрипт для парсинга. Это полноценный фреймворк для извлечения данных: → Асинхронная архитектура для параллельного краулинга в масштабе → Встроенные middleware для прокси, ретраев и rate limiting → CSS и XPath селекторы без лишнего бойлерплейта → Подключаемые pipelines для чистки, дедупликации и сохранения → 54 800+ продакшен-проектов уже завязаны на него 100% open source. Лицензия BSD-3. Работает на macOS, Windows и Linux уже сейчас. Хочешь сделать хорошо, сделай сам, вместо облачных сервисов запускаешь всё у себя. 🪖🪖 100% опенсорс 👉 @PythonPortal

Всегда пиши код так, будто тот, кому потом его поддерживать, это буйный психопат, который знает, где ты живешь. — Аноним Знае
Всегда пиши код так, будто тот, кому потом его поддерживать, это буйный психопат, который знает, где ты живешь.
— Аноним Знаете какие-нибудь забавные имена переменных? 👉 @PythonPortal

Немного базы Python. День 9. Индекс наибольшего числа Есть несколько способов найти индекс самого большого числа в списках. ▪️Функция max() и метод index() Можно использовать метод index() вместе с функцией max(), чтобы получить индекс наибольшего числа в списке. В этом примере мы с помощью max() находим самое большое число в списке и передаем его в index() как аргумент. Метод index() вернет индекс первого вхождения наибольшего числа.
In [23]: my_list = [12, 45, 67, 89, 34, 67, 13]
         largest_number_index = my_list.index(max(my_list))
         largest_number_index

Out[23]: 3
▪️max() и enumerate() В коде ниже функция max() принимает список и lambda-функцию в качестве аргументов. Мы добавляем enumerate() к списку, чтобы она могла вернуть и число из списка, и его индекс (кортеж). Параметр start в enumerate() задаем так, чтобы нумерация начиналась с позиции 0. lambda-функция используется, чтобы найти максимальное значение по второму элементу каждого кортежа, то есть по значению из my_list.
In [24]: my_list = [12, 45, 67, 89, 34, 67, 13]

         max_num = max(enumerate(my_list, start=0),
                       key = lambda x: x[1])
         print('Индекс наибольшего числа:', 
               max_num[0])

Индекс наибольшего числа: 3
▪️Списковое включение с функцией enumerate() В коде ниже мы используем списковое включение вместе с enumerate(), чтобы найти индекс самого большого числа в списке. Создаем переменную max_value - в ней хранится максимальное значение из списка. Дальше с помощью enumerate() находим индекс(ы), где значение совпадает с этим максимумом.
In [25]: my_list = [12, 45, 67, 89, 34, 67, 13]

         max_value = max(my_list)
         max_indices = [idx for idx, val in enumerate(my_list) if val == max_value]
         max_indices

Out[25]: [3]
Вывод показывает, что самое большое число находится по индексу 3. 👉 @PythonPortal

Python-совет по дизайну: используй @property только для O(1) операций Люди обычно ожидают, что всё, что выглядит как доступ к атрибуту, работает быстро. Не хочется же жать Ctrl-C на чтении атрибута, потому что там спрятан расчёт уровня Deep Thought на 7,5 миллионов лет:
>>> life.meaning
42
👉 @PythonPortal

😆😆😆 👉 @PythonPortal
😆😆😆 👉 @PythonPortal

Немного базы Python. День 8 - Сделать вложенный список плоским Я покажу вам три (3) способа, как можно развернуть двумерный список. В первом методе используется цикл for, во втором используется модуль itertools, а в третьем используется списковое включение (list comprehension). ⚙️ С помощью цикла for: Для этого метода мы используем вложенный цикл for. Внешний цикл проходит по внутренним спискам, а внутренний цикл обращается к элементам во внутренних списках.
# In [19]:
list1 = [[1, 2, 3],[4, 5, 6]]

newlist = []
for list2 in list1:
    for j in list2:
        newlist.append(j)

print(newlist)
[1, 2, 3, 4, 5, 6]
⚙️ С помощью модуля itertools: Функцию itertools.chain.from_iterable() из модуля itertools можно использовать, чтобы развернуть вложенный список. Этот метод может не подойти для списков с глубокой вложенностью.
# In [20]:
import itertools

list1 = [[1, 2, 3],[4, 5, 6]]

flat_list = list(itertools.chain.from_iterable(list1))
print(flat_list)
[1, 2, 3, 4, 5, 6]
Вы можете увидеть, что вложенный цикл был развернут. ⚙️ С помощью list comprehension Если вы не хотите импортировать itertools или писать обычный цикл for, можно просто использовать list comprehension.
# In [21]:
list1 = [[1, 2, 3], [4, 5, 6]]

flat_list = [i for j in list1 for i in j]
print(flat_list)
[1, 2, 3, 4, 5, 6]
List comprehension хорошо подходит для умеренно вложенных списков. Для глубоко вложенных списков он не подходит, так как код становится хуже читаемым. ⚙️ С помощью генераторной функции Можно создать генераторную функцию, которая делает yield элементов из вложенного списка, а затем преобразовать генератор в список.
# In [22]:
def flatten_generator(nested_list):
    for sublist in nested_list:
        for item in sublist:
            yield item

list1 = [[1, 2, 3], [4, 5, 6]]

flat_list = list(flatten_generator(list1))
flat_list
Out[22]: [1, 2, 3, 4, 5, 6]
Метод с генератором подходит для разворачивания больших или глубоко вложенных списков. Это потому, что генераторы экономно расходуют память. 👉 @PythonPortal