Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
❤17😢4👍3
Please open Telegram to view this post
VIEW IN TELEGRAM
😁45🤣19❤6
Немного базы Python. День 8 - Сделать вложенный список плоским
Я покажу вам три (3) способа, как можно развернуть двумерный список. В первом методе используется цикл
⚙️ С помощью цикла for:
Для этого метода мы используем вложенный цикл
⚙️ С помощью модуля itertools:
Функцию
Вы можете увидеть, что вложенный цикл был развернут.
⚙️ С помощью list comprehension
Если вы не хотите импортировать
List comprehension хорошо подходит для умеренно вложенных списков. Для глубоко вложенных списков он не подходит, так как код становится хуже читаемым.
⚙️ С помощью генераторной функции
Можно создать генераторную функцию, которая делает
Метод с генератором подходит для разворачивания больших или глубоко вложенных списков. Это потому, что генераторы экономно расходуют память.
👉 @PythonPortal #100daysofpython
Я покажу вам три (3) способа, как можно развернуть двумерный список. В первом методе используется цикл
for, во втором используется модуль itertools, а в третьем используется списковое включение (list comprehension).Для этого метода мы используем вложенный цикл
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.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]
Вы можете увидеть, что вложенный цикл был развернут.
Если вы не хотите импортировать
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]
Метод с генератором подходит для разворачивания больших или глубоко вложенных списков. Это потому, что генераторы экономно расходуют память.
Please open Telegram to view this post
VIEW IN TELEGRAM
❤15👍9
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
❤3👀1