**lambda как функция key=**
Наиболее распространённое применение lambda в Python — как аргумент `key=` для `sorted()`, `max()`, `min()`, `groupby()` и т.д.:
```python
students = [('Alice', 85), ('Bob', 72), ('Carol', 91)]
# Сортировать по баллу (второй элемент)
sorted(students, key=lambda s: s[1])
# [('Bob', 72), ('Alice', 85), ('Carol', 91)]
# Наивысший балл
max(students, key=lambda s: s[1]) # ('Carol', 91)
# Сортировать строки без учёта регистра
sorted(['Banana', 'apple', 'Cherry'], key=lambda s: s.lower())
# ['apple', 'Banana', 'Cherry']
```
**Модуль operator — более быстрые альтернативы lambda**
Для распространённых случаев получения элемента по индексу или атрибуту объекта модуль `operator` предоставляет оптимизированные callable, работающие быстрее lambda:
```python
import operator
# operator.itemgetter — то же, что lambda x: x[key]
sorted(students, key=operator.itemgetter(1)) # сортировать по индексу 1
# Работает с несколькими ключами (возвращает кортеж):
records = [('Alice', 'NY', 85), ('Bob', 'LA', 85), ('Carol', 'NY', 91)]
sorted(records, key=operator.itemgetter(2, 0)) # по баллу, затем по имени
# operator.attrgetter — то же, что lambda x: x.attr
from dataclasses import dataclass
@dataclass
class Student:
name: str
score: int
students = [Student('Alice', 85), Student('Bob', 72)]
sorted(students, key=operator.attrgetter('score'))
# operator.methodcaller — то же, что lambda x: x.method()
words = ['hello', 'WORLD', 'Python']
sorted(words, key=operator.methodcaller('lower'))
# ['hello', 'Python', 'WORLD']
```
**Именованные функции vs lambda — когда что лучше**
```python
# Lambda лучше: короткая, встроенная, используется один раз
sorted(data, key=lambda x: x['price'] * (1 - x['discount']))
# Именованная функция лучше: сложная логика, повторно используется
def effective_price(item):
base = item['price']
discount = item.get('discount', 0)
tax = item.get('tax', 0.2)
return base * (1 - discount) * (1 + tax)
sorted(data, key=effective_price)
```
PEP 8 не рекомендует присваивать lambda переменной (`double = lambda x: x * 2`) — вместо этого используй `def`.
map/filter vs comprehension, functools.partial и гид по выбору
**map/filter vs comprehension — сравнение читаемости**
```python
numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
# Удвоить все чётные числа — три способа:
# 1. map + filter (вложено, читается изнутри наружу):
result = list(map(lambda x: x * 2, filter(lambda x: x % 2 == 0, numbers)))
# 2. Comprehension (читается слева направо, наиболее Pythonic):
result = [x * 2 for x in numbers if x % 2 == 0]
# 3. Цикл for (наиболее явный):
result = []
for x in numbers:
if x % 2 == 0:
result.append(x * 2)
# Все три дают: [4, 8, 12, 16, 20]
```
Comprehension — стандартный стиль Python для преобразования + фильтрации.
**Когда map/filter всё ещё имеют смысл**
```python
# map со встроенной функцией (без lambda) — лаконично и быстро:
names = list(map(str.upper, ['alice', 'bob', 'carol']))
# ['ALICE', 'BOB', 'CAROL']
# То же с именованной функцией:
def to_celsius(f): return (f - 32) * 5 / 9
temps_c = list(map(to_celsius, [32, 68, 212]))
# [0.0, 20.0, 100.0]
# Конвейер через несколько операций (функциональный стиль):
pipeline = filter(None, map(str.strip, raw_lines))
```
**Полезное из functools**
```python
from functools import partial, lru_cache
# partial — создать специализированную версию функции:
import operator
double = partial(operator.mul, 2)
double(5) # 10
double(21) # 42
# lru_cache — мемоизировать затратные функции:
@lru_cache(maxsize=128)
def fibonacci(n):
if n < 2: return n
return fibonacci(n - 1) + fibonacci(n - 2)
fibonacci(100) # мгновенно, не экспоненциально
```
**Краткий гид по выбору**
```
Задача Предпочтительный стиль
────────────────────────────────── ─────────────────────────────────
Преобразовать + отфильтровать список List comprehension
Преобразовать с именованной/встроенной map() без lambda
Только фильтрация (без преобразования) filter() или comprehension
Свернуть/накопить в одно значение reduce() или явный цикл
Встроенный ключ сортировки lambda или operator.itemgetter
Функция ключа для повторного использования def (именованная функция)
```
Напишите функцию, которая принимает список цен и процент скидки и возвращает новый список со скидкой, применённой к каждой цене. Используйте map() с лямбдой.
Напишите функцию, которая принимает список чисел и возвращает наибольшую сумму, которую можно получить, добавляя элементы слева направо (максимальное значение любой префиксной суммы). Используйте reduce() из functools.
from functools import reduce
def max_prefix_sum(numbers):
pass
result = max_prefix_sum([1, -3, 2, 5, -1, 3])
print(result)
Решение
from functools import reduce
def max_prefix_sum(numbers):
prefix_sums = []
reduce(lambda acc, n: (prefix_sums.append(acc + n) or (acc + n)), numbers, 0)
return max(prefix_sums)
# Или понятнее:
def max_prefix_sum(numbers):
total = 0
best = 0
for n in numbers:
total += n
best = max(best, total)
return best
result = max_prefix_sum([1, -3, 2, 5, -1, 3])
print(result)
No split tab
Настройки cookies
Мы используем необходимые cookies для работы сайта. С вашего разрешения мы также можем сохранять настройки сайта и использовать аналитические и рекламные cookies, чтобы понимать использование сайта и поддерживать развитие проекта.
* Вы всегда можете изменить свой выбор в настройках сайта.
Выберите категории cookies
Настройки аналитики
Можно отключить аналитику использования платформы. Также можно отправить в Google Analytics запрос на удаление данных об использовании этого сайта, связанных с этим браузером.
Учебный workspace
Учитесь, читая, запуская код и решая задачи.
Практикуйте программирование с пояснениями тем, упражнениями, инструментами browser IDE, проверкой regex и тренировкой печати кода в одном workspace.
Открывайте инструменты во вкладках.Упражнения, IDE-инструменты и тренажеры остаются доступными как вкладки сайта.
Переключайтесь без потери контекста.Переходите между пояснениями, кодом и утилитами, сохраняя свое место.
Используйте sidebar как карту.Левые панели содержат навигацию, настройки, файлы, libraries и управление инструментами.
PythonJavaScriptSQLite
Одна IDE, три практичных режима
Python в браузере.Запускайте небольшие скрипты, пробуйте библиотеки и тренируйте API-запросы без установки.
JavaScript для быстрых экспериментов.Проверяйте код для браузера и сравнивайте идеи рядом с учебными материалами.
SQLite для практики с данными.Открывайте обозреватель базы данных, изучайте таблицы, пишите запросы и учитесь SQL локально.
ТемаIDE
Работайте рядом в split tabs
Держите инструкции перед глазами.Откройте упражнение или справочную страницу рядом с IDE, вместо постоянных переключений.
Сравнивайте инструменты во время обучения.Размещайте проверки regex, пояснения и эксперименты с кодом рядом, когда это нужно для задачи.
Закройте split, когда закончите.Workspace вернётся к одной сфокусированной вкладке, а открытые вкладки сайта останутся доступны.
Тренажер слепой печати кода
Или просто текста
Тренажер рассчитан на физическую клавиатуру.Откройте этот раздел на ноутбуке или компьютере с широким экраном. На телефоне тренировка слепой печати не будет корректной.
Скорость: 0 зн/мин
0 слов/мин
Лучшая скорость (60с): 0 зн/мин
0 слов/мин
Ошибки: 0
Общее время: 0.0 с
Для активации режима слепого набора не подсматривайте на физическую клавиатуру.