2012-02-09 10 views
3

学習目的のために、別の関数と2つの配列をパラメータとして取り、各配列パラメータの各インデックスで関数パラメータを呼び出すPythonを使用して関数を作成しようとしています。だから、これはa1 [0] & a2 [0]、a1 [1] & a2 [1]などを追加する必要があります。どうしましたか?Python、2つの配列と一緒に引数として関数をとる関数を作る方法は?

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

yieldはジェネレータオブジェクトを生成します。ジェネレータのジェネレータを持っているようですが、おそらく加算の合計を返すだけですか? – dm03514

+0

あなたはすでに答えを得ていますが、あなたもできること 'map(add、a、b)'または '(i + j for zip(a、b))' –

答えて

6

私の定義はadd()で、少なくとも奇妙です(私はそれを「間違った」と呼んでいます)。

map(add, a1, a2) 

が(ほぼ)同じことを行うための簡単かつ迅速な方法ですが、

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

今、あなたのgenerator()は動作します:あなたは結果ではなく、yieldそれをreturn必要があります。 (あなたはイテレータではなくリストが必要な場合は、代わりにmap()itertools.imap()を使用しています。)

+2

私はdidn信じられませんこのマップは、このような複数のシーケンスを受け入れることを知っています。それは10年のチュートリアルでさえされています。毎日何か新しいことを学ぶ! – DSM

4

addはジェネレータであるため、あなたはジェネレータを取得します。ちょうどreturn a + bであるはずです。

1

他の人として間違っaddを定義すると、それはreturn代わりのyieldべき、と述べています。また、あなたはそれをインポートすることができます:

from operator import add 

これが動作しない理由:

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

は、リスト/反復可能オブジェクトではなく、単一の値であるためmap作品です。

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

しかし、あなたは実際にはもっと複雑だから、それはスヴェンMarnachの答えが示すように、あなたのジェネレータ関数だけである(正当な理由なく必要以上にそれを行うべきではありません。addが正しく定義された場合、これは仕事ができます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_functionmap()とほぼ同じですが、唯一の違いはmy_functionが発電機であり、map()があなたにリストを与えるという点です。もう一度STDLIBがitertoolsモジュールであなたのmapの発電機のバージョンを提供します: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'文が含まれています) –

+0

@ChadMiller:感謝しませんでした!私はリンクを変更します:) –

関連する問題