Python на примерах
1.39K subscribers
411 photos
6 videos
145 links
Короткие уроки Python на примерах
Download Telegram
Как писать хороший код на python?🤔📄

✅Умение правильно и хорошо писать код — это важный навык для python-разработчика. Как научится писать хороший код — вы узнаете из сегодняшней статьи. Говоря о „хорошем коде“ имеется в виду большое количество факторов с которыми вам предстоит познакомиться, чтобы писать правильный и "конвейерный" код.

Возможно, самый известный сборник этих факторов Python был написан Тимом Питерсом, давний участник языка и его группы новостей
comp.lang.python.
Этот сборник также известен под названием «The Zen of Python» и в нём изложены следующие факторы „хорошего кода“.

👉🏻 The Zen of Python, by Tim Peters 👈🏻
· Beautiful is better than ugly — Красивое — лучше, чем уродливое
·
Explicit is better than implicit — Явное лучше, чем неявное.
·
Simple is better than complex — Простое лучше, чем сложное.
·
Complex is better than complicated - Сложное лучше, чем запутанное.
· Flat is better than nested - Плоский лучше, чем вложенный.
· Sparse is better than dense - Редкое лучше, чем частое.
· Readability counts - Читаемость имеет значение.
· Special cases aren't special enough to break the rules - Особых случаев недостаточно, чтобы нарушать правила.
· Although practicality beats purity - Хотя практичность лучше чистоты.
· Errors should never pass silently - Ошибки никогда не должны замалчиваться.
· Unless explicitly silenced — Если только они не замалчиваются явно.
· In the face of ambiguity, refuse the temptation to guess – Перед лицом двусмысленности откажитесь от соблазна угадать.
· There should be one -- and preferably only one -- obvious way to do it. – Должен быть один - и желательно только один - очевидный способ сделать это.
· Although that way may not be obvious at first unless you're Dutch – Хотя поначалу этот способ может быть не очевиден, если вы не голландец.
· Now is better than never – Лучше сейчас, чем никогда.
· Although never is often better than *right* now – Хотя никогда не бывает лучше, чем прямо сейчас.
· If the implementation is hard to explain, it's a bad idea – Если реализацию сложно объяснить, это плохая идея.
· If the implementation is easy to explain, it may be a good idea – Если реализацию легко объяснить, это может быть хорошей идеей.
· Namespaces are one honking great idea -- let's do more of those! – Пространства имен - одна отличная идея - давайте сделаем их больше!
Эти факторы можно быстро заполучить просто написав в интерпретаторе
import this
После чего вы получите данный список.
***
Без пониманий этих факторов ваш код будет непригодным для больших, и без того сложных проектов.
***
❤1
⚡️ DeepCode — открытая AI-платформа для автоматической генерации кода.

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

🔹 Основные возможности:
• Paper2Code — реализация идей из исследований в рабочий код
• Text2Web — генерация интерфейсов по описанию
• Text2Backend — автоматическое создание масштабируемых серверов
• Поддержка длинных документов и многофайловых проектов

🔜 В ближайшее время разработчики обещают:
• Автоматическую проверку и валидацию кода
• Повышение скорости генерации
• Улучшенную работу с требованиями
• Бенчмарки воспроизведения научных статей (PaperBench)

Проект полностью open source: https://github.com/HKUDS/DeepCode
Использование контекстных менеджеров для работы с ресурсами

Контекстные менеджеры позволяют управлять ресурсами (например, файлами, соединениями с базами данных и т.д.) более безопасным и удобным способом, гарантируя, что ресурсы будут правильно закрыты после использования.

Использование контекстных менеджеров — это простой и эффективный способ повысить надежность и читаемость вашего кода.
Использование executemany для массовых вставок данных

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

Использование executemany — это простой, но мощный способ ускорить взаимодействие с базой данных при работе с множеством записей!
Библиотека setuptools

Библиотека setuptools является инструментом для упрощения процесса создания, установки и распространения пакетов Python. Она используется в основном для упрощения установки и управления зависимостями Python-пакетов.

setuptools
предоставляет функциональность для создания файлов setup.py, которые содержат информацию о вашем пакете, его зависимостях и других метаданных. Этот файл используется инструментами для установки пакетов, такими как pip.
Метод issuperset()

Метод issuperset() возвращает True, если все элементы указанного набора существуют в исходном наборе, в противном случае он возвращает False.
PySimpleGUI

PySimpleGUI — это простая и легкая в использовании библиотека для создания графического интерфейса (GUI) в Python. Она предоставляет простые инструменты для создания оконных приложений с использованием графических элементов, таких как кнопки, текстовые поля, чекбоксы и др. PySimpleGUI предоставляет удобный интерфейс для создания GUI, особенно для начинающих разработчиков.

