Лучшие практики и советы Python, которые помогут вам кодировать быстро и эффективно

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

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

Верно, что сама по себе практика не идеальна, но идеальная практика - идеальная. Это означает, что вам необходимо убедиться, что вы всегда следуете лучшим методам кодирования (комментируете свой код, используете правильный синтаксис и т. Д.), Иначе вы, скорее всего, в конечном итоге усвоите вредные привычки, которые могут нанести вред вашим будущим строкам кода.

«Универсальное соглашение обеспечивает всю удобство сопровождения, ясность, последовательность, а также основу для хороших навыков программирования. Чего он не делает, так это настаивает на том, чтобы вы следовали ему против своей воли. Это Python! »

- Тим Питерс на comp.lang.python, 2001–06–16

В этой статье я дам 10 основных советов, которые помогут вам быстро и эффективно писать код на Python.

1. Читаемость важна

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

Хэл Абельсон

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

По сути, читабельность - это характеристика, которая указывает, насколько легко другой человек может понять некоторые части вашего кода (а не вы!).

Например, я не привык писать с вертикальным выравниванием и выравнивать параметры функции с открывающим разделителем.

# No, to avoid: 
func = long_function_name(var_one, var_two,
       var_three, var_four)
#Yes, 
func = long_function_name(var_one, var_two,
                          var_three, var_four)

Посмотрите другие примеры в Руководстве по стилю для кода Python и решите, что выглядит лучше всего.

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

2. Избегайте бесполезных условий.

Часто длинное if & elif &…. Условия & else являются признаком того, что код нуждается в рефакторинге. Эти условия делают ваш код слишком длинным и трудным для интерпретации. Иногда их легко заменить, например, я делал следующее:

def f():
    if condition:
    	return True
    else:
    	return False

Это просто тупо! Функция возвращает логическое значение, так зачем вообще использовать блоки if? Правильно, что это делать:

def f():
	return condition

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

  • Год можно делить поровну на 4, это високосный год, если:
  • Год можно разделить поровну на 100, это НЕ високосный год, если:
  • Год также делится на 400 без остатка. Тогда это високосный год.

Поэтому в этой задаче забудьте о ifs и elses и просто сделайте следующее:

def is_leap(year):
    return year % 4 == 0 and (year % 400 == 0 or year % 100 != 0)

3. Адекватное использование пробелов.

  • Никогда не смешивайте табуляции и пробелы
  • Разрыв строки между функциями
  • Два переноса строки между классами
  • Добавьте пробел после «,» в словарях, списках, кортежах, аргументах в списке аргументов и после «:» в словарях, но не перед ним.
  • Ставьте пробелы вокруг присваиваний и сравнений (кроме аргументов в списке)
  • Нет места для открывающих / закрывающих скобок или непосредственно перед списком аргументов.
def function(key, value=0):
    """Return a dictionary and a list..."""
    d = {key: value}
    l = [key, value]
    return d, l

4. Строки документации и комментарии

  • Docstrings = Как использовать код
  • Комментарии = Почему (рационально) и как работает код

Строки документации объясняют, как использовать код:

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

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

# !!! ОШИБКА: …

# !!! ИСПРАВЛЕНИЕ: это взлом

# ??? Почему это здесь?

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

Вы найдете подробный PEP, посвященный строкам документов: « Соглашения о строках документов »

5. Переменные и присвоение

На других языках программирования:

c = a
a = b
b = c

В Python лучше использовать присвоение в однострочном коде:

b, a = a, b

Возможно, вы уже видели это, но знаете ли вы, как это работает?

  • Запятая - это синтаксис для построения кортежа.
  • Справа создается кортеж (упаковка кортежа).
  • Кортеж - это цель слева (распаковка кортежа).

Другие примеры:

>>> user =['Jan', 'Gomez', '+1-888-222-1546']
>>> name, title, phone = user
>>> name
'Jan'
>>> title
'Gomez'
>>> phone
'+1-888-222-1546'

Полезно в циклах для структурированных данных (указанная выше переменная user была сохранена):

>>> people = [user, ['German', 'GBT', 'unlisted']]
>>> for (name, title, phone) in people:
...      print (name, phone)
...
Jan +1-888-222-1546
German unlisted

Также можно сделать наоборот, просто убедитесь, что у вас одинаковая структура справа и слева:

>>> jan, (gname, gtitle, gphone) = people
>>> gname
'German'
>>> gtitle
'GBT'
>>> gphone
'unlisted'
>>> jan
['Jan', 'Gomez', '+1-888-222-1546']

6. Объединение и объединение списков

Начнем со списка строк:

colors = ['red', 'blue', 'green', 'yellow']

Мы хотим объединить эти цепочки вместе, чтобы создать длинную. В особенности, когда количество подстрок велико, избегайте этого:

result = ''
for s in colors:
    result += s

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

Вместо этого сделайте следующее:

result = ''.join(colors)

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

Вот несколько приемов использования метода join (). Если вы хотите использовать пробел в качестве разделителя:

result = ' '.join(colors)

или запятая и пробел:

result = ', '.join(colors)

Чтобы составить грамматически правильное предложение, нам нужны запятые между каждым значением, кроме последнего, где мы предпочитаем «или». Все остальное сделает синтаксис разделения списка. [: -1] возвращает все, кроме последнего значения, которое мы можем объединить с нашими запятыми.

colors = ['red', 'blue', 'green', 'yellow']
print ('Choose', ', '.join(colors[:-1]), \
      'or', colors[-1])
>> Choose red, blue, green or yellow

7. Проверьте истинные условия

Использовать Python в отношении логических значений элегантно и быстро:

# Do this :     # And not this :
if x:             if x == True:
   pass                  pass
# Do this :     # And not this :
if items:         if len(items) != 0:
    pass                pass
# and especially not that :
        if items != []:
               pass

8. По возможности используйте enumerate.

Функция enumerate принимает список и возвращает пары (индекс, элемент):

items = ['zero', 'one', 'two', 'three']
>>> print list(enumerate(items))
[(0, 'zero'), (1, 'one'), (2, 'two'), (3, 'three')]

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

Итак, использование цикла ниже намного лучше:

for (index, item) in enumerate(items):
    print (index, item)
# compared to :              # And :
index = 0                     for i in range(len(items)):
for item in items:                    print (i, items[i])
    print (index, item)
    index += 1

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

9. Понимание списка

Традиционный способ с для и если:

new_list = []
for item in a_list:
    if condition(item):
        new_list.append(fn(item))

Используя понимание списка:

new_list = [fn(item) for item in a_list if condition(item)]

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

Например, список квадратов от 0 до 9:

>>> [n ** 2 for n in range(10)]
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]

Список нечетных чисел в предыдущем списке:

>>> [n ** 2 for n in range(10) if n % 2]
[1, 9, 25, 49, 81]

Другой пример:

>>>   [(x, y) for x in (1, 2, 3, 4) if x % 2 == 0 
       for y in ['a', 'b'] if y == 'b']
[(2, 'b'), (4, 'b')]

10. Генераторные выражения

Суммируем квадраты чисел меньше 100:

# With a loop :
total = 0
for num in range(1, 101):
    total += num * num

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

# With a list comprehension :
total = sum([num * num for num in range(1, 101)])
# With a generator expression :
total = sum(num * num for num in xrange(1, 101))

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

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

total = sum(num * num for num in range(1, 1000000000))

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

Суммируя :

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

Заключение

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

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

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

Если вы все это сделаете, вас ничто не остановит! Так чего же ты ждешь? Начни программировать на Python прямо сейчас!