Python-совет по дизайну: используй
Люди обычно ожидают, что всё, что выглядит как доступ к атрибуту, работает быстро.
Не хочется же жать Ctrl-C на чтении атрибута, потому что там спрятан расчёт уровня Deep Thought на 7,5 миллионов лет:
👉 @PythonPortal
@property только для O(1) операцийЛюди обычно ожидают, что всё, что выглядит как доступ к атрибуту, работает быстро.
Не хочется же жать Ctrl-C на чтении атрибута, потому что там спрятан расчёт уровня Deep Thought на 7,5 миллионов лет:
>>> life.meaning
42
Please open Telegram to view this post
VIEW IN TELEGRAM
🤔11❤6😁3
Немного базы Python. День 9. Индекс наибольшего числа
Есть несколько способов найти индекс самого большого числа в списках.
▪️ Функция
Можно использовать метод
▪️
В коде ниже функция
▪️ Списковое включение с функцией
В коде ниже мы используем списковое включение вместе с
Вывод показывает, что самое большое число находится по индексу 3.
👉 @PythonPortal #100daysofpython
Есть несколько способов найти индекс самого большого числа в списках.
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.
Please open Telegram to view this post
VIEW IN TELEGRAM
❤10👍7😁2
Всегда пиши код так, будто тот, кому потом его поддерживать, это буйный психопат, который знает, где ты живешь.
— Аноним
Знаете какие-нибудь забавные имена переменных?
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
Называется 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% опенсорс
Please open Telegram to view this post
VIEW IN TELEGRAM
❤14👍4
Немного базы Python. День 10 - Абсолютное значение (модуль) числа
Допустим, у тебя есть отрицательное число и ты хочешь получить его абсолютное значение. Для этого можно использовать функцию
Также
➡️ Использование модуля math
Если тебе нужны более продвинутые математические функции, можно использовать
➡️ Использование lambda-функции
Можно также использовать
👉 @PythonPortal #100daysofpython
Допустим, у тебя есть отрицательное число и ты хочешь получить его абсолютное значение. Для этого можно использовать функцию
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
Если тебе нужны более продвинутые математические функции, можно использовать
fabs() из модуля math. Эта функция всегда возвращает float.import math
num = -23.12
absolute_value = math.fabs(num)
absolute_value
23.12
Можно также использовать
lambda, чтобы превратить отрицательное число в модуль. Код ниже проверяет, меньше ли x нуля (то есть отрицательное ли значение). Если да, возвращает -x, по сути убирая минус и делая число положительным. Если x не отрицательное (больше или равно 0), возвращает x как есть.num = -23.12
absolute_value = (lambda x: -x if x < 0 else x)(num)
absolute_value
23.12
Please open Telegram to view this post
VIEW IN TELEGRAM
❤11👍3
Немного базы Python. День 11 - Добавление разделителя тысяч
Если вы работаете с большими числами и хотите добавить разделитель, чтобы их было проще читать, есть несколько способов это сделать. Вот некоторые из них:
▪️ Использование функции
List comprehension проходит по каждому элементу (числу) в
Вывод печатает
▪️ Использование f-строк
Также можно использовать f-строки, чтобы добавить разделители тысяч. Обратите внимание ниже: вместо запятой (
Заметили, что в обоих случаях мы используем list comprehension, чтобы добавить разделитель? Крутая штука, правда?😉
▪️ Использование модуля
Модуль
Этот код проходит по каждому числу в
👉 @PythonPortal #100daysofpython
Если вы работаете с большими числами и хотите добавить разделитель, чтобы их было проще читать, есть несколько способов это сделать. Вот некоторые из них:
formatList 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-строки, чтобы добавить разделители тысяч. Обратите внимание ниже: вместо запятой (
,) как разделителя мы используем подчёркивание (_).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 указывает, что разделители тысяч должны быть включены.Please open Telegram to view this post
VIEW IN TELEGRAM
❤11👍8
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥47❤11😁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
Модульный agentic RAG, собранный на LangGraph. Разберись с RAG-агентами за считанные минуты.
Этот репозиторий показывает, как собрать agentic RAG на LangGraph с минимумом кода.
Что обещают в README, если коротко:
- иерархическая индексация (parent/child чанки: ищем по мелким, достаём крупные для контекста)
- память диалога
- уточнение запроса (вплоть до паузы и вопроса пользователю)
- оркестрация пайплайна через LangGraph, плюс параллельный map-reduce для сложных запросов
- автоперезапрос, если результатов мало, и компрессия контекста, чтобы не раздувать промпт
https://github.com/GiovanniPasq/agentic-rag-for-dummies
Please open Telegram to view this post
VIEW IN TELEGRAM
❤7
Гвидо ван Россум (отец Python) выпустил новую версию typeagent, Python-библиотеки, над которой он работал с середины прошлого года, и все больше делал это вместе с Claude. Она реализует память для агентов.
Установка:
CHANGELOG.md
👉 @PythonPortal
Установка:
pip install typeagent. CHANGELOG.md
Please open Telegram to view this post
VIEW IN TELEGRAM
GitHub
typeagent-py/CHANGELOG.md at main · microsoft/typeagent-py
Structured RAG: ingest, index, query. Contribute to microsoft/typeagent-py development by creating an account on GitHub.
👀8👍4❤2
Новый PEP
Ограничения в софтверной инженерии созданы, чтобы их ломать. Годами меня бесил разрыв между Python и TypeScript: у одного невероятно динамичный и мощный рантайм, у другого невероятно динамичная и мощная система типов.
Так почему бы не совместить и то, и другое?🔥
Встречайте PEP 827, результат годового ресерча о том, что нужно, чтобы прокачать type checking в Python до уровня его динамичности.
Вот как можно реализовать Record, сравнив варианты бок о бок:
TypeScript
Python
Вот пример
TypeScript
Python
А вот
TypeScript
Python
👉 @PythonPortal
Ограничения в софтверной инженерии созданы, чтобы их ломать. Годами меня бесил разрыв между 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]
]]
Please open Telegram to view this post
VIEW IN TELEGRAM
❤2