PySimpleGUI поддерживает различные стили и темы, и вы можете легко настраивать внешний вид вашего приложения. Вы можете найти дополнительные примеры использования PySimpleGUI на официальном сайте проекта.
👍2👎1
Импортируем пакеты

Что может быть проще? Но у Python есть несколько фишек, которые упростят работу с пакетами.

1. import <package> — просто импорт.

2. from <package> import <obj> — «вытаскивает» obj (функция, класс, переменная) из пакета. Можно импортировать всё, если написать на место <obj> звёздочку.

3. import <package> as <name> — импортирует модуль и задаёт имя, записанное после as. Работает и с from <package> import <obj> as <name>.

Последнее удобно использовать для совместимости или если у вас несколько модулей, которые работают одинаково.
👍1
Ищем жуков (bugs)

Функция подсчёта площади квадрата со стороной 5 должна возвращать 25. А если не вернёт? От таких простых ошибок защищает assert.

Если передаём оператору False, то получаем AssertionError с текстом из второго аргумента (если он есть, конечно).

Кстати, чтобы ускорить приложение, проверку можно отключить, запустив скрипт так: python3 -O foo.py.
Экранирование

Вы пытались запихнуть ' и " в строку? А сделать перенос на новую линию? Это сделать довольно сложно без экранирования (про multi-line строки пока не говорим).

Первый символ всегда будет , после идёт дополнительный, например: ' -> ', \ -> , n - перенос на новую строку, 0 - пустой символ (сишники поймут).
❤2
Модуль dis

Лучший способ узнать Python — залезть к нему под капот. Это и делает dis. Вернее, он даёт нам доступ к байт-коду.

Таким образом можно понять, каким образом Python оптимизирует код. Особенно интересно проверять с строками.
Немного про регулярные выражения

Регулярные выражения невероятно удобные. Но их просто невозможно читать, а уже тем более менять. Но есть решение!

Недавно наткнулся на статью, где гений-разработчик с помощью f-строк в разы упрощает работу с регулярными выражениями.
👍1
\b возвращает курсор вывода на один символ назад. А поскольку после него был ещё символ (a), то он просто перезаписался.

Постараюсь интерактивно показать, | это курсор. Первым делом вывелось a|, потом, за счёт \b, стало так: |a, и в результате получили c|.

Кстати, все такие символы можно тут найти.
Генераторные списки

Эта штука может уместить for в одну строку, так ещё и работает быстрее, чем обычный цикл. Используется, как вы уже поняли, для создании нового списка.

Кстати, генерировать можно не только списки, но и множества, словари. А можно просто передавать функциям, по типу sum().
Модуль heapq

Нас интересуют только две функции: nlargest() и nsmallest(). Они позволяют получить n самых больших/маленьких значений в iterable.

В большинстве случаев функции быстрее чем sorted(iterable)[:n]. Их использование можно заметить в Counter.most_common().
Поговорим про del

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

Потом, если объект нигде больше не используется, сборщик мусора удалит его.

Ещё с его помощью можно убирать данные из списка, словаря.
👍2
Фокус с type

Все мы знаем, что type позволяет определять тип данных (строка это или, может, список). Но у него есть другая функция — создание типа.

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

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

Реализуется подобная фича с помощью встроенного модуля doctest. Он ищет текста, которые выглядят как интерактивные сеансы Python (>>>, ... и подобные символы).

Вы можете запускать тесты так же, как в примере, а можно с помощью терминала: python -m doctest -v example.py.
Правила документации

class Post:
"""На первой строке краткое описание объекта. После идёт пустая строка (это обязательно).

После идёт подробное объяснение. Кто он,
что он делает и какие параметры принимает.
Документировать можно в несколько абзацев.
Писать доки можно для всего: функции, класса, модуля.
можете почитать PEP257,
там разработчики рассказывают, как объяснять код.
"""
👍3
Интерпретатор умный

Перед запуском он проходится по файлу и смотрит на первые значения переменных (a = "string"), которые потом подставляет на месте повторений (если это неизменяемые типы данных).

Именно поэтому, когда вы выполняете код в интерактивном интерпретаторе и как файл, результат может отличаться.
👍1
Это спасёт вас от кучи багов

Просто знайте, что round(x) округляет x до ближайшего чётного числа, а не так, как мы привыкли (3.5 => 4; 2.5 => 3).

Если вам нужно, чтобы 2.5 округлялось до трёх, то посмотрите в сторону decimal с настройкой ctx.rounding = ROUND_HALF_UP
🤔2