我试图在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个单独的函数:cosine_sim%d %i
,它还应该在函数和打印结果中添加一个数字。考虑到这些因素后,我尝试使用以下代码构建循环:
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
。有关问题所在的任何建议吗?
亲切的问候
答案 0 :(得分:2)
您可以循环创建该功能(如果正确缩进并且您不能在名称中使用%字符),则可以通过访问func_name
属性来更改其名称,但这可能没有必要。您可以将函数作为值存储在dict中,并将其名称作为键。如果您确实希望在命名空间中使用该函数而不是dict,则可以执行globals()['my_func_name'] = my_func_object
更新:示例代码
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()