Списковые включения (list comprehensions)
Допустим, есть список, который необходимо превратить в список квадратов элементов. Можно, например, воспользоваться функцией map в сочетании с lambda.
Этот код довольно короткий, но он все еще плохо читаем. К тому же мы вынуждены дополнительно определить лямбда-функцию.
К счастью есть более красивый способ.
Даже человек без знания python легко определит что делает этот код.
Также с помощью списковых включений можно фильтровать список.
Да, это все можно было сделать с помощью цикла for. Однако, подобный подход совсем не гарантирует четкий и лаконичный код.
#list
Допустим, есть список, который необходимо превратить в список квадратов элементов. Можно, например, воспользоваться функцией map в сочетании с lambda.
numbers = [1,2,3,4,5]
squares = map(lambda item: item**2, numbers)
Этот код довольно короткий, но он все еще плохо читаем. К тому же мы вынуждены дополнительно определить лямбда-функцию.
К счастью есть более красивый способ.
numbers = [1,2,3,4,5]
squares = [number*number for number in numbers]
Даже человек без знания python легко определит что делает этот код.
Также с помощью списковых включений можно фильтровать список.
numbers = [1,2,3,4,5]
evens = [number for number in numbers if number%2==0]
Да, это все можно было сделать с помощью цикла for. Однако, подобный подход совсем не гарантирует четкий и лаконичный код.
#list
Есть ли разница между [] и list()?
В принципе результат будет одним и тем же, но давайте заглянем глубже:
Инициализация листа с помощью конструктора list() выглядит как минимум в 4-5 раз медленнее. Попробуем заглянуть внутрь с помощью модуля dis, который служит для изучения байткода Python’a.
Ответ заключается в том, что в то случае когда мы выбираем list() вместо [] мы теряем вычислительное время на “избыточный” вызов самой функции list().
📎 Во многих случаях это не настолько важно, поскольку мы имеем дело с микросекундами. Однако стоит об этом помнить, если ты имеешь дело с big data.
#list
>>> f = []
>>> f = list()
В принципе результат будет одним и тем же, но давайте заглянем глубже:
>>> timeit.timeit(‘[]’, number=10**8)
2.25569809000001
>>> timeit.timeit(‘list()’, number=10**8)
10.330681907999995
Инициализация листа с помощью конструктора list() выглядит как минимум в 4-5 раз медленнее. Попробуем заглянуть внутрь с помощью модуля dis, который служит для изучения байткода Python’a.
>>> dis.dis('f=[]')
1 0 BUILD_LIST 0
2 STORE_NAME 0 (f)
4 LOAD_CONST 0 (None)
6 RETURN_VALUE
>>> dis.dis('f=list()')
1 0 LOAD_NAME 0 (list)
2 CALL_FUNCTION 0
4 STORE_NAME 1 (f)
6 LOAD_CONST 0 (None)
8 RETURN_VALUEОтвет заключается в том, что в то случае когда мы выбираем list() вместо [] мы теряем вычислительное время на “избыточный” вызов самой функции list().
📎 Во многих случаях это не настолько важно, поскольку мы имеем дело с микросекундами. Однако стоит об этом помнить, если ты имеешь дело с big data.
#list
Python’s slices
Срезы в листах Python могут быть использованы и без индексов
Вот несколько забавных и полезных вещей:
#tips #list
Срезы в листах Python могут быть использованы и без индексов
Вот несколько забавных и полезных вещей:
# Очистка всех элементов листа:
>>> lst = [1, 2, 3, 4, 5]
>>> del lst[:]
>>> lst
[]
# Замена всех элементов листа
# без создания нового объекта:
>>> a = lst
>>> lst[:] = [7, 8, 9]
>>> lst
[7, 8, 9]
>>> a
[7, 8, 9]
>>> a is lst
True
# Создание копии листа:
>>> b = lst[:]
>>> b
[7, 8, 9]
>>> b is lst
False
#tips #list