TGViewer
Channel Public Channel
Python академия

Python академия

@pythonofff

Учи Python быстро и легко.

Ежедневно публикуем практические задачи, разборы, готовые решения, объяснения логики, советы по алгоритмам.

✔ Подходит для прокачки навыков кодирования.

По всем вопросам @evgenycarter
Subscribers
7.13K
Photos
2.6K
Videos
4
Links
460

Showing posts older than #2876 · Back to latest

Older Posts 20 shown
Post #2875 801
Поиск уникальных и повторяющихся элементов в списке в Python

Список в Python – это упорядоченный набор элементов, с разрешенными дубликатами. Set – это набор уникальных элементов. Мы можем использовать это свойство, чтобы получить только уникальные элементы списка. Передайте список в качестве аргумента конструктору набора, и он вернет набор уникальных элементов.

Подписывайтесь на канал 👉@pythonofff
  • 👍 1
Post #2869 911
Полезность модуля math

Сложно переоценить пользу модуля math, если имеешь дело с какими-либо математическими функциями. Модуль представляет собой обширный функционал для работы с числами.

Его стоит импортировать тогда, когда вам необходимо работать с математикой, но не требуется избыточность модуля numpy. Например, можно импортировать число pi, как в примере.

Модуль math обеспечивает доступ к некоторым популярным математическим функциям и константам, к тому же он является встроенным (не нужно делать установку через pip).

Подписывайтесь на канал 👉@pythonofff
  • 👍 3
Post #2868 870
Проверка наличия подстрок в строке списка

А вот и задача, с которой многим приходится иметь дело ежедневно: проверять, есть ли в строке подстрока. В отличие от других языков программирования, в Python имеется для этого хорошее ключевое слово.

Подписывайтесь на канал 👉@pythonofff
Post #2857 893
Вычисление выражений Python

Вы наверняка знакомы с eval, но знаете ли вы о literal_eval? Вряд ли. Для безопасного исполнения выражений, содержащих исключительно литералы, вы можете делать так, как показано на картинке выше.

Между прочим, данная фича находится в языке уже очень давно.

Подписывайтесь на канал 👉@pythonofff
Post #2856 877
🔍 match-case + dataclass: Python как mini-Pydantic


Когда не хочется тащить Pydantic, но нужно элегантно валидировать и распарсить входящие данные — попробуй комбо match-case и dataclass. Красиво, просто, pythonic.


Python 3.10+ принёс структурное сопоставление (match-case). В связке с dataclass можно описывать и валидировать структуру данных без лишней магии.

Пример: простенький парсер события из словаря:


from dataclasses import dataclass
from typing import Any

@dataclass
class UserJoined:
user_id: int
room: str

@dataclass
class MessageSent:
user_id: int
message: str

def parse_event(event: dict[str, Any]) -> Any:
match event:
case {"type": "user_joined", "user_id": int(uid), "room": str(room)}:
return UserJoined(uid, room)
case {"type": "message_sent", "user_id": int(uid), "message": str(msg)}:
return MessageSent(uid, msg)
case _:
raise ValueError("Unknown event type")

# Пример использования
raw = {"type": "message_sent", "user_id": 42, "message": "Привет!"}
event = parse_event(raw)
print(event) # MessageSent(user_id=42, message='Привет!')


💡 Что происходит:
- match проверяет структуру словаря и типы значений.
- Если шаблон совпал, мы сразу вытаскиваем нужные поля.
- dataclass делает остальное: хранение данных и авто-_repr_.

Плюсы:
- Не надо писать вручную if, try/except, dict.get().
- Простая и читабельная валидация без внешних зависимостей.
- Работает из коробки, если у вас Python 3.10+.

Минусы:
- Без вложенных структур и сложных схем — не замена Pydantic, но хороший lightweight-вариант.

Подписывайтесь на канал 👉@pythonofff
  • ❤ 1
  • 👍 1
Post #2855 858
Форматирование строки

Самые важные части кода — это входные данные, логика и выходные данные. Все три части требуют некоторого форматирования при написании кода для получения лучших и более удобных для восприятия человеком выходных данных. В Python имеется целый ряд методов форматирования строки.

Подписывайтесь на канал 👉@pythonofff
  • 👍 2
Post #2846 890
Not a Number

В модуле math есть особый объект, который называется NaN (Not a Number).

Эти объекты NaN не уникальны, и даже не равны самим себе, так что вы можете иметь несколько подобных объектов, взятых из нескольких разных источников.

Например можно создать подобный объект, просто передав строку 'nan' во float. Кстати говоря, это значит что вы можете использовать NaN в качестве ключа в словаре (хотя мы и не советуем это делать).

Подписывайтесь на канал 👉@pythonofff
Post #2845 856
Перехожу на Go: чего НЕ стоит делать?

Приглашаем на бесплатный вебинар, где мы разберем ключевые ошибки и начнем писать Go-код правильно с самого начала.

На встрече мы:

🔸 изучим особенности синтаксиса, нюансы concurrency, обработки ошибок и управления памятью в Go;
🔸 расскажем о типичных ловушках, с которыми сталкиваются разработчики при переходе из других языков;
🔸 покажем, как правильно использовать концепции языка и не сломать себе мозг, разбираясь с GOрутинами.

Освоив эти принципы, вы сможете чувствовать себя увереннее в работе с Golang.

Когда: 29 апреля в 19:00

📌 Занять место на вебе — через бота-помощника.

erid: 2W5zFFwbK5a
  • 👍 2
Post #2844 776
Хранение в памяти

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

Подписывайтесь на канал 👉@pythonofff
  • 👍 1
Post #2842 850
Вычисляем размер объектов в памяти

