Как писать чистый и красивый код на Python

машинное обучение

Автор | АНИРУДДХА БХАНДАРИ Компилировать|ВКонтакте Источник | Аналитика Видья

Обзор

  • Учебники по стилю Python позволят вам писать аккуратный и красивый код Python.

  • Изучите различные соглашения Python и другие нюансы программирования Python в этом учебном пособии по стилю.

вводить

Вы когда-нибудь сталкивались с плохо написанным кодом Python? Я знаю, что многие из вас кивнут.

Написание кода является частью роли специалиста по данным или аналитика. С другой стороны, написать красивый и чистый код на Python — совсем другое дело. Как программист, разбирающийся в аналитике или науке о данных (или даже в разработке программного обеспечения), это, скорее всего, изменит ваш имидж.

Итак, как нам написать этот так называемый красивый код на Python?

Добро пожаловать в учебник по стилю Python

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

Попутно мы часто не практикуем базовое программирование и не обращаем внимания на соглашения по программированию.

Это то, что будет рассмотрено в этом руководстве в стиле Python. Мы рассмотрим соглашения по программированию Python, описанные в документации PEP-8, и вы станете лучшим программистом!

содержание

  • Почему этот учебник в стиле Python важен для науки о данных?

  • Что такое PEP8?

  • Понимание соглашений об именах Python

  • Макет кода для учебных пособий в стиле Python

  • Ознакомьтесь с правильными комментариями Python

  • Пробелы в коде Python

  • Общие советы по программированию для Python

  • Автоматически форматировать код Python

Почему этот учебник в стиле Python важен для науки о данных

Есть несколько причин, по которым форматирование является важным аспектом программирования, особенно для проектов по науке о данных:

  • удобочитаемость

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

У вас будет много фреймов данных, списков, функций, графиков и т. д., и если вы не будете следовать надлежащим правилам форматирования, вы даже можете легко потерять свой собственный код!

  • сотрудничество

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

Это гарантирует, что код будет правильно понят без каких-либо проблем. Кроме того, следование общему шаблону формата обеспечивает согласованность программы на протяжении всего жизненного цикла проекта.

  • Исправление ошибок

Хорошо сформированный код также поможет вам, когда вам нужно исправить ошибку в вашей программе. Неправильный отступ, неподходящее название и т. д. могут легко превратить отладку в кошмар!

Поэтому лучше всего начинать писать свои программы с правильного стиля письма!

Имея это в виду, давайте кратко рассмотрим учебник по стилю PEP-8, который будет рассмотрен в этой статье!

Что такое ПЭП-8

PEP-8 или Python Enhancement Proposal — это стилизованное руководство по программированию на Python. Его написали Гвидо Ван Розен, Барри Варшава и Ник Коглан. В нем описаны правила написания красивого и читаемого кода на Python.

Следование стилю кодирования PEP-8 обеспечит согласованность кода Python, упрощая понимание кода другими читателями, участниками или вами.

В этой статье рассматриваются наиболее важные аспекты рекомендаций PEP-8, например, как давать имена объектам Python, как структурировать код, когда включать комментарии и пробелы, и, наконец, некоторые общие советы по программированию, которые важны, но легко упускаются из виду большинством программистов Python. .

Давайте учиться писать лучший код!

Официальную документацию по PEP-8 можно найти здесь.

Woohoo.Python.org/Dev/PEPs/PE…

Понимание соглашений об именах Python

Шекспир говорил: «Что в имени?» Если бы он встретил в то время программиста, то получил бы быстрый ответ — «Много!».

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

# 函数 1
def func(x):
   a = x.split()[0]
   b = x.split()[1]
   return a, b
print(func('Analytics Vidhya'))

# 函数 2
def name_split(full_name):
   first_name = full_name.split()[0]
   last_name = full_name.split()[1]
   return first_name, last_name
print(name_split('Analytics Vidhya'))
# 输出
('Analytics', 'Vidhya')
('Analytics', 'Vidhya')

Эти две функции делают одно и то же, но последняя дает лучшее представление о том, что происходит, даже без каких-либо комментариев!

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

