【发布时间】:2016-04-04 11:04:23
【问题描述】:
我正在尝试在 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。关于问题出在哪里的任何建议?
亲切的问候
【问题讨论】:
-
这是一种处理元编程的时髦方式! :) 它通常通过装饰器和/或类继承来完成......更多关于here。无论如何,您的缩进在最后一个代码 sn-p (
for循环)中关闭。tfidf = ...和return ...应该缩进 4 个空格 -
感谢您的回答@jDo ,4个空格是什么意思?干杯,
-
Like this。您不必必须使用 4 个空格,只要用于指示嵌套的空格数是一致的(嵌套 = 将某些内容放在其他内容的范围内;想想 C、java 等中的花括号.)。 4 个空格只是 python 社区似乎已经同意的 PEP8 样式指南约定。
-
本应位于另一个块内的代码行应该比块的开头多四个缩进空格。在这种情况下,
tfidf = ...和return ...不是函数的一部分,因为它们的缩进不够。 -
看看最后一个函数(在底部块中)。
def ...行的缩进与下面的行相同。您需要将函数内部的任何内容再缩进四个空格。