В 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]