Чтобы вычислить размер какого-либо объекта, можно воспользоваться функцией sys.getsizeof(object[, default]). Поскольку Python написан в полном соответствии с парадигмой ООП, таким объектом может быть все что угодно.

Однако, следует помнить, что хотя все built-in (встроенные) объекты и вернут правильный размер, в общем случае это не должно быть верно для каких-либо пользовательских объектов.

Аргумент default позволяет определить значение, которое будет возвращено, если тип объекта не предоставляет средства для извлечения размера и вызовет TypeError .

Функция getsizeof вызывает метод __sizeof__ объекта и добавляет дополнительные служебные данные сборщика мусора, если конечно объект управляется сборщиком мусора.

Подписывайтесь на канал 👉@pythonofff
  • 👍 3
Post #2841 829
Проверяем, присвоено ли значение переменной окружения

Давайте создадим Python-файл со следующим скриптом для проверки переменных. Для чтения значений переменных мы используем модуль os, а модуль sys — для прекращения работы приложения.

Бесконечный цикл while непрерывно принимает от пользователя имена переменных и проверяет их значения до тех пор, пока пользователь не введёт имя переменной, которой не присвоено значение.

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

Подписывайтесь на канал 👉@pythonofff
Post #2839 797
Explicit Conversion Flag

Флаг явного преобразования используется для преобразования значения поля format перед его непосредственным форматированием.

Это поле можно использовать для переопределения поведения format для какого либо конкретного типа и форматирования значения. В настоящее время распространены два явных флага преобразования:

!r – преобразует значение в строку, используя функцию repr()
!s – преобразует значение в строку, используя функцию str()

В примере, в случае с флагом !r строка 'Hello' будет напечатана с кавычками в поле шириной не менее 20 символов, а в случае с флагом !s – без кавычек (в более удобном для чтения виде).

Подписывайтесь на канал 👉@pythonofff
Post #2837 691

Forwarded from Библиотека Python разработчика | Книги по питону

yield from — элегантная передача управления

Если вы пишете генераторы, которые вызывают другие генераторы — забудьте про for x in sub(): yield x. Есть способ проще и мощнее.

Оператор yield from позволяет передавать элементы из подгенератора напрямую, без лишнего кода. Но фишка не только в лаконичности — он также автоматически пробрасывает исключения и возвращаемые значения из подгенератора.

Вот классика:


def gen():
for x in range(3):
yield x

def wrapper():
for x in gen():
yield x


Можно короче и лучше:


def wrapper():
yield from gen()


Но главное — yield from пробрасывает return-значение из подгенератора (начиная с Python 3.3):


def sub():
yield 1
yield 2
return 'done'

def main():
result = yield from sub()
print('Sub returned:', result)

for _ in main():
pass
# Выведет: Sub returned: done


А ещё через yield from можно проксировать значения внутрь генератора — например, в сопрограммах:


def delegator():
result = yield from coroutine()
print('coroutine done:', result)

def coroutine():
x = yield
y = yield
return x + y

g = delegator()
next(g) # Старт
next(g) # coroutine ждет x
g.send(10) # x = 10
print(g.send(20)) # y = 20 → return 30
# Выведет: coroutine done: 30


Итог: если вы пишете генераторы — освоение yield from даст вам лаконичный синтаксис, проброс return-значений, исключений и взаимодействие на новом уровне.

👉@BookPython
  • 👍 3
  • ❤ 1
  • 👎 1
Post #2836 806
Как создать базовый объект timedelta в Python

Для начала давайте создадим базовый объект timedelta:

Итак, мы успешно создали объект timedelta. Теперь нам нужно создать «эталонное» время, чтобы можно было применить созданный нами объект timedelta для выполнения каких-нибудь арифметических действий.

Подписывайтесь на канал 👉@pythonofff
  • 👍 2
Post #2834 831
Ускоряем код с помощью векторизации

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

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

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

Подписывайтесь на канал 👉@pythonofff
Post #2833 913
Присваиваем значение переменной окружения

Для присвоения значения любой переменной среды используется функция setdefault().

Давайте напишем код, чтобы с помощью функции setdefault() изменить значение переменной DEBUG на True (по умолчанию установлено False). После установки значения мы проверим его функцией get().

Если мы сделали всё правильно, выведется сообщение «Режим отладки включен», в противном случае – «Режим отладки выключен».

Подписывайтесь на канал 👉@pythonofff
  • ❤ 2
Post #2831 839
Именование среза с использованием функции slice

Работа с множеством значений, которые заданы индексами, может быстро обернуться беспорядком – как в плане поддержки, так и в плане читабельности кода.

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

Подписывайтесь на канал 👉@pythonofff
Post #2830 889
Создаем виртуальное окружение

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

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

Скрипт activate в директории bin предназначен для активации окружения, а команда deactivate в уже активированном окружении — для выхода из него.

В случае успешного создания и активации у вас в терминале должно появится название вашего виртуального окружения в круглых скобках.

Подписывайтесь на канал 👉@pythonofff
  • 👍 3
Post #2828 872
Вывод строки или списка n раз

Можно использовать умножение (*) со строками или списками; умножать их можно любое количество раз.

Интересным вариантом может быть определение списка с постоянным значением, скажем, ноль.

Подписывайтесь на канал 👉@pythonofff
  • 👍 1
Post #2827 913
Частичное применение

Сегодня поговорим об одном интересном концепте из области функционального программирования. Использовать будем функцию partial из стандартной библиотеки functools.

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

Другими словами, это такая функция, которая принимает другую функцию с несколькими параметрами и возвращает функцию, но уже с меньшим количеством параметров.

Подписывайтесь на канал 👉@pythonofff
  • 👍 1
Older posts →
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →