Forwarded from местный датасасер ☮️
Вчера вышел Python 3.9! 🥳
Лично я по питону сильно соскучился, ибо уже второй месяц пишу только на C и плюсах, а тут еще и обнова подъехала 😎
Итак, что нового и действительно интересного:
1. Новые операторы для словарей: finally можно нормально их мержить:
Отдельный респект за очередную отсылку к Монти Пайтону на странице обновы
Лично я по питону сильно соскучился, ибо уже второй месяц пишу только на C и плюсах, а тут еще и обнова подъехала 😎
Итак, что нового и действительно интересного:
1. Новые операторы для словарей: finally можно нормально их мержить:
dict1 = {'x': 1, 'y': 2}
dict2 = {'x': 4, 'z': 5}
print(dict1 | dict2) # выведет {'x': 4, 'y': 2, 'z': 5}
2. Методы строк, позволяющие получить строку без указанного префикса/суффикса: "abcdef".removeprefix("abc") # выведет def
"abcdef".removesuffix("def") # выведет abc
3. Более удобные декораторы, теперь там можно делать что-то такое:@buttons[0].clicked.connect📗 Также добавили плюшек в аннотации, обновили поддержку Юникода и много других мелочей, о которых можно почитать на официальном сайте.
def spam():
...
Отдельный респект за очередную отсылку к Монти Пайтону на странице обновы
Forwarded from Datalytics
Дмитрий Федеров перевёл официальные туториалы по Pandas на русский язык. Теперь это один из тех (немногочисленных) русскоязычных материалов, которые я могу смело рекомендовать любому, кто начинает изучать Pandas
http://dfedorov.spb.ru/pandas/
http://dfedorov.spb.ru/pandas/
Forwarded from Datalytics
🐼 Pandas (part I) 📈
**Для начинающих**
Руководство по Pandas для начинающих
Курс по работе с Pandas
Визуальный гайд по работе с Pandas
Русскоязычный гайд про Pandas
Видеолекция Ильи Щурова про Pandas
Обзорная статья про Pandas
🔥 Русскоязычный гайд по Pandas от Алексея Куличевского
🔥 Введение в pandas: анализ данных на Python (на русском)
Как устроены Series в Pandas
Советы о том как выбирать колонки датафрейма в Pandas
Всеобъемлющий туториал по Pandas
Иллюстрированная статья про функции объединения в pandas
Чтение файлов csv, создание dataframe и фильтрация данных
100 полезных приёмов и хаков в Pandas от Kevin Markham, собранные в одном ноутбуке
Агрегация и группировка данных с помощью pandas
Мини-курс по Pandas на Kaggle
🔥 Перевод официальных туториалов Pandas на русский
**Оформление**
Вывод датафреймов с помощью styling
Форматирование таблиц в Pandas
Как создать оформленную HTML таблицу из pandas DataFrame
**Методы**
Обзор метода read_csv
Выбор сэмпла из датафрейма с помощью sample
Метод query
Трансформация данных (pivot, stack, unstack)
Как сделать ВПР (VLOOKUP) в Pandas
Map и replace
Выбор данных (slicing)
Почему Method Chaining — это хорошо
Melt в pandas
Apply и lambda
Как работают группировки
Новые методы в pandas 0.25.0
iterrows() vs itertuples()
Методы трансформации данных
Методы loc и iloc для индексации по датафрейму
Как разбить данные на диапазоны в pandas: cut и qcut
Метод resample для изменения группировки данных, содержащих дату-время
Три метода Pandas, о которых вы, возможно, не знали
4 крутых функции Numpy
Обзор пяти простых, но эффективных, методов pandas: shift, mask, value_counts, nlargest, nsmallest
Обзор нескольких новых функций в Pandas 1.0
**Для начинающих**
Руководство по Pandas для начинающих
Курс по работе с Pandas
Визуальный гайд по работе с Pandas
Русскоязычный гайд про Pandas
Видеолекция Ильи Щурова про Pandas
Обзорная статья про Pandas
🔥 Русскоязычный гайд по Pandas от Алексея Куличевского
🔥 Введение в pandas: анализ данных на Python (на русском)
Как устроены Series в Pandas
Советы о том как выбирать колонки датафрейма в Pandas
Всеобъемлющий туториал по Pandas
Иллюстрированная статья про функции объединения в pandas
Чтение файлов csv, создание dataframe и фильтрация данных
100 полезных приёмов и хаков в Pandas от Kevin Markham, собранные в одном ноутбуке
Агрегация и группировка данных с помощью pandas
Мини-курс по Pandas на Kaggle
🔥 Перевод официальных туториалов Pandas на русский
**Оформление**
Вывод датафреймов с помощью styling
Форматирование таблиц в Pandas
Как создать оформленную HTML таблицу из pandas DataFrame
**Методы**
Обзор метода read_csv
Выбор сэмпла из датафрейма с помощью sample
Метод query
Трансформация данных (pivot, stack, unstack)
Как сделать ВПР (VLOOKUP) в Pandas
Map и replace
Выбор данных (slicing)
Почему Method Chaining — это хорошо
Melt в pandas
Apply и lambda
Как работают группировки
Новые методы в pandas 0.25.0
iterrows() vs itertuples()
Методы трансформации данных
Методы loc и iloc для индексации по датафрейму
Как разбить данные на диапазоны в pandas: cut и qcut
Метод resample для изменения группировки данных, содержащих дату-время
Три метода Pandas, о которых вы, возможно, не знали
4 крутых функции Numpy
Обзор пяти простых, но эффективных, методов pandas: shift, mask, value_counts, nlargest, nsmallest
Обзор нескольких новых функций в Pandas 1.0
Forwarded from Datalytics
🐼 Pandas (part II) 📊
Tips & Tricks
Шпаргалка по Pandas 1
Шпаргалка по Pandas 2
Набор небольших советов
Обзор различных хаков Pandas
Подборка полезных сниппетов 1
Подборка полезных сниппетов 2
Шпаргалка по работе с различными форматами файлов (csv, xml, json и многие другие)
Другое
Выгрузка файла csv из Jupyter Notebook через браузер
Как в Pandas разбить одну колонку на несколько
Сборник упражнений по Pandas
Примеры использования нестандартных команд в Pandas
Туториал по обработке данных
Советы для эффективной обработки данных в Pandas
Импорт данных в Pandas
Очистка и подготовка данных
Статья про индексы в датафреймах
Что под капотом у фильтрации в Pandas
Как трансформировать JSON с множественными уровнями вложенности в DataFrame
Как ухаживать за пандами [видео]
Как сделать исключение одного датафрейма из другого
Обработка данных в разных форматах
Regex with Pandas and Named Groups
Что принёс нам Pandas 1.0
Примеры использования pandas для тестирования алгоритмов сбора и обработки данных
Как использовать if-else конструкции для формирования новых колонок в pandas
Библиотека sidetable — value_counts() на стериодах
Про преобразование значений из численного в категориальный
Индексы в Pandas
Производительность
Сравнение производительности функций
Руководство по использованию pandas для анализа больших датасетов
Организация циклов через iterrows и apply
Почему каждый Data Scientist должен знать Dask
Производительность циклов в pandas
Оптимизация памяти при работе с pandas
Советы как снизить потребление памяти в Pandas
Как анализировать большой объем данных с помощью библиотеки vaex
Ускорение обработки больших датасетов с помощью dask и parquet
Добавляем параллельные вычисления в Pandas с pandarallel
Ian Ozsvald - Making Pandas Fly
Tips & Tricks
Шпаргалка по Pandas 1
Шпаргалка по Pandas 2
Набор небольших советов
Обзор различных хаков Pandas
Подборка полезных сниппетов 1
Подборка полезных сниппетов 2
Шпаргалка по работе с различными форматами файлов (csv, xml, json и многие другие)
Другое
Выгрузка файла csv из Jupyter Notebook через браузер
Как в Pandas разбить одну колонку на несколько
Сборник упражнений по Pandas
Примеры использования нестандартных команд в Pandas
Туториал по обработке данных
Советы для эффективной обработки данных в Pandas
Импорт данных в Pandas
Очистка и подготовка данных
Статья про индексы в датафреймах
Что под капотом у фильтрации в Pandas
Как трансформировать JSON с множественными уровнями вложенности в DataFrame
Как ухаживать за пандами [видео]
Как сделать исключение одного датафрейма из другого
Обработка данных в разных форматах
Regex with Pandas and Named Groups
Что принёс нам Pandas 1.0
Примеры использования pandas для тестирования алгоритмов сбора и обработки данных
Как использовать if-else конструкции для формирования новых колонок в pandas
Библиотека sidetable — value_counts() на стериодах
Про преобразование значений из численного в категориальный
Индексы в Pandas
Производительность
Сравнение производительности функций
Руководство по использованию pandas для анализа больших датасетов
Организация циклов через iterrows и apply
Почему каждый Data Scientist должен знать Dask
Производительность циклов в pandas
Оптимизация памяти при работе с pandas
Советы как снизить потребление памяти в Pandas
Как анализировать большой объем данных с помощью библиотеки vaex
Ускорение обработки больших датасетов с помощью dask и parquet
Добавляем параллельные вычисления в Pandas с pandarallel
Ian Ozsvald - Making Pandas Fly
Forwarded from Hello World
Дженерики в Python
А теперь, когда я забайтил вас этим заголовком, перейдем к делу. Python использует утиную типизацию, так что по сути вам не нужны никакие дженерики, чтобы работать с множественными типами данных.
Однако, если вы все же хотите внести немного типизации в ваш суровый говнокод, существует решение в виде библиотеки
Рассмотрим все вышесказанное на примере такой структуры данных как стек. Создадим стек интов. При дальнейшей попытке запушить туда строку возникнет
@hw_code
А теперь, когда я забайтил вас этим заголовком, перейдем к делу. Python использует утиную типизацию, так что по сути вам не нужны никакие дженерики, чтобы работать с множественными типами данных.
Однако, если вы все же хотите внести немного типизации в ваш суровый говнокод, существует решение в виде библиотеки
typing, которое будет работать только для версий Python выше 3.5.Рассмотрим все вышесказанное на примере такой структуры данных как стек. Создадим стек интов. При дальнейшей попытке запушить туда строку возникнет
Type error.@hw_code
Forwarded from Python Academy
Композиция классов
Один из способов организации взаимодействия между классами – это композиция, или же ассоциация, классов.
В этом случае один из классов (в примере выше это
Ассоциированные объекты зачастую могут циклически ссылаться друг на друга, что ломает стандартный механизм сборки мусора. В таком случае необходимо использовать слабые ссылки из модуля
#классы #ооп
Один из способов организации взаимодействия между классами – это композиция, или же ассоциация, классов.
В этом случае один из классов (в примере выше это
Salary) является полем другого (Employee). Сложного здесь, как вы видите, ничего нет.Ассоциированные объекты зачастую могут циклически ссылаться друг на друга, что ломает стандартный механизм сборки мусора. В таком случае необходимо использовать слабые ссылки из модуля
weakref, о котором поговорим позже.#классы #ооп
Forwarded from Python Academy
Анонимные функции
Анонимные функции являются крайне полезным аспектом, которым либо пренебрегают, либо чрезмерно пользуются. Новичкам они могут показаться сложными, но это совсем не так.
В целом, структура очень простая –
Такие функции чаще всего используются, когда они больше нигде не понадобятся, то есть определять полноценную функцию нет смысла. Типичные примеры использования –
#функции #lambda
Анонимные функции являются крайне полезным аспектом, которым либо пренебрегают, либо чрезмерно пользуются. Новичкам они могут показаться сложными, но это совсем не так.
В целом, структура очень простая –
lambda <arguments>: <expression> . Сначала пишете ключевое слово lambda, далее аргументы, двоеточие и какое-то выражение, результат которого автоматически вернется.Такие функции чаще всего используются, когда они больше нигде не понадобятся, то есть определять полноценную функцию нет смысла. Типичные примеры использования –
map и filter.#функции #lambda
Forwarded from Python Academy
Дробные числа
По умолчанию числа с плавающей точкой используют память привычным образом, то есть они хранятся в двоичном виде. Это означает, что вы обычно работаете с приблизительными значениями, а не точными.
Можно использовать тип данных
Поэтому для идеальных вычислений лучше использовать
#числа #fraction
По умолчанию числа с плавающей точкой используют память привычным образом, то есть они хранятся в двоичном виде. Это означает, что вы обычно работаете с приблизительными значениями, а не точными.
Можно использовать тип данных
Decimal, который предоставит намного большую точность, но и его может не хватить в некоторых случаях. Поэтому для идеальных вычислений лучше использовать
Fraction, который представляет и хранит число в виде рациональной дроби.#числа #fraction
Forwarded from Python Academy
Находим соответствия в строках
В стандартной библиотеке Python существует модуль
Данный метод ищет "наилучшие" возможные совпадения. Первый аргумент задаёт искомую строку, второй аргумент – список, в котором выполняется поиск.
Также в метод можно передать необязательный аргумент
#difflib #строки
В стандартной библиотеке Python существует модуль
difflib, в котором есть интересный метод get_close_matches. Он позволяет найти в списке строки, похожие на некую исходную.Данный метод ищет "наилучшие" возможные совпадения. Первый аргумент задаёт искомую строку, второй аргумент – список, в котором выполняется поиск.
Также в метод можно передать необязательный аргумент
n, который задаёт максимальное число возвращаемых совпадений.#difflib #строки
Forwarded from Python Academy
Модуль subprocess
Всем доброго вечера, сегодня мы поговорим немного о модуле
Данный модуль предоставляет унифицированный интерфейс для создания дополнительных процессов с вызовом программ, а также может подключать к стандартным потокам ввода, вывода и вывода об ошибках. Модуль был добавлен в стандартную библиотеку
Для создания процессов в
Сегодня мы расскажем о функциях
Для захвата вывода процесса нам нужно передать
Иногда программа ожидает от нас ввода из стандартного потока
Для того, чтобы породить исключение в случае получения кода возврата об ошибке мы можем передать флаг
И как бонус у этой функции есть аргумент
#процессы #subprocess
Всем доброго вечера, сегодня мы поговорим немного о модуле
subprocess:)Данный модуль предоставляет унифицированный интерфейс для создания дополнительных процессов с вызовом программ, а также может подключать к стандартным потокам ввода, вывода и вывода об ошибках. Модуль был добавлен в стандартную библиотеку
python на замену os.system() и os.popen().Для создания процессов в
subprocess используются функции run(), call(), check_call(), check_output(), а также класс Popen.Сегодня мы расскажем о функциях
call, check_call, check_output и run, а завтра поговорим о Popen. Они используются, когда требуется запустить программу и дождаться ее выполнения.call - вызывается для создания процесса, ожидает выполнения и возвращает код выполнения (если программа отработала корректно, вернется 0).check_call - делает тоже самое только еще и проверяет возвращаемое значение, если код выхода указывает, что произошла ошибка, то функция выбросит исключение CalledProcessError. check_output - использовалась, когда нужно было захватить вывод запущенного процесса. Эта функция была нужна, так как потоки ввода и вывода запущенного процесса через call привязывались именно к вводу и выводу данного процесса, поэтому вывод таким образом захватить не получится.run - это функция пришла в python версии 3.5 на замену трем предыдущим и умеет все, что и они и немножко больше (данные три функции были оставлены для обратной совместимости). run() возвращает объект CompletedProcess, который привязан к результату. Для захвата вывода процесса нам нужно передать
capture_output=True, после чего в аргументах объекта stdout и stderr будут записаны соответствующие выводы, запущенной программы. Но по умолчанию вывод будет вывод будет в байтах, чтобы получить читабельный текст мы также передаем флаг text=True. Иногда программа ожидает от нас ввода из стандартного потока
stdin, в этом случае мы можем передать ввод через аргумент input.Для того, чтобы породить исключение в случае получения кода возврата об ошибке мы можем передать флаг
check=True. И как бонус у этой функции есть аргумент
timeout позволяющий передать время, через которое процесс должен быть принудительно завершен. В случае принудительного завершения будет выброшено исключение TimeoutExpired.#процессы #subprocess
Forwarded from Python Academy
Генераторы
В этом посте освежим знания про генераторы, чтобы далее разобрать такую интересную тему, как корутины.
Функции-генераторы выглядят как и обычные, но содержат выражения с ключевым словом
Вызов подобной функции вернёт не значение, а объект генератора. Далее из этого объекта можно получать значения, например, с помощью функции
Если генератору больше нечего возвращать, то будет вызвано исключение
#генераторы
В этом посте освежим знания про генераторы, чтобы далее разобрать такую интересную тему, как корутины.
Функции-генераторы выглядят как и обычные, но содержат выражения с ключевым словом
yield для последовательного генерирования значений. В целом, генератор – это особый, более изящный случай итератора.Вызов подобной функции вернёт не значение, а объект генератора. Далее из этого объекта можно получать значения, например, с помощью функции
next или циклом for.Если генератору больше нечего возвращать, то будет вызвано исключение
StopIteration.#генераторы
Forwarded from Python Academy
FastAPI
Недавно на канале вышел пост про асинхронный фреймворк Tornado, и в комментариях подписчик упомянул FastAPI, про который однозначно стоит рассказать. Честно, синтаксис мне кажется намного приятнее, чем у других фреймворков.
Интересно, что автор фреймворка глубоко изучил несколько других фреймворков, от классических, таких как Django, до более современных, таких как Sanic, а также изучил различные технологии в NestJS (веб-фреймворк Node.js, Typescript).
Фреймворк имеет важную особенность – автоматическая генерация документации: как только ваши конечные точки будут реализованы, вы сможете поиграться с API, используя соответствующий стандартам пользовательский интерфейс. Поддерживаются SwaggerUI, ReDoc и другие.
FastAPI построен на удивительной библиотеке Starlette, в результате чего производительность сравнима с Node.js, а в некоторых случаях даже Go! В целом, складывается стойкое предчувствие, что FastAPI будет мчаться вперёд как лучший асинхронный фреймворк для Python.
#фреймворки #web
Недавно на канале вышел пост про асинхронный фреймворк Tornado, и в комментариях подписчик упомянул FastAPI, про который однозначно стоит рассказать. Честно, синтаксис мне кажется намного приятнее, чем у других фреймворков.
Интересно, что автор фреймворка глубоко изучил несколько других фреймворков, от классических, таких как Django, до более современных, таких как Sanic, а также изучил различные технологии в NestJS (веб-фреймворк Node.js, Typescript).
Фреймворк имеет важную особенность – автоматическая генерация документации: как только ваши конечные точки будут реализованы, вы сможете поиграться с API, используя соответствующий стандартам пользовательский интерфейс. Поддерживаются SwaggerUI, ReDoc и другие.
FastAPI построен на удивительной библиотеке Starlette, в результате чего производительность сравнима с Node.js, а в некоторых случаях даже Go! В целом, складывается стойкое предчувствие, что FastAPI будет мчаться вперёд как лучший асинхронный фреймворк для Python.
#фреймворки #web
Forwarded from Python Academy
Tornado
На удивление, Tornado – достаточно старый фреймворк. Самый первый релиз был выпущен в далёком 2009 году, и сейчас его основное внимание направлено на обеспечении надежного асинхронного программирования с высоким параллелизмом.
Tornado изначально не являлся веб-фреймворком. На самом деле это просто набор асинхронных модулей, которые используются для построения модулей веб-фреймворка. Если более конкретно, то вот эти модули:
– Корутины и другие примитивы (
– Сетевые модули (
– Асинхронные сервера и клиенты (
Они были совмещены для получения финальный модулей фреймворка:
#фреймворки #web
На удивление, Tornado – достаточно старый фреймворк. Самый первый релиз был выпущен в далёком 2009 году, и сейчас его основное внимание направлено на обеспечении надежного асинхронного программирования с высоким параллелизмом.
Tornado изначально не являлся веб-фреймворком. На самом деле это просто набор асинхронных модулей, которые используются для построения модулей веб-фреймворка. Если более конкретно, то вот эти модули:
– Корутины и другие примитивы (
tornado.gen, tornado.locks, tornado.queues и т. д.)– Сетевые модули (
tornado.ioloop, tornado.iostream и т. д.)– Асинхронные сервера и клиенты (
tornado.httpserver, tornado.httpclient и т. д.)Они были совмещены для получения финальный модулей фреймворка:
tornado.web, tornado.routing, tornado.template и тому подобные.#фреймворки #web
Forwarded from 🐍 PythonGuru — работа и стажировки для программистов
Слив курса - Разработка Telegram ботов на Python
Описание и структура курса:
Научись разрабатывать ботов любой сложности для месседжера Telegram. В этом подробном курсе построение ботов от А до Я.
- Как работать с API Telegram
- Преимущества и принципы разработки ботов на асинхронной библиотеке Aiogram
- Использовать язык программирования Python для написания ботов
- Взаимодействие между ботами, чатами, каналами и группами
- Создание кнопок, режим инлайн, deeplinking
- Как использовать Базы данных в ботах (PostgreSQL и SQLite)
- Работа с удаленным сервером на Ubuntu
- Много много прочего
Скачать с Mail облака
Описание и структура курса:
Научись разрабатывать ботов любой сложности для месседжера Telegram. В этом подробном курсе построение ботов от А до Я.
- Как работать с API Telegram
- Преимущества и принципы разработки ботов на асинхронной библиотеке Aiogram
- Использовать язык программирования Python для написания ботов
- Взаимодействие между ботами, чатами, каналами и группами
- Создание кнопок, режим инлайн, deeplinking
- Как использовать Базы данных в ботах (PostgreSQL и SQLite)
- Работа с удаленным сервером на Ubuntu
- Много много прочего
Скачать с Mail облака
Forwarded from Python Lounge: работа и стажировки для программистов
В Python имя переменной может состоять из одного подчеркивания: _. Хотя обычно такие имена не достаточно описательны и не должны использоваться, есть по крайней мере три случая, когда _ имеет общепринятый смысл.
Во-первых, интерактивные интерпретаторы Python используют _ для хранения результата последнего выполненного выражения:
В-третьих, _ используется, когда вам нужно придумать имена для значений, которые вам не нужны:
Во-первых, интерактивные интерпретаторы Python используют _ для хранения результата последнего выполненного выражения:
>>> 2 + 2Во-вторых, руководство модуля gettext рекомендует псевдоним его функции gettext() для _(), чтобы минимизировать загромождение вашего кода.
4
>>> _
4
В-третьих, _ используется, когда вам нужно придумать имена для значений, которые вам не нужны:
for _ in range(10):
print('Hello!')
Forwarded from Moscow Python (Valentin Dombrovsky)
В эту пятницу в 19 часов - очередной Python-стрим. На этот раз мы поговорим о том, зачем качать понимание экосистемы Пайтона с Алексеем Пироговым и Никитой Соболевым из Drylabs! https://www.youtube.com/watch?v=llMvi3p50c0
YouTube
Python-стрим - Качаем понимание экосистемы Пайтона!
Мы продолжаем Python-стримы - на этот раз у нас сразу 2 гостя: СТО Drylabs Никита Соболев и ментор Python в Drylabs Алексей Пирогов.
С 1-го по 15-е декабря Drylabs проведёт серию вебинаров под общим названием "Python-карантин. Вторая волна".
Темы вебинаров:…
С 1-го по 15-е декабря Drylabs проведёт серию вебинаров под общим названием "Python-карантин. Вторая волна".
Темы вебинаров:…
Forwarded from CoolPython
Работа с JSON
Хотела собрать для менти ссылок по работе с JSON, но не нашла, чтобы в одном месте последовательно, исчерпывающе и без воды рассказали бы все самое важное, что питонисту нужно знать о работе с этим форматом.
Поэтому сделала лонгрид по JSON'у сама и делюсь с вами! Статью в PDF можно посмотреть на моем Patreon'e, она бесплатная. Рассчитана на уровень джуниоров и стажеров. В канал выложить не могу, потому что слишком много текста, а в тексте картинки, схемы и даже один мем!
Из головных болей: не получилось сверстать так идеально, как хотелось. Начала с LaTeX, поняла, что верстается долго, перешла в markdown, но там некрасиво легли картинки. Наконец, сделала в Notion и все равно недовольна. Дайте знать, если умеете красиво верстать без боли и адских страданий или можете рассказать, на какой платформе вам удобнее читать лонгриды.
🐠
Хотела собрать для менти ссылок по работе с JSON, но не нашла, чтобы в одном месте последовательно, исчерпывающе и без воды рассказали бы все самое важное, что питонисту нужно знать о работе с этим форматом.
Поэтому сделала лонгрид по JSON'у сама и делюсь с вами! Статью в PDF можно посмотреть на моем Patreon'e, она бесплатная. Рассчитана на уровень джуниоров и стажеров. В канал выложить не могу, потому что слишком много текста, а в тексте картинки, схемы и даже один мем!
Из головных болей: не получилось сверстать так идеально, как хотелось. Начала с LaTeX, поняла, что верстается долго, перешла в markdown, но там некрасиво легли картинки. Наконец, сделала в Notion и все равно недовольна. Дайте знать, если умеете красиво верстать без боли и адских страданий или можете рассказать, на какой платформе вам удобнее читать лонгриды.
🐠