2016-04-04 12 views
0

私はPythonで同じコードを何度も実行する必要を避けるために単純なループを実行しようとしていますが、エラーが発生し続けます。これは、ループが関数内で実行されているためです。 cosine_sim%d %iが、それはまたに番号を追加する必要があります。それは見ることができるようにPythonの関数エラーの名前を変更するループ

def cosine_sim0(data0, data1): 
    tfidf = vectorizer.fit_transform([data0, data1]) 
    return ((tfidf * tfidf.T).A)[0,1] 
print(cosine_sim0(data0, data1)) 

def cosine_sim1(data1, data2): 
    tfidf = vectorizer.fit_transform([data1, data2]) 
    return ((tfidf * tfidf.T).A)[0,1] 
print(cosine_sim1(data1, data2)) 

def cosine_sim2(data2, data3): 
    tfidf = vectorizer.fit_transform([data2, data3]) 
    return ((tfidf * tfidf.T).A)[0,1] 
print(cosine_sim2(data2, data3)) 

def cosine_sim3(data3, data4): 
    tfidf = vectorizer.fit_transform([data3, data4]) 
    return ((tfidf * tfidf.T).A)[0,1] 
print(cosine_sim3(data3, data4)) 

は、ループが4つの別々の機能を作成する必要があります。これはコードがループ内で行われていないときに私がお見せしましょう、繰り返しフォーム説明するために、機能と印刷結果から始まるもの。アカウントにこれらの持って私は、次のコードを使用してループを構築することにより試み:

my_funcs = {} 
    for i in range(4): 
     def foo(data%d %i, data%d+1 %i): 
       tfidf = vectorizer.fit_transform([data%d %i, data%d+1 %i]) 
       return ((tfidf * tfidf.T).A)[0,1] 


     foo.func_name = "cosine_sim%d" % i 
     my_funcs["cosine_sim%d" % i] = foo 

    globals().update(my_funcs) # Export to namespace 

    cosine_sim2(data1, data2) 

はあなたのほとんどはおそらく推測できるとおり、エラー取り出さ状態invalid syntax。問題がどこにあるの?

種類は、(適切にインデントされている場合、あなたが名前に%文字を使用することはできません)あなたはサイクルで関数を作成することができ、その後、あなたはfunc_name属性にアクセスして、それの名前を変更することができますが、それはおそらくだ

+0

:あなたは本当に、名前空間内の関数やdictのないを持っているしたい場合は、globals()['my_func_name'] = my_func_object

の更新を行うことができます! :)これは、しばしばデコレータやクラス継承を介して行われます... [こちら]の詳細(https://stackoverflow.com/questions/2789460/python-add-to-a-function-dynamically)。とにかく、あなたのインデントは、最後のコードスニペット( 'for'ループ)でオフになっています。 'tfidf = ...'と 'return ...'は4つのスペースで字下げしなければなりません – jDo

+0

答えてくれてありがとう@jDo、4つのスペースではどういう意味ですか?歓声、 –

+0

[このような](http://pastebin.com/raw/M4fLtXR5)。ネスティングが一貫していることを示すために使用されるスペースの数が(ネスティング=他のものの範囲内に何かを配置する; C、javaなどの中括弧を考える)4スペースを使用する* * *はありません。 4スペースは、Pythonコミュニティが合意したように見えるPEP8スタイルのガイドラインです。 – jDo

答えて

2

について必要はありません。これらの関数は、関数名をキーとしてdictに値として格納することができます。メタプログラミングにアプローチするファンキーな方法だ例コード

my_funcs = {} 

for i in range(4): 
    def foo(): 
     pass 
     # Do stuff here that depends on i 
    foo.func_name = "fancy_name_%d" % i # This is probably useless and can be omitted 
    my_funcs["fancy_name_%d" % i] = foo 

# Now you can do. 
my_funcs['fancy_name_1']() 

globals().update(my_funcs) # Export to namespace 
# Now you can also do 
fancy_name_1() 
+0

こんにちは@ user1747134、ありがとうございました。アイデアをコードに収めることが可能になるので、それを簡単に描くことができますか? –

+0

あなたの答えはもう一度ありがとう。私はあなたのアプローチでコードを更新しましたが、まだ私にエラーを与えます...あなたが一目惚れしているかどうかを確認できますか?種類: –

+1

'[data%d%i、data%d + 1%i]'のようなことはできません。 %はモジュロ演算子であり、文字列がフォーマットを行うためにオーバーロードされます。これは、このような変数に名前を付ける構文構造ではありません。おそらく、リスト 'data'を持ち、' ​​[data [i]、data [i + 1]] 'を実行したいと思うでしょう。あなたが本当にそれらを別々の変数として扱いたいのであれば(ただし、正当な理由はありません)、関数の例の場合と同じ方法で行うことができます。 – user1747134

関連する問題