имя в начале

Эти советы можно применить к именованию любого объекта, и им следует строго следовать.

  • следовать той же схеме
thisVariable, ThatVariable, some_other_variable, BIG_NO
  • Избегайте длинных имен и не будьте слишком бережливы.
this_could_be_a_bad_name = “Avoid this!”
t = “This isn\’t good either”
  • Используйте разумные и описательные имена. Это поможет вам вспомнить, что такое код для дальнейшего использования.
X = “My Name”  # 防止这个
full_name = “My Name”  # 这个更好
  • Избегайте имен, начинающихся с цифр
1_name = “This is bad!”
  • Избегайте использования специальных символов, таких как @, ! , #, $ и т. д.
phone_ # 不好

именование переменных

  • Имена переменных всегда должны быть строчными
blog = "Analytics Vidhya"
  • Для более длинных имен переменных используйте символы подчеркивания для разделения слов. Это улучшает читаемость
awesome_blog = "Analytics Vidhya"
  • Старайтесь не использовать односимвольные имена переменных, такие как "I" (заглавная буква I), "O" (заглавная буква O), "l" (строчная буква l). Они неотличимы от цифр 1 и 0. Взгляни:
O = 0 + l + I + 1
  • Именование глобальных переменных следует тому же соглашению.

именование функций

  • Соблюдайте соглашения об именах в нижнем регистре и подчеркивании

  • Используйте выразительные имена

# 避免
def con():
    ...
# 这个更好
def connect():
    ...
  • Если имена параметров функций конфликтуют с ключевыми словами, используйте знаки подчеркивания в конце вместо аббревиатур. Например, преобразуйте break в break_u вместо brk.
# 避免名称冲突
def break_time(break_):
    print(“Your break time is”, break_,”long”)

имя класса

  • Следуйте соглашениям об именах CapWord (или camelCase, или StudlyCaps). Начинайте каждое слово с заглавной буквы, подчеркивание между словами не делайте.
# 遵循CapWord
class MySampleClass:
    pass
  • Если класс содержит подклассы с тем же именем свойства, рассмотрите возможность добавления двойного подчеркивания к свойствам класса.

Это гарантирует, что свойства в классе Personageдоступен как _Person\возраст. Это искажение имени Python, оно гарантирует отсутствие коллизий имен.

class Person:
    def __init__(self):
        self.__age = 18

obj = Person() 
obj.__age  # 错误
obj._Person__age  # 正确
  • Используйте суффикс «Ошибка» для классов исключений.
class CustomError(Exception):
    “””自定义异常类“””

именование методов класса

  • Первый параметр методов экземпляра (методы базового класса, которые не добавляют строку) всегда должен быть self. он указывает на вызывающий объект

  • Первым параметром метода класса всегда должно быть cls. Это указывает на класс, а не на экземпляр объекта

class SampleClass:
    def instance_method(self, del_):
        print(“Instance method”)

    @classmethod
    def class_method(cls):
        print(“Class method”)

именование пакетов и модулей

  • Делайте имена как можно более короткими и четкими

  • Следует соблюдать соглашение об именах в нижнем регистре

  • Для длинных имен модулей предпочтительны символы подчеркивания.

  • Избегайте подчеркивания в именах пакетов

testpackage # 包名称
sample_module.py # 模块名称

постоянное именование

  • Константы обычно объявляются и назначаются в модулях

  • Имена констант должны быть написаны заглавными буквами.

  • Используйте символы подчеркивания для более длинных имен

# 下列常量变量在global.py模块
PI = 3.14
GRAVITY = 9.8
SPEED_OF_Light = 3*10**8

Макет кода для учебных пособий в стиле Python

Теперь, когда вы знаете, как давать имена объектам в Python, следующий вопрос должен заключаться в том, как структурировать код в Python!

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

Итак, без лишних слов, давайте рассмотрим основы компоновки кода в Python!

отступ

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

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

Следуйте стилям отступов, упомянутым ниже, для согласованного стиля сценариев Python.

  • Всегда следуйте правилу отступа в 4 пробела
