Реальный Python
3.71K subscribers
824 photos
10 videos
7 files
873 links
Все о пайтон, новости, подборки на русском и английском. По всем вопросам @evgenycarter
Download Telegram
📂 Как получить список всех файлов в директории на Python

Статья о том, как с помощью Python получать список файлов в директориях. Рассмотрены различные способы, включая использование модулей os, os.path, glob и более современного pathlib.

Особое внимание уделено:
- Фильтрации файлов по расширению.
- Рекурсивному поиску в подпапках.
- Преимуществам каждого подхода.

https://realpython.com/get-all-files-in-directory-python/

#python

👉 @python_real
👍3
Getters и Setters в Python — это мощный инструмент для управления доступом к атрибутам объекта.

В статье детально рассматривается, как их использовать для инкапсуляции данных и контроля за изменениями свойств объекта.

Основные моменты:
- Объяснение, почему в Python прямой доступ к атрибутам предпочтительнее, но геттеры и сеттеры остаются важными.
- Использование декоратора @property для создания свойства с геттером и сеттером.
- Примеры, как эти механизмы помогают улучшить читаемость и безопасность кода.

https://realpython.com/python-getter-setter/

#python

👉 @python_real
👍31
Как использовать pyproject.toml в Python

Рассматриваются основные аспекты работы с этим файлом, его структура и как он помогает в управлении зависимостями, настройке инструментов и организации проектов.

Краткий обзор:
- pyproject.toml появился в PEP 518 и стал стандартом для описания конфигурации Python-проектов.
- Позволяет определять сборщики (build backends), такие как setuptools или poetry.
- Упрощает настройку инструментов вроде black, mypy и pytest.
- Дает возможность управлять зависимостями и версиями пакетов.

Использование pyproject.toml делает проекты более структурированными и гибкими, особенно при работе с различными инструментами и системами сборки.

https://realpython.com/python-pyproject-toml/

#python

👉 @python_real
👍21
🚀 Вышла интересная статья о сравнении UV и pip - двух инструментов для управления зависимостями в Python.

pip - стандартный пакетный менеджер Python, который знаком каждому разработчику. Работает стабильно, но не отличается высокой скоростью.
UV - современная альтернатива от Astral (разработчиков Ruff). Его главная фишка - невероятная скорость. Он значительно быстрее pip и poetry благодаря продуманной архитектуре и кэшу.

В статье разбираются:

- ключевые различия в работе с зависимостями;
- производительность и удобство использования;
- примеры установки пакетов и сборки окружения;
- сценарии, где UV может полностью заменить pip.

Если вы часто работаете с Python-проектами и хотите ускорить установку библиотек, стоит присмотреться к UV.

https://realpython.com/uv-vs-pip/

#python

👉 @python_real
👍3
В Python стрелки (->) используются в аннотациях функций для указания возвращаемого типа. Это не строгая проверка типов, а лишь подсказка для разработчиков и инструментов (например, mypy, IDE).

Пример:


def greet(name: str) -> str:
return "Hello, " + name


Здесь:

* name: str — аргумент name должен быть строкой.
* -> str — функция возвращает строку.

Можно использовать любые типы из модуля typing или collections.abc, например:


from typing import List, Dict, Optional

def get_users() -> List[str]:
return ["Alice", "Bob"]

def find_user(user_id: int) -> Optional[Dict[str, str]]:
if user_id == 1:
return {"name": "Alice"}
return None


Аннотации никак не влияют на исполнение кода, это всего лишь type hints.

https://realpython.com/what-does-arrow-mean-in-python/

#python

👉 @python_real
👍4
🚀 FastAPI - современный асинхронный веб-фреймворк на Python, который позволяет создавать быстрые и удобные API.

Статья от Real Python даёт отличное введение в работу с FastAPI: от установки и запуска первого приложения до обработки запросов и валидации данных с помощью Pydantic. Разбираются основы маршрутизации, использование Swagger UI для документации и преимущества асинхронности.

Если вы хотите быстро стартовать с созданием API на Python, этот гайд - отличный первый шаг.

https://realpython.com/get-started-with-fastapi/

#python

👉 @python_real
👍1
YAML: The Missing Battery in Python

https://realpython.com/python-yaml/

#python

👉 @python_real
👍2
268: Advice on Beginning to Learn Python
The Real Python Podcast
Episode 268: Advice on Beginning to Learn Python

Что изменилось в обучении Python за последние несколько лет? Какие новые подходы и обновлённые советы стоит знать новичкам, начинающим свой путь в программировании? На этой неделе в подкасте Стивен Группетта и Мартин Брёус вновь обсуждают, как начать изучать Python.

