VDS за 300р от нашего партнера SpaceWeb
[4]
07 Авг 2020, 18:51

10 идиоматических способов рефакторинга кода Python

Python-это универсальный язык программирования, который широко используется в научных вычислениях, искусственном интеллекте, веб-разработке, финансовом моделировании и многих других областях. Одной из основных причин его популярности является гибкость наличия нескольких решений для различных операций. Однако, в большинстве случаев, есть одно возможное идиотское решение, которое предпочтительно среди опытных программистов Python. В этой статье я хотел бы рассмотреть 10 идиоматических случаев, которые вы можете использовать для рефакторинга вашего кода Python.

1. Понятия

В Python существует три общих изменяемых типа данных контейнера, включая списки, словари и наборы. Если мы начнем с итерационного цикла, мы можем использовать цикл for, чтобы перейти к итерационному циклу, используя цикл for, чтобы создать новый список из него. Однако идиоматический способ заключается в использовании понимания списка, которое имеет следующий синтаксис: [expression for x in iterable if any_condition]. Обратите внимание, что условная оценочная часть является необязательной. Давайте рассмотрим следующий код.

Понимание Списка

Помимо понимания списка, мы также можем использовать понимание для словарей и наборов, которые называются словарным пониманием и пониманием набора соответственно. Понимание словаря имеет следующий синтаксис:{key_expr: val_expr for item in iterable}, в то время как синтаксис набора понимания является: {expr for item in iterable}. Следующий код показывает вам их использование.

Дикт и набор понимание

2. F-Stings

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

Однако в последних версиях Python был введен новый метод форматирования строк. Он известен как f-strings, которые означают форматированные строковые литералы — краткий и читаемый способ форматирования строк. Давайте рассмотрим сравнения между этими различными подходами к форматированию.

F-Strings

Конечно, приведенный выше код показывает вам только самое основное использование о F-строках, которые на самом деле реализуют почти все стили форматирования, поддерживаемые C-стилем или методом форматирования строки. Вы можете прочитать больше о f-strings в официальной документации или в моей недавней статье .

3. Многократное назначение и распаковка кортежа

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

Множественное Назначение

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

Распаковка Кортежа

4. Улов-Все Распаковывают

В приведенном выше разделе мы рассмотрели, как распаковать кортеж, используя самый простой формат — то же самое количество переменных для обозначения каждого из элементов в элементе. Однако при наличии нескольких элементов в кортеже иногда может потребоваться распаковать его с помощью метода catch-all. В частности, все элементы, которые явно не обозначаются переменными, будут захвачены переменной с префиксом звездочки. Для достижения того же результата неидиоматический метод обычно включает в себя нарезку, которая подвержена ошибкам, если мы упускаем правильные индексы.

Улов-все распаковывают

Как вы можете заметить, значения middle_numbers0and middle_numbers1не равны. Это связано с тем, что catch-all unpacking (с использованием звездочки) по умолчанию создает объект списка. Таким образом, чтобы конечные распакованные данные имели тот же тип данных, мы можем использовать конструктор кортежей, как показано ниже.

Создание кортежа из Catch-all распаковки

5. выражение присваивания

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

выражение присваивания

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

Некоторые люди могут утверждать, что сохранение одной строки кода не имеет большого значения, но это делает наше намерение более ясным, что переменная account_numberимеет значение только в области оператора if. Если у вас есть опыт кодирования в Swift, использование выражения присваивания в операторе if очень похоже на метод необязательной привязки, как показано ниже. В принципе, временная переменная accountNumberиспользуется только в последующей области, когда она допустима. Таким образом, вы должны ознакомиться с выражением присваивания, и через некоторое время вы найдете код более читаемым.

Необязательная Привязка

6. Итерация с перечислением

Почти в каждом проекте мы неизбежно заставляем нашу программу повторять определенные операции для всех элементов списка, кортежа или некоторых других типов данных контейнера. Эти повторенные операции могут быть достигнуты с помощью цикла for. Как правило, мы можем использовать основную форму: for item in iterable. Однако для итерации, если нам нужно отслеживать количество текущего цикла итерации, лучше использовать enumerateфункцию, которая может создать счетчик для нас. Кроме того, мы можем установить номер, на котором мы можем начать счетчик.

Итерация с перечислением

7. Присоединяйтесь к итерациям с помощью zip/zip_longest

Предположим, что мы начинаем с двух итераций, и мы хотим объединить эти две итерации для каждой соответствующей пары элементов. Как правило, мы можем использовать метод индексирования, извлекая элементы из каждой итерации таким образом, что мы можем объединить их, чтобы сформировать словарь. Тем не менее , Python имеет встроенную функцию zip, которая делает именно то, что мы хотим достичь. В основном, функция zip принимает несколько итераций и создает итерацию длины, которая соответствует использованию самой короткой длины итераций. Давайте рассмотрим следующий пример.

Используйте Zip С Iterables

То, что делает функция zip, — это создание объекта zip-итератора с каждым элементом в виде кортежа, состоящего из элементов из предоставленных итераций. Одна вещь, чтобы отметить, что по умолчанию, функция zip остановится, когда она достигнет конца любого iterable. Напротив, функция zip_longest будет использовать самую длинную итерацию.

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

Zip в итерации

8. Объединение Итераций

В приведенном выше примере мы использовали функцию zip для объединения итераций по элементам. Что мы должны делать, если наша конкретная бизнес-потребность заключается в объединении итераций? Предположим, что нам нужно пройти через две итерации элементов одной и той же категории для одной и той же операции. Мы можем достигнуть этой функциональности путем использование цепной функции. Давайте посмотрим на использование ниже.

Цепные Итераторы

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

9. Тернарное Выражение

Если нам нужно назначить что-то переменной, различные значения будут назначены на основе условия. В этом случае мы можем использовать оператор if для оценки условия и определения того, какое значение следует использовать для присвоения. Это обычно включает в себя несколько строк кода. Однако мы можем использовать тернарное выражение, чтобы выполнить работу только с одной строкой кода, которая имеет следующий общий синтаксис: var = true_value if condition else false_value. Давайте посмотрим на их соответствующие обычаи.

Тернарное Выражение

10. Использование генераторов

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

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

Генераторы

Выводы

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

по материалам towardsdatascience.com

Комментарии (0)

Добавить комментарий

Войдите, чтобы написать о чем-нибудь...
Вход Регистрация
Web.onRails
Здесь вы можете спросить или написать обо всём, что касается Веб-разработки.
написать о чем-нибудь...
Метки:
Лучшее
[52]
16 Окт 2011, 15:38
Вывести все элементы POST
[просмотров 14637]
[74]
31 мая 2011, 11:48
Python проверка существования переменной
[просмотров 10288]
[100]
19 Дек 2014, 16:16
User-agent для Internet Explorer 11
[просмотров 9623]
[4]
10 Окт 2018, 15:33
Как запретить просмотр сайта по IP?
[просмотров 9179]
[125]
21 Июл 2011, 14:04
Python Imaging Library (PIL)
[просмотров 7455]
[315]
11 Авг 2011, 00:21
Спецификация HTML5 от W3C
[просмотров 7371]
[315]
16 Июл 2011, 20:03
Python работа с MySQL
[просмотров 5350]

Вести с Хабра