Как применить список лямбда-функций к одному элементу с помощью итератора? - PullRequest
3 голосов
/ 01 декабря 2011

Я хочу применить список лямбда-функций к одному элементу, используя итерацию, которая должна быть создана с помощью yield.

Список лямбда-функций будет выглядеть примерно так:

[<function <lambda> at 0x1d310c8>, <function <lambda> at 0x1d355f0>]

И я хочу применить каждую функцию слева направо к одному элементу, используя yield для создания итерации для итерации списка.

Ответы [ 5 ]

7 голосов
/ 01 декабря 2011
def apply_all(functions, item):
    for f in functions:
        yield f(item)

Пример использования:

functions = [type, id, hex]
for result in apply_all(functions, 55):
    print result

дает

<type 'int'>
20326112
0x37
3 голосов
/ 01 декабря 2011

Дайте этому шанс:

def lambda_apply(unnamed_funcs, element):
    for unnamed in unnamed_funcs:
        yield unnamed(element)

>>> l = [lambda x: x**2, lambda x: 2*x]
>>> el = 5

>>> for y in lambda_apply(l, el):
...     print y
... 
25
10

Обратите внимание, что это работает не только для списка неназванных функций, но и для любого списка функций arity 1 . Это потому, что все функции, названные или нет, являются объектами первого класса в Python. Вы можете сохранить их в списке и использовать позже, как показано выше.

2 голосов
/ 01 декабря 2011

Ответ может быть сформулирован как

import numpy as np

def apply_funcs( funcs, val ):
    for func in funcs:
        yield func(val)

my_funcs = [lambda x: np.cos(x), np.sin, np.tan]
my_val = 0.1

for res in apply_funcs( my_funcs, my_val ):
    print res

, где функция apply_funcs помогает, а остальное только для демонстрации.

1 голос
/ 01 декабря 2011

Вам обязательно нужно заявление yield?

Потому что есть другой способ создать генератор: использовать ().

applied_it = (f(item) for f in functions)
0 голосов
/ 01 декабря 2011
def apply(value, lambda_list):
    for function in lambda_list:
          yield (function(value))
...