2012-08-14 64 views
1

有一个函数,func需要两个字符串参数,第一个工作,但根据itertools文档,不应该第二个工作吗?该功能目前打印一个随机字符串,作为回报,但在第二个没有获取印刷Python 2.7 Itertools Starmap

func(*("dog", "cat")) //works 

itertools.starmap(func, [("dog", "cat")]) //fails without error message, nothing gets printed to screen 

也许是在晚上太晚了(或早期),我失去了一个明显的错误吗?

回答

3

itertools.starmap返回迭代;真正得到它来执行,你需要通过它例如迭代使用list

list(itertools.starmap(func, [("fall", "2007")])) 
1

的问题是你starmap()函数调用的结果返回一个迭代器(即itertools.starmap对象),而不是值本身的列表。

你的功能工作正常,虽然你应该采取一个结果接一个通过迭代:

for result in itertools.starmap(func, [("fall", "2007")]): 
    # print result here or do some other stuff 

要在开始得到结果的列表(如果你不需要懒惰的结果取) - 修改你的迭代器列表:

list(itertools.starmap(func, [("fall", "2007")])) 
+0

星图懒惰地执行,所以将应用传递的值来传递函数(进行呼叫)时的.next()内方法被调用(每个的.next()方法调用)。列表(..)将遍历这些电话,并创造业绩为你的列表。 for循环还调用的.next()方法隐含在每个迭代。 – 2012-08-14 12:05:19

0

就个人而言,我只是避免了starmap。相反,我使用以下homebrewed函数

def one_arg(f) : 
    return lambda x : f(*x) 

并将其应用于func。