2012-02-09 26 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

相關問題