Hello World
1.6K subscribers
71 photos
6 videos
3 files
161 links
Be so good that you cannot be ignored. And then, go one step beyond.
Download Telegram
Списковые включения (list comprehensions)

Допустим, есть список, который необходимо превратить в список квадратов элементов. Можно, например, воспользоваться функцией 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()?
>>> 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 могут быть использованы и без индексов
Вот несколько забавных и полезных вещей:

# Очистка всех элементов листа:
>>> 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