# 示例
if value<0:
    print(“negative value”)

# 另一个例子
for i in range(5):
    print(“Follow this rule religiously!”)
  • Вместо табуляции рекомендуется использовать пробелы

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

if True:
    print('4 spaces of indentation used!')
  • Разбивать большие выражения на строки

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

# 与起始分隔符对齐。
def name_split(first_name,
               middle_name,
               last_name)

# 另一个例子。
ans = solution(value_one, value_two,
               value_three, value_four)

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

# 利用额外的缩进。
def name_split(
        first_name,
        middle_name,
        last_name):
    print(first_name, middle_name, last_name)

Наконец, вы даже можете использовать «висячие отступы». Висячий отступ в контексте Python относится к стилю текста, в котором строка, содержащая круглые скобки, заканчивается открывающей скобкой, а последующие строки имеют отступ до конца скобки.

# 悬挂缩进
ans = solution(
    value_one, value_two,
    value_three, value_four)
  • Отступы if могут быть проблемой

Оператор if с несколькими условиями естественно содержит 4 пробела. Как видите, это может быть проблемой. Последующие строки также будут иметь отступ, и невозможно отличить оператор if от блока кода, который он выполняет. Теперь, что нам делать?

Что ж, у нас есть несколько способов обойти это:

# 这是个问题。
if (condition_one and
    condition_two):
    print(“Implement this”)

Один из способов — использовать дополнительный отступ!

# 使用额外的缩进
if (condition_one and
        condition_two):
    print(“Implement this”)

Другой способ — добавить комментарий между условием оператора if и блоком кода, чтобы различать их:

# 添加注释。
if (condition_one and
    condition_two):
    # 此条件有效
    print(“Implement this”)
  • закрытие скобок

Предположим, у вас есть очень длинный словарь. Вы поместили все пары ключ-значение в отдельные строки, но куда вы поместили закрывающую скобку? Это на последней строке? Или следовать последней паре ключ-значение? Если поместить в последнюю строку, каков отступ позиции закрывающей скобки?

Есть также несколько способов решить эту проблему.

Один из способов — совместить закрывающую скобку с первым непробельным символом предыдущей строки.

# 
learning_path = {
    ‘Step 1’ : ’Learn programming’,
    ‘Step 2’ : ‘Learn machine learning’,
    ‘Step 3’ : ‘Crack on the hackathons’
    }

Второй способ — сделать его первым символом новой строки.

learning_path = {
    ‘Step 1’ : ’Learn programming’,
    ‘Step 2’ : ‘Learn machine learning’,
    ‘Step 3’ : ‘Crack on the hackathons’
}
  • разрыв строки перед бинарным оператором

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

Теперь очевидный вопрос - break до или после оператора? Соглашение состоит в том, чтобы разорвать строку перед оператором. Это помогает идентифицировать оператор и операнды, на которые он действует.

# 在操作符之前断行
gdp = (consumption
      + government_spending
      + investment
      + net_exports
      )

использовать пустые строки

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

  • Функции и классы верхнего уровня должны быть разделены двумя пустыми строками.
#分离类和顶层函数
class SampleClass():
    pass


def sample_function():
    print("Top level function")
  • Методы в классе должны быть разделены одной пробельной линией.
# 在类中分离方法
class MyClass():
    def method_one(self):
        print("First method")

    def method_two(self):
        print("Second method")
  • Старайтесь не включать пустые строки между разделами кода со связанной логикой и функциями.
def remove_stopwords(text): 
    stop_words = stopwords.words("english")
    tokens = word_tokenize(text) 
    clean_text = [word for word in tokens if word not in stop_words] 

    return clean_text
  • Вы можете использовать меньше пустых строк для разделения логических частей в функции. Это облегчает понимание кода
def remove_stopwords(text): 
    stop_words = stopwords.words("english")
    tokens = word_tokenize(text) 
    clean_text = [word for word in tokens if word not in stop_words] 

    clean_text = ' '.join(clean_text)
    clean_text = clean_text.lower()

    return clean_text

