在Python中改变函数名的循环

2024-09-27 09:32:25 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图在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。有什么关于问题所在的建议吗?你知道吗

谨致问候


Tags: 函数代码returndeftransformfittfidfprint
1条回答
网友
1楼 · 发布于 2024-09-27 09:32:25

您可以在cycle中创建函数(如果正确缩进并且不能在名称中使用%字符),然后可以通过访问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()

相关问题 更多 >

    热门问题