【问题标题】:loop that alters the name of the function error in Python在 Python 中更改函数错误名称的循环
【发布时间】: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 ... 行的缩进与下面的行相同。您需要将函数内部的任何内容再缩进四个空格。

标签: python loops


【解决方案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()

【讨论】:

  • 嗨@user1747134,非常感谢您的回答。您是否可以在代码中包含您的想法,以便我更容易地描绘它?
  • 再次非常感谢您的回答。我用你的方法更新了代码,但仍然给我错误......你能检查一下我一见钟情是否做错了吗?亲切的问候
  • 你不能做像[data%d %i, data%d+1 %i]这样的事情。 % 是模运算符,它为字符串进行格式化而重载。它不是一个可以像这样命名变量的语法结构。您可能想要一个列表data 并改为使用[data[i], data[i+1]]。如果您真的想将它们作为单独的变量使用(不过我认为没有充分的理由),您可以按照与函数示例相同的方式进行操作。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-08-19
  • 1970-01-01
  • 2022-12-20
相关资源
最近更新 更多