Python Portal
55.2K subscribers
2.48K photos
404 videos
51 files
1.02K links
Всё самое интересное из мира Python

Связь: @devmangx

РКН: https://clck.ru/3GMMF6
Download Telegram
Python-совет по дизайну: используй @property только для O(1) операций

Люди обычно ожидают, что всё, что выглядит как доступ к атрибуту, работает быстро.

Не хочется же жать Ctrl-C на чтении атрибута, потому что там спрятан расчёт уровня Deep Thought на 7,5 миллионов лет:

>>> life.meaning
42


👉 @PythonPortal
Please open Telegram to view this post
VIEW IN TELEGRAM
🤔116😁3
Немного базы 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 #100daysofpython
Please open Telegram to view this post
VIEW IN TELEGRAM
10👍7😁2
Всегда пиши код так, будто тот, кому потом его поддерживать, это буйный психопат, который знает, где ты живешь.

— Аноним

Знаете какие-нибудь забавные имена переменных?

👉 @PythonPortal
Please open Telegram to view this post
VIEW IN TELEGRAM
25😁12🤣6🤔1
Этот 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
Please open Telegram to view this post
VIEW IN TELEGRAM
14👍4
Немного базы 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
Please open Telegram to view this post
VIEW IN TELEGRAM
11👍3
Советы от реальных экспертов по оптимизации

👉 @PythonPortal
Please open Telegram to view this post
VIEW IN TELEGRAM
😁67🔥195
10 библиотек Python для генеративного ИИ, которые нужно освоить в 2026 году

👉 @PythonPortal
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥106👍5
Немного базы 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
Please open Telegram to view this post
VIEW IN TELEGRAM
11👍8
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥4711😁9🌭3
This media is not supported in your browser
VIEW IN TELEGRAM
Agentic RAG для чайников

Модульный agentic RAG, собранный на LangGraph. Разберись с RAG-агентами за считанные минуты.

Этот репозиторий показывает, как собрать agentic RAG на LangGraph с минимумом кода.

Что обещают в README, если коротко:

- иерархическая индексация (parent/child чанки: ищем по мелким, достаём крупные для контекста)
- память диалога
- уточнение запроса (вплоть до паузы и вопроса пользователю)
- оркестрация пайплайна через LangGraph, плюс параллельный map-reduce для сложных запросов
- автоперезапрос, если результатов мало, и компрессия контекста, чтобы не раздувать промпт

https://github.com/GiovanniPasq/agentic-rag-for-dummies

👉 @PythonPortal
Please open Telegram to view this post
VIEW IN TELEGRAM
7
Гвидо ван Россум (отец Python) выпустил новую версию typeagent, Python-библиотеки, над которой он работал с середины прошлого года, и все больше делал это вместе с Claude. Она реализует память для агентов.

Установка: pip install typeagent.

CHANGELOG.md

👉 @PythonPortal
Please open Telegram to view this post
VIEW IN TELEGRAM
👀8👍42
🧠🧠🧠

👉 @PythonPortal
Please open Telegram to view this post
VIEW IN TELEGRAM
39😁22🌭2🤣2👍1🤔1
Новый 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
Please open Telegram to view this post
VIEW IN TELEGRAM
2