максимальная длина линии

  • Строка не более 79 символов

Когда вы пишете код на Python, вы не можете упаковать более 79 символов в одну строку. Это предел, и он должен быть ориентиром для того, чтобы высказывания были короткими.

  • Вы можете разделить операторы на несколько строк и преобразовать их в более короткие строки кода.
# 分成多行
num_list = [y for y in range(100) 
            if y % 2 == 0 
            if y % 5 == 0]
print(num_list)

импортный пакет

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

  • Всегда должен быть вверху скрипта Python

  • Отдельные библиотеки должны быть импортированы в отдельные строки

import numpy as np
import pandas as pd

df = pd.read_csv(r'/sample.csv')
  • Импорт должен быть сгруппирован в следующем порядке:

    • Импорт стандартной библиотеки
    • Связанный сторонний импорт
    • Собственный импорт приложений/библиотек
  • Включить пустую строку после каждой группы импорта

import numpy as np
import pandas as pd
import matplotlib
from glob import glob
import spaCy 
import mypackage
  • Несколько классов могут быть импортированы из одного модуля в одну строку
from math import ceil, floor

Ознакомьтесь с правильными комментариями Python

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

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

Общие советы

  • Комментарии всегда начинаются с заглавной буквы

  • Комментарии должны быть полными предложениями

  • Обновлять комментарии при обновлении кода

  • Избегайте писать комментарии об очевидном

стиль аннотации

  • опишите фрагменты кода, которые следуют за ними

  • иметь тот же отступ, что и фрагмент кода

  • начни с пробела

# 从用户输入字符串中删除非字母数字字符。
import re

raw_text = input(‘Enter string:‘)
text = re.sub(r'\W+', '  ', raw_text)

Встроенные комментарии

  • Эти комментарии находятся в той же строке, что и операторы кода.

  • Должны быть отделены от операторов кода как минимум двумя пробелами.

  • Начинается с обычного #, за которым следует пробел

  • Не используйте их, чтобы констатировать очевидное

  • Используйте их экономно, так как они могут отвлекать

info_dict = {}  # 字典,用于存储提取的信息

строка документации

  • Используется для описания общих модулей, классов, функций и методов.

  • Также известен как «строки документации».

  • Они выделяются среди других комментариев тем, что заключены в тройные кавычки.

  • Если строка документации заканчивается одной строкой, добавьте терминатор """ в ту же строку.

  • Если строка документации разделена на несколько строк, поставьте разделитель """ в новую строку.

def square_num(x):
    """返回一个数的平方."""
    return x**2

def power(x, y):
    """多行注释。
       返回x**y.
    """
    return x**y

Пробелы в коде Python

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

Самое важное

  • Избегайте размещения пробелов непосредственно внутри круглых скобок
# 正确的方法
df[‘clean_text’] = df[‘text’].apply(preprocess)
  • Не ставьте пробелы перед запятыми, точками с запятой или двоеточием
# 正确
name_split = lambda x: x.split()
  • Не включайте пробелы между символами и открывающей скобкой
# 正确
print(‘This is the right way’)
# 正确
for i in range(5):
    name_dict[i] = input_list[i]
  • При использовании нескольких операторов включайте пробелы только вокруг оператора с самым низким приоритетом.
# 正确
ans = x**2 + b*x + c
  • В сегментировании двоеточие действует как бинарный оператор.

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

# 正确
df_valid = df_train[lower_bound+5 : upper_bound-5]
  • Следует избегать пробелов в конце

  • Значения параметра функции по умолчанию не имеют пробелов вокруг знака =

def exp(base, power=2):
    return base**power
  • Всегда заключайте следующие бинарные операторы в один пробел:
    • Операторы присваивания (=, +=, -= и т. д.)
    • сравнить(=, !=, , =, ввод, нет, да, нет)
    • логическое (и, или, не)
# 正确
brooklyn = [‘Amy’, ‘Terry’, ‘Gina’, 'Jake']
count = 0
for name in brooklyn:
    if name == ‘Jake’:
        print(‘Cool’)
        count += 1

