Лучшие практики и советы 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 прямо сейчас!