|
Инструмент list comprehensions
Списки в Python играют большую
роль и прежде чем идти дальше по материалу, рассмотрим некоторые упрощения при
работе с ними. То, о чем мы сейчас будем говорить, в английской литературе
называется
List comprehensions
Иногда это
переводят как «генераторы списков», но это не совсем верный термин. Я его не
стану переводить, а покажу работу этого инструмента на конкретных примерах.
Представьте, что
нам нужно создать список, состоящий из квадратов чисел, определенных от 0 до N-1. Используя
текущие знания, это можно было бы реализовать так:
A=[]
N=10
for x in range(N):
A.append(x**2)
print(A)
А теперь этот же
алгоритм с использованием list comprehensions:
N=10
A = [x**2 for x in range(N)]
print(A)
Смотрите, все
создание списка записано в одну строчку. И, кроме того, этот вариант будет
работать быстрее предыдущей программы, т.к. Python оптимизирует
работу таких конструкций.
Давайте теперь
разберемся в этом синтаксисе. Вначале мы указываем, что будем делать с
переменной x. Казалось бы,
переменная нигде не задана, а мы уже говорим что с ней делать. Да, это так, это
такой элемент синтаксиса list comprehensions. Далее, через пробел
мы записываем цикл for и уже там указываем эту переменную x и говорим как она
будет меняться. То есть, эта временная переменная x существует
только внутри списка и пропадает после его создания.
Теперь немного
усложним этот пример, и предположим, что нам нужно создать список только из
четных чисел. Опять же, обычным способом мы могли бы это сделать так:
A=[]
N=10
for x in range(N):
if x%2 == 0:
A.append(x**2)
print(A)
А через list comprehensions
это записывается следующим образом:
N=10
A = [x**2 for x in range(N) if x%2 == 0]
print(A)
То есть, после
цикла мы можем записать любое условие и если оно становится истинным, то
формируется новый элемент списка. Видите, как это просто можно реализовать.
Разумеется,
вместо возведения в степень мы можем прописывать любые функциональные
выражения, или записать просто x:
A = [x for x in range(N) if x%2 == 0]
Тогда получим
последовательность четных чисел. Или же формулу вычисления значений линейной
функции:
A = [0.5*x+1 for x in range(N)]
И так далее, здесь может быть любое выражение. Также можно оперировать не только числами, но
и другими типами данных, например, строками:
cities = ["Москва", "Тверь", "Рязань", "Ярославль", "Владимир"]
A = [city for city in cities if len(city) < 7]
print(A)
Здесь мы формируем список из названий городов, длины
которых меньше семи символов. По этому принципу можно строить самые разные
алгоритмы формирования списков.
|