12-python-oneliners
12-python-oneliners
По видео: https://youtu.be/LkHCy5JZtsA
1. Распаковка значений
Например, мы пишем программу, которая считает объём комнаты, на вход она принимает
три числа — размеры комнаты. Как мы можем написать такой код?
Было: Стало:
sizes = input()
x, y, z = input().strip().split()
sizes = sizes.strip()
sizes = sizes.split()
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 = [" Христофор", "Адемар ", " Тэя ", " Стефания ", " Архип"]
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
print(inner)
4. List comprehensions
Это удобная конструкция для сборки новых списков из какой-то другой последовательности.
Например, у нас есть список имён и нам нужно получить имена, начинающиеся на А.
Было: Стало:
names = ["Христофор", "Адемар",
names = ["Христофор", "Адемар", "Тэя", "Стефания", "Архип"]
names_starts_a = []
print(names_starts_a)
for name in names:
if name.startswith("А"):
names_starts_a.append(name)
print(names_starts_a)
5. Фильтрация
Как можно еще написать фильтрацию данных? Можно через цикл, через comprehension, а можно через filter:
names = ["Христофор", "Адемар", "Тэя", "Стефания", "Архип"]
print(tuple(names_starts_with_a))
6. Быстрое копирование списка
Иногда нам нужно скопировать список, то есть не создать ещё одну ссылку на него, а именно
создать новый список со значениями из старого списка.
>>> indexes = [1, 2, 3]
>>> indexes.append(4)
>>> another_indexes
[1, 2, 3, 4]
Как же нам скопировать список, а не создать еще одну ссылку на старый список?
indexes = [1, 2, 3]
7. Обратить список
Нужно нечасто, но иногда задача возникает, проще всего сделать через слайс, указав шаг в минус 1 элемент:
numbers = [100, 200, 300]
numbers[::-1]
print(name) print(name)
print("ok") print("ok")
print("ok") print("ok")
any переводится как любой, то есть если любой из переданных в функцию аргументов приводится к True, то
функция возвращает True.
else:
color = "red"
process_admin_request(user, request)
"admin": process_admin_request,
process_manager_request(user, request)
"client": process_client_request