Функция lambda в Python для тех кому хочется краткости и не хочет расписывать функции. Считается, что лучше функцию вынести, но иногда удобнее использовать lambda.
Пример 1
На примере отрывка из класса ниже по запуску таймеров анализа данных.
def __init__(self):
self.default = [
{'name': 'change_percent', 'title': 'Изменение процента'},
{'name': 'change_price', 'title': 'Изменение цены'},
{'name': 'analyse_sp500', 'title': 'Анализ SP&500'},
{'name': 'brent_oil', 'title': 'Анализ нефти'},
]
def save_user_timer(self, user_id, name, timer, percent):
# Если имя не входит в параметры по умолчанию
default = self.default
if not list(filter(lambda setting: setting['name'] == name, default)):
return ''
В инициализации класса есть переменная (self.default) с листом (list), в котором содержаться словари (dic).
В функции сохранения новых данных для таймера (save_user_timer), мы проверим входящие данные пользователя на наличие обязательно совпадения с ключами в поле name.
Иными словами, если с фронтенда в переменную name пришло значение отличное от любого из значения name переменной self.default, то мы прервем функцию ничего не передавая.
Мы знаем, что такое событие может случится в основном только в случае попыток взлома через sql инъекции и поэтому даже не предупреждаем, почему запрос не прошел, а только прерываем.
Пример 2
Получаем первый список со словарями:
operations = [x.serialize for x in query.all()]
В переменной operations будет список из словарей такого рода:
‘operation_type’: ‘Sell’,
‘payment’: 367.92,
‘price’: 91.98,
‘quantity’: 4,
‘user_id’: 1},…]
Далее получаем второй список со словарями:
В нем находятся такие данные:
Находим совпадение имени в списке словарей «operations» в списке словарей «markets»:
matched = list(filter(lambda market: market['name'] == operation['name'], markets))
# При совпадении сохраняем имя:
operation['last_price'] = matched[0]['last_price']</div>
В конечном счете мы получим переделанный список со словарями, в которых будут добавлены новые данные:
‘operation_type’: ‘Buy’,
‘payment’: -687.0,
‘price’: 68.7,
‘last_price’: 67.83,
‘quantity’: 10,
‘user_id’: 1},…]
Обратите внимание, что добавилось ‘last_price’: 67.83.
Весь код с функцией:
# Получаем список операций
query = db.session.query(Operation).filter_by(user_id=flask_login.current_user.id)
operations = [x.serialize for x in query.all()]
# Получаем список маркетов
markets = [r._asdict() for r in db.session.query(MarketShort.name, MarketShort.last_price).all()]
# Находим совпадение имени в списке словарей "operations" в списке словарей "markets"
for operation in operations:
matched = list(filter(lambda market: market['name'] == operation['name'], markets))
# При совпадении сохраняем имя
if matched:
operation['last_price'] = matched[0]['last_price']
return json.dumps(operations)