Мы делимся методами поиска мотивации, построения собственных проектов и освоения основ языка. Даём советы по установке Python и объясняем, почему не стоит зацикливаться на выборе «идеального» редактора. Также рассматриваем, как использовать большие языковые модели (LLM) в процессе обучения программированию и практиковаться в умении задавать хорошие вопросы.

Topics:

00:00:00 – Introduction
00:02:36 – Martin’s teaching background
00:02:57 – Stephen’s teaching background
00:04:07 – Having a vested interest in learning
00:08:35 – No shortcut to learning the fundamentals
00:09:21 – Parallels to learning a foreign language
00:12:43 – What’s different about starting to learn Python now?
00:15:03 – Stephen’s journey to coaching and using LLMs
00:16:20 – Are LLMs helpful for learning?
00:18:50 – Teaching what you’ve learned to someone else
00:19:38 – Learning how to ask good questions
00:22:11 – Improved error messages
00:24:35 – REPL: Read Evaluate Print Loop
00:26:33 – Video Course Spotlight
00:27:48 – Installing Python and choosing an editor
00:35:16 – Considering the scale of beginner projects
00:37:39 – Should a beginner be concerned with making Pythonic code?
00:40:55 – Using LLM tools and defining your level of skill
00:42:39 – Python for Beginners: Code With Confidence - live course
00:47:32 – Looking at projects - Awesome Python
00:48:02 – Asking an LLM to explain the code generated
00:50:46 – Debuggers and seeing code run
00:51:23 – Thanks and goodbye

https://realpython.com/podcasts/rpp/268/

#python

👉 @python_real
👍1
🐍 Что нового в Python 3.14

Python 3.14 принес кучу интересных обновлений, которые делают язык ещё мощнее и удобнее для разработчиков. Вот краткий обзор:

🔹 Новый модуль tomllib — теперь можно парсить TOML прямо из стандартной библиотеки без сторонних зависимостей.
🔹 Оптимизации скоростиPython продолжает становиться быстрее. Улучшения в байткоде и оптимизация работы с коллекциями дают заметный прирост производительности.
🔹 Новые возможности аннотаций типов — улучшена работа с типами TypeAliasType, а также добавлены новые инструменты для статического анализа.
🔹 Расширения для pattern matching — теперь можно использовать ещё более гибкие шаблоны, особенно для сложных структур данных.
🔹 Изменения в работе GIL — продолжается подготовка к многопоточному Python без GIL в будущем.

https://realpython.com/python314-new-features/

#python

👉 @python_real
👍41👏1😁1🆒1
Шахматы, которые вас удивят: Полный гайд по созданию игры с туманом войны на Python

Всё началось с подготовки к финалу RuCode – масштабному соревнованию для всех увлечённых алгоритмическим программированием. Погружаясь в разбор заданий прошлых лет, мне кое-что совершенно случайно попало в руки, интересная задача: реализовать шахматы с "туманом войны" в консоли

Идея показалась мне настолько вдохновляющей, что я решил пойти дальше, а что если превратить эту консольную головоломку в настоящую игру с графикой и той самой атмосферой тумана войны, который так знаком игрокам в стратегиях

Идея зацепила сразу, представьте классические шахматы, но с элементом неожиданности. Вы не видите все фигуры противника, а только те клетки, куда могут ступить ваши фигуры. Каждый ход превращается в тактическую загадку, что скрывается в темноте? Где спрятался вражеский ферзь? и т.д.

Так обычная подготовка к соревнованиям превратилась в увлекательный эксперимент, результатом которого стала эта статья и реализация шахмат с туманом войны на Python

https://habr.com/ru/articles/958560/

#python

👉 @python_real
👍4🔥1🤔1
YAML: The Missing Battery in Python

YAML (YAML Ain’t Markup Language) - это человекочитаемый формат сериализации данных, который часто используется для файлов конфигураций, обмена данными между языками и управления инфраструктурой (например, в Docker, Kubernetes и т. д.).

В Python с YAML удобно работать с помощью библиотеки PyYAML. Она позволяет:

- читать YAML-файлы и преобразовывать их в стандартные Python-объекты (dict, list, str, и т. д.);
- записывать данные обратно в YAML;
- безопасно загружать данные с помощью safe_load() (чтобы избежать выполнения произвольного кода);
- использовать настраиваемые объекты и теги для сериализации нестандартных типов.

Пример загрузки YAML-файла:


import yaml

with open("config.yaml", "r") as f:
config = yaml.safe_load(f)

print(config)


Пример записи:


import yaml

data = {"name": "Oleg", "skills": ["Python", "AI", "ML"]}

with open("output.yaml", "w") as f:
yaml.dump(data, f)


Также PyYAML поддерживает:

- настройку форматирования вывода (default_flow_style=False, indent и т. д.),
- пользовательские конструкторы и представления (add_constructor, add_representer),
- и интеграцию с другими инструментами DevOps.

https://realpython.com/python-yaml/

#python

👉 @python_real
👍3
🧼 Методы strip(), lstrip() и rstrip() в Python: удаление пробелов и символов

Работая с текстом в Python, часто нужно удалить лишние пробелы или символы с краёв строки. Именно для этого существуют методы strip(), lstrip() и rstrip().

Основы


text = " hello world "
print(text.strip()) # 'hello world'
print(text.lstrip()) # 'hello world '
print(text.rstrip()) # ' hello world'


По умолчанию эти методы удаляют пробелы, переводы строк, табуляции и другие пробельные символы.

Удаление определённых символов

Можно передать в метод строку с символами, которые нужно удалить:


text = ".,!?hello world!?.,"
print(text.strip(".,!?")) # 'hello world'


Важно: метод удаляет все указанные символы, а не подстроку. То есть strip("abc") удалит все a, b и c, а не строку "abc".

Применение в реальной жизни

- Очистка данных перед обработкой.
- Удаление лишних символов после парсинга.
- Нормализация пользовательского ввода.

Совет

Если нужно удалить только начало или только конец строки — используй lstrip() или rstrip() соответственно.

https://realpython.com/python-strip/

#python

👉 @python_real
👍4
Python MarkItDown: преобразование документов в Markdown для LLM

Библиотека MarkItDown позволяет быстро преобразовывать PDF, файлы Office, изображения, HTML, аудио и URL в Markdown, готовый для использования в языковых моделях (LLM). В этом руководстве вы сравните MarkItDown с Pandoc, запустите его из командной строки, используете в Python-коде и встроите конвертацию в рабочие процессы с ИИ.

По завершении урока вы поймёте следующее:

- MarkItDown можно установить через pip, используя спецификатор [all], чтобы подтянуть необязательные зависимости.
- В командной версии (CLI) результат можно сохранить в файл с помощью опции -o или --output, указав путь назначения.
- Метод .convert() читает входной документ и преобразует его в Markdown.
- Сервер MCP MarkItDown можно подключать к клиентам вроде Claude Desktop, чтобы выполнять конвертацию по запросу прямо в чате.
- MarkItDown может интегрироваться с LLM для генерации описаний изображений и извлечения текста с помощью OCR и пользовательских промптов.

https://realpython.com/python-markitdown/

#python

👉 @python_real
2👍1
Основы работы с декораторами Python

В этом уроке по декораторам Python вы узнаете, что они собой представляют, как их создавать и использовать. Декораторы предоставляют простой синтаксис для вызова функций более высокого порядка.
По определению, декоратор - это функция, которая принимает другую функцию и расширяет поведение последней, не изменяя ее в явном виде. Звучит запутанно, но все станет понятнее после того, как вы увидите несколько примеров работы декораторов.

https://realpython.com/primer-on-python-decorators/

#python

👉 @python_real
👍2
Python calendar Module: Создание календарей с помощью Python

Python calendar module предоставляет несколько способов создания календарей для Python-программ. Он также включает в себя множество функций для работы с данными календаря в виде строк, чисел и объектов времени даты.

В этом уроке вы узнаете, как использовать модуль calendar для создания и настройки календарей в Python.

https://realpython.com/python-calendar-module/

#python

👉 @python_real
👍21
🦙 LlamaIndex: Ваш персональный мост между данными и LLM

Многие думают, что для работы нейросети с вашими личными документами нужно заниматься сложным «файнтюнингом». На самом деле, чаще всего достаточно RAG (Retrieval-Augmented Generation). И здесь королем выступает LlamaIndex.

Что это такое?

Если LangChain это швейцарский нож для любых задач с цепочками действий, то LlamaIndex специализируется именно на данных. Он берет ваши PDF, базы данных или заметки из Notion и превращает их в формат, который «понимает» LLM (например, GPT-4).

Ключевые возможности из свежего гайда:

🔹Data Connectors: Загрузка данных из 100+ источников (Slack, Google Drive, Postgres и т.д.).
🔹Indexing: Разбиение текста на умные фрагменты (nodes) и создание векторных индексов для быстрого поиска.
🔹Query Engine: Интерфейс, который позволяет «общаться» со своими данными на естественном языке.

Мини-пример кода:

Всего несколько строк, чтобы заставить модель отвечать по вашему локальному файлу:


from llama_index.core import VectorStoreIndex, SimpleDirectoryReader

# 1. Загружаем документы из папки
documents = SimpleDirectoryReader("./data").load_data()

# 2. Создаем индекс (автоматически эмбеддинги и хранение)
index = VectorStoreIndex.from_documents(documents)

# 3. Задаем вопрос
query_engine = index.as_query_engine()
response = query_engine.query("В чем основная мысль отчета за квартал?")
print(response)



Почему стоит попробовать?

1. Актуальность: Модель не будет галлюцинировать, если ответ есть в ваших документах.
2. Экономия: Не нужно переобучать модель - достаточно обновить индекс.
3. Гибкость: Поддерживает как простые скрипты, так и сложные enterprise-архитектуры.


📖 Полный разбор с примерами: https://realpython.com/llamaindex-examples/

#python #llm #llamaindex #ai #rag

👉 @python_real
👍4
🐍 Python Deque: Когда обычного списка недостаточно

Многие используют стандартный list для любых задач, связанных с хранением последовательностей. Но что, если вам нужно эффективно добавлять или удалять элементы с обоих концов структуры?

Здесь на сцену выходит collections.deque (double-ended queue).

🚀 Почему Deque круче списка в определенных задачах?

Главная проблема list в том, что он оптимизирован для операций с правой стороны. Удаление или вставка в начало списка (list.insert(0, v) или list.pop(0)) заставляет Python сдвигать все остальные элементы, что дает сложность .

deque обеспечивает:

🔹O(1) для операций добавления/удаления как слева, так и справа.
🔹Возможность создания кольцевых буферов (ограниченных очередей).
🔹Потокобезопасность для атомарных операций добавления/удаления.

🛠 Примеры использования


from collections import deque

# 1. Создаем дек
d = deque(['middle'])

# 2. Добавляем элементы с двух сторон
d.append('right') # в конец
d.appendleft('left') # в начало
print(d) # deque(['left', 'middle', 'right'])

# 3. Удаляем элементы
d.pop()
d.popleft()

# 4. Ограниченная очередь (самое полезное!)
# Хранит только последние 3 элемента. Идеально для логов или истории.
history = deque(maxlen=3)
for i in range(5):
history.append(f"Action {i}")
print(history)
# Результат: всегда только последние 3 действия



💡 Когда стоит использовать deque?

🔹Реализация очередей (FIFO) и стеков (LIFO).
🔹Алгоритмы обхода графов (BFS - поиск в ширину).
🔹Хранение последних логов или сообщений.

Важный нюанс: Доступ к элементам по индексу в середине дека (d[n]) работает медленнее (O(n)), чем в списке (O(1)). Если вам нужен частый произвольный доступ - оставайтесь на list.


📖 Подробнее в статье: https://realpython.com/python-deque/

#python #tips #collections #backend

👉 @python_real
👍5
🐍 Создаем классическую «Змейку» на Python за 15 минут!

Помните те времена, когда мы часами залипали в «Змейку» на старых Nokia? Самое крутое, что механику этой легендарной игры можно воссоздать на Python, используя библиотеку pygame.

Это отличный проект для тех, кто хочет подтянуть навыки работы с игровыми циклами, обработкой событий и координатной сеткой.

🛠 Что внутри проекта?

1. Игровое поле: Создаем окно и задаем цвета.
2. Змейка: Представляем её как список координат блоков.
3. Логика движения: Обрабатываем нажатия клавиш (вверх, вниз, влево, вправо).
4. Еда и рост: Генерируем «яблоки» в случайных местах и увеличиваем длину змейки при поедании.
5. Game Over: Условия столкновения со стенами или собственным хвостом.

💻 Кусочек кода для старта:


import pygame
import time

# Инициализация
pygame.init()
white = (255, 255, 255)
snake_speed = 15

# Основной цикл игры
while not game_over:
for event in pygame.event.get():
if event.type == pygame.QUIT:
game_over = True
# Тут происходит вся магия движения...




В статье подробно разобрано, как собрать всё воедино, настроить экран проигрыша и добавить счетчик очков.

📖 Подробнее: https://towardsdatascience.com/implementing-the-snake-game-in-python/

#python #pygame #coding #gameloop #tutorial

