【问题标题】:How to call multiple functions using loop?如何使用循环调用多个函数?
【发布时间】:2021-06-05 19:04:19
【问题描述】:

我的程序结构如下所示

def method_1(new_parameters):
    ...

def method_2(new_parameters):
    ...

def calculation(parameters):
    ......
    new_parameters = generate_new_params
    method_call = method_1(**new_parameters)

if __name__ =="__main__":
    ......
    output = calculation(parameters)

代码运行良好。我必须运行程序 2 次才能获得基于 2 种方法的输出。首先,我使用method_1(**new_parameters) 运行程序,第二次使用method_2(**new_parameters)

如果我想一个接一个地调用这两种方法(可能使用loop),那么我必须如何编写代码?

比如说,

if __name__ =="__main__":
    Methods = {"method-1": method_1, "method-2": method_2}
    ......
    for method in Methods:
        output = calculation(parameters)

我浏览了一些帖子(thisthis),但没有任何想法。在这里,我面临的挑战是从 def calculation() 调用函数,但我必须从 main 传递函数。

【问题讨论】:

  • 你为什么不能做output1 = method_1(parameters); output2 = method_2(parameters)
  • 为什么不直接将需要在new_parameter 上运行的函数作为参数传递给calculation 函数?

标签: python python-3.x loops


【解决方案1】:

我不能清楚地理解你的问题,但我能猜到。

试试这个。

def calculation(mt, parameters):
    ......
    new_parameters = generate_new_params
    method_call = mt(**new_parameters)

if __name__ =="__main__":
    Methods = {"method-1": method_1, "method-2": method_2}
    ......
    
    outputs = [calculation(method, parameters) for key, method in Methods.items()]

【讨论】:

    【解决方案2】:

    我只是将函数作为参数传递给calculation 函数,如下所示:

    def method_1(new_parameters):
        ...
    
    def method_2(new_parameters):
        ...
    
    def calculation(parameters, method_name, method):
        ......
        new_parameters = generate_new_params
        method_call = method(**new_parameters)
    
    if __name__ =="__main__":
        ......
        output = calculation(parameters)
    

    然后像这样执行循环:

    if __name__ =="__main__":
        Methods = {"method-1": method_1, "method-2": method_2}
        ......
        for key, value in Methods.items():
            output = calculation(parameters, key, value)
    

    【讨论】:

    • 谢谢。如果我想同时通过keyvalue,那我该怎么办?
    • @Opps_0 我已更新答案以反映您的问题
    【解决方案3】:

    您是指将一个函数作为参数传递给另一个函数然后调用它吗?这被称为高阶函数。所以像这样。

    def method_1(new_parameters):
        ...
    
    def method_2(new_parameters):
        ...
    
    def calculation(parameters, callback):
        ......
        new_parameters = generate_new_params
        callback_result = callback(**new_parameters)
    
    if __name__ =="__main__":
        ......
        output1 = calculation(parameters, method_1)
        output2 = calculation(parameters, method_2)
    

    【讨论】:

      【解决方案4】:

      您似乎想要一种无需太多复杂代码即可迭代一组函数的方法。

      我建议创建一个将所有方法捆绑在一起的类,如下所示:

      class Calculator():
          """Container class for functions over which to iterate and/or access with strings."""
          def __init__(self):
              pass
      
          def list_calc_funcs(self):
              """returns list of functions starting with 'calc_', uncalled"""
              return [getattr(self, name) for name in self.list_calc_names()]
      
          def list_calc_names(self):
              """returns list of unique part of strings identifying 'calc_' functions"""
              return [string for string in dir(self) if string[:5]=='calc_']
      
          def calculate(self,cnt:str,*args,**kwargs):
              """calls a 'calc_' function using a string"""
              try:
                  calc = getattr(self,"calc_" + cnt)
              except AttributeError:
                  raise ValueError("The named function does not exist.")
              return calc(*args,**kwargs)
      
          def calc_foo(self,*args,**kwargs):
              pass
      
          def calc_bar(self,*args,**kwargs):
              pass
      
          def calc_1(self,*args,**kwargs):
              pass
      
          def calc_2(self,*args,**kwargs):
              pass
      
      C = Calculator()
      

      它的工作方式是利用“dir()”和“getattr()”。 dir() 基本上返回一个包含所有实例变量名称的列表,包括任何函数。 例如,如果您调用 dir(C),它将返回:

      ['__class__',
       '__delattr__',
       '__dict__',
       '__dir__',
       '__doc__',
       '__eq__',
       '__format__',
       '__ge__',
       '__getattribute__',
       '__gt__',
       '__hash__',
       '__init__',
       '__init_subclass__',
       '__le__',
       '__lt__',
       '__module__',
       '__ne__',
       '__new__',
       '__reduce__',
       '__reduce_ex__',
       '__repr__',
       '__setattr__',
       '__sizeof__',
       '__str__',
       '__subclasshook__',
       '__weakref__',
       'calc_1',
       'calc_2',
       'calc_bar',
       'calc_foo',
       'calculate',
       'list_calc_funcs',
       'list_calc_names']
      

      这使您可以使用基本的字符串方法来查找所需的方法,只需使用您喜欢的任何命名方案“标记”它们。

      getattr(object,attribute_name) 是一个非常有用的知识,它允许您使用字符串访问几乎任何东西的属性/变量/方法。如果您需要让用户能够根据字符串指定函数,或者如果您需要遍历 dir() 中的某些值,它非常强大。

      在 list_calc_names() 中,我使用列表推导轻松地返回所有以“calc_”开头的属性名称。请注意,如果您这样做,您需要确保不要以这种方式启动任何变量名,否则它们也会被返回。就我而言,它返回:

      ['calc_1', 'calc_2', 'calc_bar', 'calc_foo']
      

      在 list_calc_funcs() 中,我再次使用列表推导来迭代 list_calc_names() 的结果并返回函数本身。它返回:

      [<bound method Calculator.calc_1 of <__main__.Calculator object at 0x000000000A12E0D0>>,
       <bound method Calculator.calc_2 of <__main__.Calculator object at 0x000000000A12E0D0>>,
       <bound method Calculator.calc_bar of <__main__.Calculator object at 0x000000000A12E0D0>>,
       <bound method Calculator.calc_foo of <__main__.Calculator object at 0x000000000A12E0D0>>]
      

      函数“calculate()”展示了如何根据可以在运行时输入的字符串而不是直接调用函数来概括调用特定函数。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-08-23
        • 2019-06-11
        • 1970-01-01
        • 2016-07-13
        • 2016-04-01
        • 2020-10-07
        • 1970-01-01
        • 2020-03-13
        相关资源
        最近更新 更多