2012-02-09 200 views
3

为了学习的目的,我试图做一个使用Python的函数,它接受另一个函数和两个数组作为参数,并在每个数组参数的每个索引上调用函数参数。所以这应该调用添加a1 [0] & a2 [0],a1 [1] & a2 [1]等,但我回来的是一个生成器对象。怎么了?Python,如何使一个函数作为参数以及两个数组?

def add(a,b): 
    yield a + b 


def generator(add,a1,a2): 
    for i in range(len(a1)): 
     yield add(a1[i],a2[i]) 


g = generator(add,a1,a2) 

print g.next() 

我还试图取代我有什么对产量以上

yield map(add,a1[i],a2[i]) 

但是,工作就更少了。我得到这个:

TypeError: argument 2 to map() must support iteration

+0

产量产生一个发电机对象,它看起来像你有一个发电机的发电机,也许你只是想返回总和从添加? – dm03514 2012-02-09 15:47:51

+0

你已经得到了答案,但你也可以做 'map(add,a,b)'或'(i + j for i,j in zip(a,b))' – 2012-02-09 15:51:20

回答

6

您对add()的定义至少是奇怪的(我倾向于认为它是错误的)。你应该return结果,而不是yield它:

def add(a, b): 
    return a + b 

现在,您generator()会工作,虽然

map(add, a1, a2) 

是做(几乎)同样的事情更容易和更快的方式。 (如果你想要一个迭代器,而不是一个列表,使用itertools.imap()代替map()

+2

我不敢相信我didn不知道地图接受这样的多个序列 - 它甚至在教程中已经有十年了。每天学些新东西! – DSM 2012-02-09 15:58:30

4

你得到一个发电机,因为你的add是一个发电机。它应该只是return a + b

1

正如其他人所说,你是不正确的定义addyield它应该return代替。此外,您可以将其导入:

from operator import add 

之所以这样不起作用:

yield map(add, a1[i], a2[i]) 

是因为map作品列表上的/ iterables,而不是单一的值。如果add被正确定义这可能是工作:

yield map(add, [a[i]], [a2[i]]) 

但你不应该真正做到这一点,因为它的复杂得多,它需要没有很好的理由(如斯文Marnach的回答表明,你发生器功能仅仅是一个试图实施map,所以它确实不应该使用map即使它是一个学习练习)。最后,如果要创建一个以函数作为参数的函数,我不会调用参数“add”;否则,制作它有什么意义?

def generator(f, a1, a2): 
    for x, y in zip(a1, a2): 
     yield f(x, y) 

说到这里,看看zip

2

I'm trying to make a function using Python that takes in another function and two arrays as parameters and calls the function parameter on each index of each array parameter.

def my_function(func, array_1, array_2): 
    for e_1,e_2 in zip(array_1, array_2): 
     yield func(e_1,e_2) 

例子:

def add(a, b): 
    return a + b 

for result in my_function(add, [1, 2, 3], [9, 8, 7]): 
    print(result) 

会打印:

10 
10 
10 

现在,一对夫妇的注意事项:

  • add功能可以在operator模块中找到。
  • 你看我用zip,看看它的doc
    即使你真的需要的是izip()生成器表达式在zip()下基本上不会返回一个列表,而是一个迭代器到每个值。
  • my_function几乎就像map(),唯一的区别是my_function是一个发生器,而map()给你一个列表。再次STDLIB给你的map发电机版本itertools模块:imap()

例,my_fuction就像imap

from operator import add 
from itertools import imap 

for result in imap(add, [1, 2, 3], [9, 8, 7]): 
    print(result) 

#10 
#10 
#10 

我明明假设add功能只是一个简单的例子,否则检查内置的sum

+0

OP的使用Python 2(示例代码包含一个'print'语句) – 2012-02-09 16:18:57

+0

@ChadMiller:我没有注意到,谢谢!我会改变链接:) – 2012-02-09 16:20:29

相关问题