2011-12-01 16 views
3

我想將lambda函數列表應用於使用必須使用yield創建的迭代器的單個元素。如何將lambda函數列表應用於使用迭代器的單個元素?

的lambda函數列表會碰到這樣的:

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

我想申請的每個功能,從左至右,到一個單一的元素用產量來構建一個可迭代遍歷列表

+3

*必須用yield創建* - 爲什麼? – MattH

+2

heh ... 4個幾乎相同的答案 - 我認爲這是一個很好的例子,有時我們在Python中使用「一種明顯的方式」Python – jsbueno

+0

@jsbueno:沒有太多驚喜 - 使用yield畢竟是強制性的。否則,在func_list中肯定會有'(f(x)for f')。 –

回答

7
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 
2

答案可以配製成

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功能是卓有成效的,剩下的只是用於演示目的。

3

給這一個鏡頭:

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中的第一類對象。您可以將它們存儲在列表中,並在稍後使用它們,如上所示。

+0

函數中存在一個錯字:它應該讀取「yield '而不是'yeild' –

+0

是的,剛剛發現了。 SO上的語法高亮並不精彩? (認真,這是最好的)。 – Wilduck

0
def apply(value, lambda_list): 
    for function in lambda_list: 
      yield (function(value)) 
1

您是否需要yield聲明?

因爲還有另一種創建生成器的方法:使用()

applied_it = (f(item) for f in functions) 
相關問題