12 мощных Python однострочников от Диджитализируй!
По видео: [Link]
1. Распаковка значений
Например, мы пишем программу, которая считает объём комнаты, на вход она принимает
три числа — размеры комнаты. Как мы можем написать такой код?
Было: Стало:
sizes = input()
x, y, z = input().strip().split()
sizes = [Link]()
sizes = [Link]()
x = sizes[0]
y = sizes[1]
z = sizes[2]
2. map
Но затем, чтобы посчитать объём, нам надо привести типы к int. Как это можно сделать?
Было: Стало:
x, y, z = input().strip().split()
x, y, z = map(int, input().strip().split())
x = int(x)
print(f"Volume is {x * y * z}")
y = int(y)
z = int(z)
print(f"Volume is {x * y * z}")
Аналогично можно, например, быстро обрезать пробельные символы в наборе данных:
names = [" Христофор", "Адемар ", " Тэя ", " Стефания ", " Архип"]
names = map([Link], names)
3. reduce
Используется, когда надо свести последовательность к одному значению. Например, у нас есть объект top_level_object
и произвольная цепочка атрибутов, которые передаются откуда-то снаружи и мы не можем её задать явно в нашем коде,
при этом нам нужно получить значение конечного атрибута:
class Inner3:
attr4 = 444
class Inner2:
attr3 = Inner3()
class Inner1:
attr2 = Inner2()
class TopLevel:
attr1 = Inner1()
top_level_object = TopLevel()
# value = top_level_object.attr1.attr2.attr2.attr4
Как это сделать без reduce? Можно воспользоваться reduce и сделать короче:
inner = top_level_object
from functools import reduce
for attr in ("attr1", "attr2","attr3", "attr4"):
value = reduce(getattr, ("attr1", "attr2", "attr3", "attr4"), self)
inner = getattr(inner, attr)
print(inner)
4. List comprehensions
Это удобная конструкция для сборки новых списков из какой-то другой последовательности.
Например, у нас есть список имён и нам нужно получить имена, начинающиеся на А.
Было: Стало:
names = ["Христофор", "Адемар",
names = ["Христофор", "Адемар", "Тэя", "Стефания", "Архип"]
"Тэя", "Стефания", "Архип"]
names_starts_a = [name for name in names if [Link]("А")]
names_starts_a = []
print(names_starts_a)
for name in names:
if [Link]("А"):
names_starts_a.append(name)
print(names_starts_a)
5. Фильтрация
Как можно еще написать фильтрацию данных? Можно через цикл, через comprehension, а можно через filter:
names = ["Христофор", "Адемар", "Тэя", "Стефания", "Архип"]
names_starts_with_a = filter(lambda name: [Link]("А"), names)
print(tuple(names_starts_with_a))
6. Быстрое копирование списка
Иногда нам нужно скопировать список, то есть не создать ещё одну ссылку на него, а именно
создать новый список со значениями из старого списка.
>>> indexes = [1, 2, 3]
>>> another_indexes = indexes
>>> [Link](4)
>>> another_indexes
[1, 2, 3, 4]
Как же нам скопировать список, а не создать еще одну ссылку на старый список?
indexes = [1, 2, 3]
another_indexes = [x for x in indexes] # слишком длинно
another_indexes = indexes[:] # просто берём полный слайс из начального списка
7. Обратить список
Нужно нечасто, но иногда задача возникает, проще всего сделать через слайс, указав шаг в минус 1 элемент:
numbers = [100, 200, 300]
numbers[::-1]
8. Много проверок == одной переменной
Было: Стало:
if name == "Христофор" or name == "Адемар" or name == "Тэя":
if name in ("Христофор", "Адемар", "Тэя"):
print(name) print(name)
9. Проверить, что все значения True
Было: Стало:
if a and b and c and d and e:
if all(a, b, c, d, e):
print("ok") print("ok")
10. Проверить, что хотя бы 1 значение True
Было: Стало:
if a or b or c or d or e:
if any(a, b, c, d, e):
print("ok") print("ok")
any переводится как любой, то есть если любой из переданных в функцию аргументов приводится к True, то
функция возвращает True.
11. Тернарный оператор
Было: Стало:
if [Link]:
color = "green" if [Link] else "red"
color = "green"
else:
color = "red"
12. Конфигурируем, что вызвать
Было: Стало:
if [Link] == "admin":
group_to_method = {
process_admin_request(user, request)
"admin": process_admin_request,
elif [Link] == "manager":
"manager": process_manager_request,
process_manager_request(user, request)
"client": process_client_request
elif [Link] == "client":
}
process_client_request(user, request) group_to_method[[Link]](user, request)