我想將lambda函數列表應用於使用必須使用yield創建的迭代器的單個元素。如何將lambda函數列表應用於使用迭代器的單個元素?
的lambda函數列表會碰到這樣的:
[<function <lambda> at 0x1d310c8>, <function <lambda> at 0x1d355f0>]
我想申請的每個功能,從左至右,到一個單一的元素用產量來構建一個可迭代遍歷列表
我想將lambda函數列表應用於使用必須使用yield創建的迭代器的單個元素。如何將lambda函數列表應用於使用迭代器的單個元素?
的lambda函數列表會碰到這樣的:
[<function <lambda> at 0x1d310c8>, <function <lambda> at 0x1d355f0>]
我想申請的每個功能,從左至右,到一個單一的元素用產量來構建一個可迭代遍歷列表
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
答案可以配製成
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
功能是卓有成效的,剩下的只是用於演示目的。
給這一個鏡頭:
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中的第一類對象。您可以將它們存儲在列表中,並在稍後使用它們,如上所示。
函數中存在一個錯字:它應該讀取「yield '而不是'yeild' –
是的,剛剛發現了。 SO上的語法高亮並不精彩? (認真,這是最好的)。 – Wilduck
def apply(value, lambda_list):
for function in lambda_list:
yield (function(value))
您是否需要yield
聲明?
因爲還有另一種創建生成器的方法:使用()
。
applied_it = (f(item) for f in functions)
*必須用yield創建* - 爲什麼? – MattH
heh ... 4個幾乎相同的答案 - 我認爲這是一個很好的例子,有時我們在Python中使用「一種明顯的方式」Python – jsbueno
@jsbueno:沒有太多驚喜 - 使用yield畢竟是強制性的。否則,在func_list中肯定會有'(f(x)for f')。 –