👉 @python_real
🍾2👍1
🚀 Pydantic AI: Создаем типобезопасных LLM-агентов на Python

Если вы устали писать костыли для парсинга сырого текста от LLM, этот инструмент решает проблему изящно: вы задаете схемы через BaseModel, а фреймворк сам берет на себя общение с нейросетью, валидацию и ретраи при ошибках формата.

Что разбирается в статье:
Структурированный вывод: Как заставить агента возвращать строго типизированные объекты вместо "простыни" текста.

Использование инструментов (Tool Calling): Как с помощью простого декоратора @agent.tool научить LLM вызывать ваши Python-функции (например, для запросов к API или БД).

Dependency Injection: Безопасный проброс контекста (сессий БД, настроек) в агенты и инструменты с проверкой типов через RunContext.

Подводные камни: Честный разбор ограничений - как ретраи влияют на расход токенов, стоимость API и почему для масштабных проектов с кучей готовых интеграций всё еще может понадобиться LangChain или LlamaIndex.

Кому будет полезно?
Всем, кто хочет быстро прототипировать ИИ-фичи с минимальным количеством бойлерплейта и максимальным контролем над типами данных.

🔗 Читать туториал полностью: https://realpython.com/pydantic-ai/

#python #pydantic #llm #ai #development #realpython

👉 @python_real
1👍1
Вложенные циклы в Python

Вложенные циклы позволяют размещать один цикл внутри другого и тем самым выполнять повторяющиеся действия над несколькими последовательностями. Понимание этой концепции помогает писать более эффективный код, управлять сложными структурами данных и избегать проблем с читабельностью и производительностью.

Начало работы с вложенными циклами

В Python есть два основных типа циклов — for и while.

* for -цикл проходит по элементам последовательности (списка, диапазона и т. д.), когда количество итераций известно заранее.
* while -цикл выполняется, пока истинно заданное условие, и полезен, когда число итераций заранее не определено.

Вложенный цикл создаётся размещением одного цикла внутри другого:


for outer_variable in outer_iterable:
for inner_variable in inner_iterable:
<body>


Для каждой итерации внешнего цикла внутренний выполняется полностью.

Аналогия: часовая и минутная стрелки часов. Часовая проходит круг за 12 часов, минутная — за 1 час, но работают они совместно.


for hour in range(24):
for minute in range(60):
print(f"{hour:02d}:{minute:02d}")


Практические примеры

Печать шаблонов


height = 6
sail_patterns = "*#-x+o"
for row in range(height):
pattern = ""
spacing = " " * (height - row)
for symbol in sail_patterns:
pattern += symbol * row + spacing
print(pattern)


Таблица умножения


for multiplicant in range(1, 11):
for multiplier in range(1, 4):
expression = f"{multiplicant:>2d} × {multiplier}"
product = multiplicant * multiplier
print(f"{expression} = {product:>2d}", end="\t")
print()


Суммирование элементов во вложенных списках


resource_donators = [
[8, 6, 3],
[9, 2, 7],
[4, 1, 5]
]
total_resources = 0
for planet in resource_donators:
for resource in planet:
total_resources += resource
print(total_resources) # 45


Парные комбинации без самих себя


players = ["Bonnie", "Mike", "Raj", "Adah"]
for player1 in players:
for player2 in players:
if player1 != player2:
print(f"{player1} vs {player2}")


Вложенный while


while True:
word = input("Введите слово (exit — для выхода): ")
if word == "exit":
break
for letter in word:
print(letter)


Частые проблемы вложенных циклов

* Область видимости переменных. Не используйте одинаковые имена во внешнем и внутреннем циклах.
* Читаемость. Глубокая вложенность усложняет понимание кода.
* Производительность. Каждый дополнительный уровень увеличивает временную сложность (часто до O(n²) и выше).

Оптимизация

* break и continue позволяют досрочно завершать цикл или пропускать ненужные итерации.
* List Comprehension делает выражения компактнее, хотя не всегда улучшает производительность.


# Поиск "bacon" с break
for layer in blt_sandwich:
for ingredient in layer:
if ingredient == target:
print("Found bacon!")
break
if target in layer:
break


Вывод

Вложенные циклы — мощный инструмент для работы с многомерными данными и повторяющимися задачами. Однако злоупотребление ими ухудшает читаемость и скорость. Используйте их осознанно, оптимизируйте при помощи break, continue и list comprehension, и никогда не забывайте о сложности алгоритма.

https://realpython.com/nested-loops-python/

#python

👉 @python_real
👍21