<jupyter_start><jupyter_text>Анонимные функцииАнонимные или ```lambda``` функции это один из полезных элементов функционального программирования в Python. Их синтаксис довольно прост.```Pythonlambda [аргументы]: выражение```Основное отличие этих функций от обычных - отсутствие имен. При создании ```lambda``` функции она не связывается и именем и поэтому создавать ее "просто так" не имеет смысла. Отсутствие оператора ``` return``` является другим отличием от обычных функций. Телом анонимной функции выступает одно выражение, результат которого сразу возвращается. Не стоит использовать эти функции для выполнения сложных операций.<jupyter_code>lambda x, y: x + y
(lambda x, y: x + y)(1, 2)<jupyter_output><empty_output><jupyter_text>```lambda``` функции могут использовать все возможности аргументов в Python. Анонимные функции, как и обычные, можно связать с именем, которое затем использовать.<jupyter_code>foo = lambda x, y: x + y
print(f'{foo = }')
print(f'{type(foo) = }')
print(f'{foo(1, 2) = }')<jupyter_output>foo = <function <lambda> at 0x0000018BBBA23820>
type(foo) = <class 'function'>
foo(1, 2) = 3<jupyter_text>В большинстве случаев такие функции используются для однократного применения. В случаях, когда нужно создать функцию "здесь и сейчас" и которая будет не нужна в дальнейшем. Эти функции отлично подходят для передачи в другие функции в качестве аргумента.<jupyter_code>def foo(a, b, op=None):
    if op is None:
        return a + b
    return op(a, b)

print(f'{foo(1, 2, lambda x, y: x ** y) = }')
print(f'{foo(1, 2, lambda x, y: x + y) = }')
print(f'{foo(1, 2, lambda x, y: x - y) = }')<jupyter_output>foo(1, 2, lambda x, y: x ** y) = 1
foo(1, 2, lambda x, y: x + y) = 3
foo(1, 2, lambda x, y: x - y) = -1<jupyter_text>Для приведенного выше пример лучше использовать модуль ```operator```, который реализует все доступные операторы в Python.<jupyter_code>import operator

print(f'{foo(1, 2, operator.pow) = }')
print(f'{foo(1, 2, operator.add) = }')
print(f'{foo(1, 2, operator.sub) = }')<jupyter_output>foo(1, 2, operator.pow) = 1
foo(1, 2, operator.add) = 3
foo(1, 2, operator.sub) = -1<jupyter_text>Еще одним применением анонимных функций можно выделить использование для произвольной сортировки коллекций с помощью аргумента ```key``` функции ```sorted``` или метода ```sort```.<jupyter_code>xs = [1, 4, 0, -1, 3, 4, 5, 8]

# сортировка в обратном порядке
# лучше использовать аргумент reverse=True
ys = sorted(xs, key=lambda x: -x)

# сортировка списка в пордяке: сначала четные по неубыванию, 
# затем нечетные по неубыванию
zs = sorted(xs, key=lambda x: (x % 2, x))

print(f'{ys = }')
print(f'{zs = }')<jupyter_output>ys = [8, 5, 4, 4, 3, 1, 0, -1]
zs = [0, 4, 4, 8, -1, 1, 3, 5]<jupyter_text>В Python есть и другие элементы функционального программирования:- ```map``` - применение функции к каждому элементу коллекции;- ```zip``` - поэлементное объединение коллекций;- ```filter``` - фильтрация коллекции.Все эти функции возвращают итераторы, лениво вычисляющие следующие значения.<jupyter_code>s = '196'

# преобразование строки с числом в набор цифр
digits = map(int, s)
print(f'{digits = }')
print(f'{type(digits) = }')
print(f'{list(digits) = }')
xs = [1, 2, 3, 4]
ys = 'absd'

# объединение нескольких коллекций
foo = zip(xs, ys)

print(f'{foo = }')
print(f'{type(foo) = }')
print(f'{list(foo) = }')
xs = [1, 4, 0, -1, 3, 4, 5, 8]

# выбор только положительных чисел из списка
positive = filter(lambda x: x > 0, xs)

print(f'{positive = }')
print(f'{type(positive) = }')
print(f'{list(positive) = }')<jupyter_output>positive = <filter object at 0x0000018BBB7C01C0>
type(positive) = <class 'filter'>
list(positive) = [1, 4, 3, 4, 5, 8]
{'fraction_non_alphanumeric': 0.14957846070165895, 'fraction_numerical': 0.029643731302692412, 'mean_word_length': 5.341379310344828, 'pattern_counts': {'":': 0, '<': 25, '<?xml version=': 0, '>': 26, 'https://': 0, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'chain_length': '6', 'dir': 'jupyter-structured-clean-dedup', 'id': '482084', 'license': 'MIT', 'n_tokens_mistral': 1625, 'n_tokens_neox': 1760, 'n_words': 431, 'path': 'python_pd/04_functions/03_lambda.ipynb', 'repo_name': 'Alexey-smurf/python-bp', 'size': '3677'}