【问题标题】:How do I loop through functions with similar names in python?如何在python中遍历具有相似名称的函数?
【发布时间】:2017-04-18 17:05:24
【问题描述】:

如果我有不同的函数,名称中的数字越来越多,我该如何循环遍历它们?例如:

def Func1():
    something something

def Func2():
    something something

def Func3():
    something something

...

def Func456832():
    something something

def Func456833():
    something something

我怎样才能用a循环遍历它们:

for i in range(1,456833):

本质上是这个问题: How do I loop through functions with a for loop?

编辑:因为很多人问,这是我真正的代码:

def write(self):
    with open('distances.txt', 'a') as file:
        file.write('\n'+str(self.distance1))
        file.write('\n'+str(self.distance2))
        file.write('\n'+str(self.distance3))
        file.write('\n'+str(self.distance4))
        file.write('\n'+str(self.distance5))
        file.write('\n'+str(self.distance6))
        file.write('\n'+str(self.distance7))
        file.write('\n'+str(self.distance8))
        file.write('\n'+str(self.distance9))
        file.write('\n'+str(self.distance10))
        file.write('\n'+str(self.distance11))
        file.write('\n'+str(self.distance12))
        file.write('\n'+str(self.distance13))
        file.write('\n'+str(self.distance14))
        file.write('\n'+str(self.distance15))

我意识到这是一种非常糟糕的完成方式,特别是如果我想继续扩大列表。所以我去寻找答案,这似乎是我需要知道的才能解决它。

Edit2:我从哪里获得 self.distanceX:

class NeuralNetwork():
     def __init__(self, inputs, hidden1, hidden2, hidden3, outputs, alpha,it_1,it_2,it_3,it_4,it_5):

    ....

    self.distance1 = [alpha,hidden1,it_1,'train',0,0,0,0,0]
    self.distance2 = [alpha,hidden1,it_1,'test',0,0,0,0,0]
    self.distance3 = [alpha,hidden1,it_1,'dist',0,0,0,0,0]
    self.distance4 = [alpha,hidden1,it_2,'train',0,0,0,0,0]
    self.distance5 = [alpha,hidden1,it_2,'test',0,0,0,0,0]
    self.distance6 = [alpha,hidden1,it_2,'dist',0,0,0,0,0]
    self.distance7 = [alpha,hidden1,it_3,'train',0,0,0,0,0]
    self.distance8 = [alpha,hidden1,it_3,'test',0,0,0,0,0]
    self.distance9 = [alpha,hidden1,it_3,'dist',0,0,0,0,0]
    self.distance10 = [alpha,hidden1,it_4,'train',0,0,0,0,0]
    self.distance11 = [alpha,hidden1,it_4,'test',0,0,0,0,0]
    self.distance12 = [alpha,hidden1,it_4,'dist',0,0,0,0,0]
    self.distance13 = [alpha,hidden1,it_5,'train',0,0,0,0,0]
    self.distance14 = [alpha,hidden1,it_5,'test',0,0,0,0,0]
    self.distance15 = [alpha,hidden1,it_5,'dist',0,0,0,0,0]

编辑:已解决。谢谢大家:)

【问题讨论】:

  • 你有什么理由(似乎)有 456833 个函数而不是一个带有额外参数的函数?
  • 这对我来说就像XY problem。你这样做是为了达到什么目的?
  • 您要求的是帮助实施一个非常糟糕的做法。你想解决什么问题?
  • @TemporalWolf - 这取决于... unittest 通过查找具有设定模式的类和方法并运行它们来运行测试。我对远程传感器类型做了一些类似的事情(例如,添加一个了解出口温度的函数,框架会自动调用它)。 456833 个?不过,这是很多打字!
  • @tdelaney 每个规则都有例外,但在一般情况下,如果您尝试创建和调用 半百万 函数,您可能正在这样做错了。

标签: python function loops


【解决方案1】:

您需要以更好的方式存储所有这些距离。

class NeuralNetwork():
    def __init__(self, inputs, hidden1, hidden2, hidden3, outputs, alpha,it_1,it_2,it_3,it_4,it_5):
        ....
        self.distance1 = [alpha,hidden1,it_1,'train',0,0,0,0,0]
        self.distance2 = [alpha,hidden1,it_1,'test',0,0,0,0,0]
        self.distance3 = [alpha,hidden1,it_1,'dist',0,0,0,0,0]
        ...

我希望可以用一个列表压缩成:

class NeuralNetwork():
    def __init__(self, inputs, hidden1, hidden2, hidden3, outputs, alpha,it_1,it_2,it_3,it_4,it_5):
        ....
        self.distances = []
        self.distances.append([alpha,hidden1,it_1,'train',0,0,0,0,0])
        self.distances.append([alpha,hidden1,it_1,'test',0,0,0,0,0])
        self.distances.append([alpha,hidden1,it_1,'dist',0,0,0,0,0])
        ...

或者更好:

class NeuralNetwork():
    def __init__(self, inputs, hidden1, hidden2, hidden3, outputs, alpha, *iterations):
        ....
        self.distances = []
        for iteration in interations:
            for type in ['train', 'test', 'dist']:
                self.distances.append([alpha, hidden1, iteration, type, 0, 0, 0, 0, 0])

假设您有 50 万个条目,还涉及其他变量,但想法相同:将它们循环成一个列表。

然后写成:

def write(self):
    with open('distances.txt', 'a') as file:
        for distance in self.distances:
            file.write('\n'+str(distance))

【讨论】:

  • 我绝对需要学会快速查看这些循环。我还在挣扎。我的整个代码都充满了像这个QQ这样的垃圾
  • @Perm.Questiin 可能值得通过一些循环/列表教程
  • 我现在正在清理,进展还不错:) 已经从 600 行变成了 200 行:D
  • @Perm.Questiin 另外,值得注意的是那些self.distanceXs 是attributes,而不是functions。将来,请在您的实际代码中包含minimal reproducible example...它将节省所有来回:) 重构祝你好运。
【解决方案2】:

我假设您正在从同一个文件进行迭代,如果是这样...

def a():
    pass

def b():    
    pass

g = globals()

g = g.items()

for i, symbol  in  g:
    if callable(symbol):
        print(i, symbol)

这个输出

('a', <function a at 0x107516c08>)
('b', <function b at 0x1075180c8>)

【讨论】:

  • 注意:callable 曾经被弃用,但现在不是。所以在使用前请检查。 bugs.python.org/issue10518
  • 这不会调用带有签名 OP 请求的函数。
  • symbol 引用了 callable ,你可以像普通函数一样直接调用它。例如。 symbol() //不带参数 symbol(3, 4) //带参数
  • 不,symbol 只是函数的名称。你必须做globals()[symbol]()。如果符号是launch_the_missles 怎么办?您仍然需要检查它是否符合名称模式。
  • 不。符号是可调用的,再次查看输出;它说 表示它是函数对象。在发表评论之前,我确实在本地尝试过。我可以用 symbol() 调用函数。
【解决方案3】:

假设循环在同一个模块,函数在globals()

for i in range(1, 456834):
    globals()["Func{}".format(i)]()

如果函数号不连续,可以过滤命名空间,然后调用

import re

for fctn in sorted(obj for name,obj in globals().items() if re.match(r'Func\d+$' name)):
    fctn()

【讨论】:

  • ...但你可能不应该这样做。
  • @Carcigenicate - 可能是众包
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-07-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-01-06
  • 1970-01-01
相关资源
最近更新 更多