какие функциональные инструменты остаются в Python 3k? - PullRequest
4 голосов
/ 30 ноября 2009

Я прочитал несколько записей, касающихся удаления нескольких функциональных функций из будущего Python, включая map и redu.

Какова официальная политика в отношении функциональных расширений?
останется ли лямбда-функция?

Ответы [ 2 ]

10 голосов
/ 30 ноября 2009

Ну, Python 3.0 и 3.1 уже выпущены, так что вы можете проверить это сами. Конечным результатом было то, что карта и фильтр были сохранены как встроенные, и лямбда также была сохранена. Единственным изменением было то, что сокращение было перенесено в модуль functools; вам просто нужно сделать

from functools import reduce

чтобы использовать его.

Можно ожидать, что будущие выпуски 3.x останутся обратно совместимыми с 3.0 и 3.1 в этом отношении.

3 голосов
/ 30 ноября 2009

В Python 3.x в Python по-прежнему встроен богатый набор инструментов функционального ish: составления списков, выражения-генераторы, итераторы и генераторы, а также такие функции, как any() и all(), которые имеют оценку короткого замыкания везде, где это возможно.

«Доброжелательный диктатор для жизни» в Python воплотил идею удаления map(), потому что вы можете тривиально воспроизвести его эффекты со списком:

lst2 = map(foo, lst)

lst3 = [foo(x) for x in lst]

lst2 == lst3  # evaluates True

Функция Python lambda не была удалена или переименована и, вероятно, никогда не будет. Тем не менее, он, вероятно, никогда не станет более мощным, либо. lambda Python ограничен одним выражением; он не может включать в себя операторы и не может содержать несколько строк кода Python.

Простой старый стандарт Python def определяет функциональный объект, который может передаваться так же легко, как объект lambda. Вы даже можете отменить привязку имени функции после ее определения, если вы действительно хотите это сделать.

Пример:

# NOT LEGAL PYTHON
lst2 = map(lambda x: if foo(x): x**2; else: x, lst)

# perfectly legal Python
def lambda_function(x):
    if foo(x):
        return x**2
    else:
        return x

lst2 = map(lambda_function, lst)

del(lambda_function) # can unbind the name if you wish

Обратите внимание, что на самом деле вы можете использовать "троичный оператор" в lambda, поэтому приведенный выше пример немного надуманный.

lst2 = map(lambda x: x**2 if foo(x) else x, lst)

Но некоторые многострочные функции трудно ввести в lambda, и их лучше обрабатывать как простые обычные многострочные функции.

Python 3.x не потерял ни одной из своих функциональных возможностей. Есть общее мнение, что списочные выражения и выражения-генераторы, вероятно, предпочтительнее map(); в частности, выражения генератора иногда могут использоваться для эквивалентного map(), но без выделения списка и последующего его освобождения. Например:

total = sum(map(lst, foo))

total2 = sum(foo(x) for x in lst)

assert total == total2  # same result

В Python 2.x map() выделяет новый список, который суммируется и немедленно освобождается. Выражение генератора получает значения по одному и никогда не связывает память целого списка значений.

В Python 3.x, map() "ленив", поэтому оба одинаково эффективны. Но в результате в Python 3.x пример троичной лямбды необходимо развернуть в список:

lst2 = list(map(lambda x: x**2 if foo(x) else x, lst))

Проще просто составить список понимания!

lst2 = [x**2 if foo(x) else x for x in lst]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...