Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/320.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Python中更改函数错误名称的循环_Python_Loops - Fatal编程技术网

在Python中更改函数错误名称的循环

在Python中更改函数错误名称的循环,python,loops,Python,Loops,我试图在Python中运行一个简单的循环,以避免反复运行相同的代码,但我总是遇到一个错误。我认为这是因为循环在函数中运行。为了说明这一点,让我向您展示当代码未在循环中携带时,重复使用以下形式: def cosine_sim0(data0, data1): tfidf = vectorizer.fit_transform([data0, data1]) return ((tfidf * tfidf.T).A)[0,1] print(cosine_sim0(data0, data1)

我试图在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\u 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)
正如大多数人可能猜到的,检索到的错误状态为
无效语法
。有没有关于问题所在的建议


您可以在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()

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

这是一种处理元编程的时髦方式!:)它通常是通过装饰器和/或类继承来实现的。。。更多关于这个。无论如何,您的缩进在最后一个代码段(for循环的
中是关闭的
tfidf=…
return…
应该用4个空格缩进您的答案@jDo,4个空格是什么意思?干杯只要用来表示嵌套的空格数是一致的(嵌套=将某些内容放在其他内容的范围内;考虑C、java等语言中的大括号),就不必使用4个空格。4空格只是python社区似乎已经同意的PEP8风格的指南约定。一行代码应该位于另一个块的内部,比块的开头多4个缩进空格。在这种情况下,
tfidf=…
return…
不是函数的一部分,因为它们没有足够的缩进。请查看最后一个函数(在底部块中)。
def…
行与下面的行位于同一缩进处。你需要在函数内部再缩进四个空格。这是一种处理元编程的时髦方式!:)它通常是通过装饰器和/或类继承来实现的。。。更多关于这个。无论如何,您的缩进在最后一个代码段(for
循环的
中是关闭的
tfidf=…
return…
应该用4个空格缩进您的答案@jDo,4个空格是什么意思?干杯只要用来表示嵌套的空格数是一致的(嵌套=将某些内容放在其他内容的范围内;考虑C、java等语言中的大括号),就不必使用4个空格。4空格只是python社区似乎已经同意的PEP8风格的指南约定。一行代码应该位于另一个块的内部,比块的开头多4个缩进空格。在这种情况下,
tfidf=…
return…
不是函数的一部分,因为它们没有足够的缩进。请查看最后一个函数(在底部块中)。
def…
行与下面的行位于同一缩进处。你需要在函数内部再缩进四个空格。您好@user1747134,非常感谢您的回答。你能不能把你的想法写进一个代码里,这样我就能更容易地描述出来?再次感谢你的回答。我用你的方法更新了代码,但仍然给我错误。。。你能查一查我第一眼看到的是不是做错了什么吗?种类尊重您不能做类似于
[数据%d%i,数据%d+1%i]
的事情。%是模运算符,它重载字符串进行格式化。它不是一个可以这样命名变量的语法结构。您可能希望有一个列表
data
,并改为执行
[data[i],data[i+1]
。如果您真的想将它们作为单独的变量使用(尽管我看不出有什么好的理由),您可以使用与函数示例中相同的方法来处理它们。您好@user1747134,非常感谢您的回答。你能不能把你的想法写进一个代码里,这样我就能更容易地描述出来?再次感谢你的回答。我用你的方法更新了代码,但仍然给我错误。。。你能查一查我第一眼看到的是不是做错了什么吗?种类尊重您不能做类似于
[数据%d%i,数据%d+1%i]
的事情。%是模运算符,它重载字符串进行格式化。它不是一个可以这样命名变量的语法结构。您可能希望有一个列表
data
,并改为执行
[data[i],data[i+1]
。如果您真的想将它们作为单独的变量使用(尽管我看不出有什么好的理由),您可以使用与函数示例中相同的方法。