Общие советы по программированию для Python

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

  • Всегда используйте «есть» или «не является» при сравнении с чем-то вроде «Нет». не используйте оператор равенства
# 错误
if name != None:
    print("Not null")
# 正确
if name is not None:
    print("Not null")
  • Не используйте операторы сравнения для сравнения логических значений с TRUE или FALSE. Хотя использование оператора сравнения может быть интуитивно понятным, в нем нет необходимости. Просто напишите логическое выражение
# 正确
if valid:
    print("Correct")
# 错误
if valid == True:
    print("Wrong")
  • Вместо привязки лямбда-функции к идентификатору используйте универсальную функцию. Потому что назначение лямбда-функции идентификатору противоречит ее назначению. Обратный путь также будет проще
# 选择这个
def func(x):
    return None

# 而不是这个
func = lambda x: x**2
  • При перехвате исключения укажите имя исключения, которое вы хотите перехватить. Не используйте голое исключение. Это гарантирует, что когда вы попытаетесь прервать выполнение, блок исключения не маскирует другие исключения с помощью исключения прерывания клавиатуры.
try:
    x = 1/0
except ZeroDivisionError:
    print('Cannot divide by zero')
  • Будьте последовательны в своем заявлении о возврате. То есть все операторы возврата в функции должны возвращать выражение или ни один из них не должен возвращать выражение. Кроме того, если оператор return ничего не возвращает, верните None вместо ничего.
# 错误
def sample(x):
    if x > 0:
        return x+1
    elif x == 0:
        return
    else:
        return x-1

# 正确
def sample(x):
    if x > 0:
        return x+1
    elif x == 0:
        return None
    else:
        return x-1

Если вы хотите проверить наличие префиксов или суффиксов в строке, используйте «.startswith()» и «.endswith()» вместо фрагментов строки. Они чище и менее подвержены ошибкам

# 正确
if name.endswith('and'):
    print('Great!')

Автоматически форматировать код Python

Когда вы пишете небольшие программы, форматирование не должно быть проблемой. Но представьте, что для сложной программы, состоящей из тысяч строк, необходимо соблюдать правильные правила форматирования! Это, безусловно, сложная задача. И в большинстве случаев вы даже не помните всех правил форматирования.

Как мы можем решить эту проблему? Что ж, мы можем выполнить эту работу с некоторыми автоматическими форматировщиками!

Автоматический форматтер — это программа, которая выявляет ошибки форматирования и исправляет их на месте. Black — один из таких автоформатеров, который автоматически форматирует код Python в код, совместимый с PEP8, снимая нагрузку с ваших плеч.

BLACK:Leatherskin.org/project/bara…

Его можно легко установить с помощью pip, введя в терминале следующую команду:

pip install black

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

Теперь все, что нам нужно сделать, это зайти в терминал и ввести следующую команду:

black style_script.py

После этого черный, возможно, закончил внесение изменений, и вы получите следующее сообщение:

Как только вы попытаетесь снова открыть программу, эти изменения будут отражены в программе:

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

Black также интегрируется с Atom, Sublime Text, кодом visualstudio и даже Jupyter Notebook! Это, несомненно, плагин, который вы никогда не пропустите.

Помимо черного, есть и другие автоформатеры, такие как autoep8 и yapf, которые вы тоже можете попробовать!

конец

Мы рассмотрели множество ключевых моментов в руководстве по стилю Python. Если вы будете последовательно следовать этим принципам в своем коде, вы получите более чистый и читаемый код.

Кроме того, когда вы работаете над проектом в команде, полезно следовать общему стандарту. Это облегчает понимание для других сотрудников. Начните добавлять эти приемы стиля в свой код Python!

Оригинальная ссылка:Woohoo.Со слов аналитиков vi.com/blog/2020/0…

Добро пожаловать на сайт блога Panchuang AI:panchuang.net/

sklearn машинное обучение китайские официальные документы:sklearn123.com/

Добро пожаловать на станцию ​​сводки ресурсов блога Panchuang:docs.panchuang.net/