Как использовать понимания списков в Python (и когда их не стоит использовать)
Программирование

Как использовать понимания списков в Python (и когда их не стоит использовать)

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

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

Прежде чем приступить к работе, стоит освежить в памяти, как работают массивы и списки в Python и как использовать словари Python

Что такое понимание списков в Python?

Понятие ‘понимание списка’ звучит сложно, но на самом деле это не так. В Python это просто быстрый способ фильтрации или уточнения списка на основе некоторых критериев

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

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

Как использовать понимания списков в Python

Примечание: Все эти примеры используют Python 3. 6. Если вы не уверены в различиях между Python 3 и Python 2, то обязательно прочитайте наш FAQ по Python, где мы рассматриваем этот и другие вопросы

Рассмотрим этот фрагмент кода, который копирует массив и превращает каждую букву в этом массиве в заглавную. Это делается путем перебора каждого элемента массива:

letters =  'a''b''c''d' 
print(letters)
upper_letters =   
for letterinletters:
 result = letter.upper()
 upper_letters.append(result)
print(upper_letters)

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

letters =  'a''b''c''d' 
print(letters)
upper_letters =  x.upper()forinletters 
print(upper_letters)

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

Давайте разберем этот простой пример

Этот пример создает список под названием буквы. В нем хранятся строчные буквы ‘a’, ‘b’, ‘c’ и ‘d’. Предположим, вы хотите, чтобы все эти элементы списка были прописными? Без понимания списка вам придется создать новый список для хранения результата (с именем upper_letters ), перебрать все элементы списка letters , преобразовать каждую букву (и сохранить ее в result – опционально, но хорошая практика), а затем добавить прописную букву в новый список. Сколько работы!

Понимание списка здесь почти точно эквивалентно альтернативе цикла. Оно фактически говорит: ‘Для каждой буквы в списке letters преобразуйте ее в прописную и верните результат в виде нового списка’

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

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

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

В приведенном выше примере следующий код преобразует каждый элемент (на который ссылается имя переменной x ) в верхний регистр с помощью метода upper() , который является частью основной библиотеки Python:

 x.upper()# will not run, only half the comprehension at this point

Далее необходимо указать Python, с каким списком работать, и присвоить переменной каждый отдельный элемент. Это точно то же самое, что и цикл for в длинном примере:

forinletters

Каждый раз, когда цикл проходит по списку, значение x будет меняться на значение текущего элемента. Вначале это будет ‘a’, затем ‘b’ и так далее

Если собрать все это вместе (и присвоить переменной upper_letters ), то все будет готово:

upper_letters =  x.upper()forinletters 

Теперь upper_letters будет содержать список заглавных букв, начиная с ‘A’, затем ‘B’ и так далее

Третья часть понимания списков в Python

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

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

Вот как это выглядит:

ages =  3457356 
print(ages)
old_ages =  xforinagesifx >10 
print(old_ages)

В этом примере используется новый список ages. Список old_ages собирается с помощью понимания списка. Условие if в конце означает, что в новый список вставляются только те элементы списка, которые удовлетворяют заданным критериям. В этом примере разрешены любые возрасты, превышающие десять лет

Когда не следует использовать списковые понимания Python

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

old_ages =  xforinagesifx >10andx <100andisnotNone

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

letters =  'a''b''c''d' 
print(letters)
upper_letters =  x.upper()forinletters 
print(upper_letters)

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

letters =  'a''b''c''d' 
print(letters)
upper_letters =   
for letterinletters:
try:
 result = letter.upper()
 upper_letters.append(result)
exceptAttributeError:
pass# do nothing
print(upper_letters)

Начните применять списковые понимания Python

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

Может быть, вы будете управлять Arduino с помощью Python, или как насчет сетевой камеры безопасности DIY Python?

Об авторе

Алексей Белоусов

Привет, меня зовут Филипп. Я фрилансер энтузиаст . В свободное время занимаюсь переводом статей и пишу о потребительских технологиях для широкого круга изданий , не переставая питать большую страсть ко всему мобильному =)

Комментировать

Оставить комментарий