【问题标题】:How can I generate some Python scripts based on different conditions nicely?如何根据不同的条件很好地生成一些 Python 脚本?
【发布时间】:2019-09-19 16:21:09
【问题描述】:

我想根据不同的条件生成一些 Python 脚本。这意味着:我的 Python 脚本有一个不变的主体,在所有不同的条件下都完全相同,但是由于我有几个不同的条件,这些 Python 脚本中的某些区域应该更改。假设这是我不变的部分,在所有条件下都是相似的:

import numpy as np

variables = []

for i in range(100):
 variables.append(tempVariable)

print variables

我有 4 个不同的条件,其中 tempVariable 的计算方式不同:

条件一:tempVariable = i

条件二:tempVariable = i**2

条件3:tempVariable = i**3

条件4:tempVariable = i + 4.34

请注意,我不想使用if 语句来切换这四个条件,因为这些条件实际上是不同的情况,并不相关。最后,我希望variables 独立用于这四种不同的条件和情况。我的想法是将这四个案例或条件放入一个txt文件并将Python脚本的常量部分视为另一个txt文件并遍历所有这四个条件或案例并添加计算tempVariable之前的必要部分将其附加到variables。当然,它看起来很丑,更重要的是我想把它发给其他人使用。如果有任何更好的通用方法,我将不胜感激。在我的实际应用程序中,我有 94​​ 种不同的条件或情况,如果我想将它们放在一些 ifelif 语句下,那将非常难看。任何建议或想法表示赞赏。

【问题讨论】:

  • 所以你想要一个基本脚本,然后根据用途添加一些额外的代码?喜欢模板?
  • 不清楚为什么你不想在这里使用条件语句。这似乎正是这项工作的正确工具。或者也许是一个函数字典?
  • @Carcigenicate 请注意,我在实际应用程序中有 94 种不同的条件,我不想创建一长串 if 语句来切换它们。如果我有 4 或 5 个不同的条件,这很容易,但 94 相当高,会使代码看起来很混乱。
  • 其实现在读多了,听起来你只是想要一些功能。使用函数泛化代码的典型“配方”是将相同的部分放入函数体中,然后将不同的部分作为函数的参数。
  • @AloneProgrammer 条件是什么?给个样本。

标签: python appearance


【解决方案1】:

如果您总是使用多项式,则可以将系数列表传递给您的函数。

对于您提供的条件,对象如下:

mylist = [[0,1,0,0],[0,0,1,0],[0,0,0,1],[4.34,1,0,0]]

那么您的nth 条件行只需阅读:

Condition: tempVariable = mylist[n][0] + mylist[n][1]*i + mylist[n][2]*i**2 + mylist[n][3]*i**3 

通过建立一个通用条件,您将不需要此函数的多个副本

【讨论】:

  • 我喜欢这个。唯一的问题是,对于大指数,您将拥有只有一个非零元素的大型数组。也许不是列出所有系数,而是将多项式次数和系数存储为一对。或者,如果您的系数始终为 1,则只是度数。
【解决方案2】:

如果您不需要在运行时更改条件但在执行程序时: 您可以在文件开头添加常量变量,或者您可以创建一个类似parameters 的文件并存储所有条件以及哪个条件在该文件中处于活动状态。 然后导入该文件并获取活动条件(参数)并充当它。

【讨论】:

    【解决方案3】:

    使用 lambdas

    这是一个演示这个想法的例子。

    lambdas = [None]*4
    
    lambdas[0] = lambda i : i
    
    lambdas[1] = lambda i : i**2
    
    lambdas[2] = lambda i : i**3
    
    lambdas[3] = lambda i : i + 4.34
    
    
    for i in range(0, 10):
        print( "=====  ", i )
        print( lambdas[0](i) )
        print( lambdas[1](i) )
        print( lambdas[2](i) )
        print( lambdas[3](i) )
    

    【讨论】:

      【解决方案4】:

      最后,我找到了一个解决方案,它确实更适合有无数条件(即 1000 种不同条件)的情况。事实上,我把所有的命令放在一个可以被自动解析和读取的文本文件中:

      commands.txt:

      tempVariable = i
      tempVariable = i**2
      tempVariable = i**3
      tempVariable = i + 4.34
      

      然后,我像这样读取并执行它们:

      def Execute(command):
       variables = []
      
       for i in range(100):
        exec(command)
        variables.append(tempVariable)
      
       print variables
      
      if __name__ == "__main__":
       conditions = open('commands.txt').read().split('\n')[:-1]
       map(Execute, conditions) 
      

      【讨论】:

        【解决方案5】:

        这是一种方法:

        variables = []
        func_dict = {'linear': lambda x: x, 'squared': lambda x: x ** 2, 'cubed': lambda x: x ** 3}
        
        
        def calculator(func, myArray):
            for i in range(10):
                myArray.append(func(i))
        
        
        answers = {}
        for func_name in func_dict:
            new_arr = []
            calculator(func_dict[func_name], new_arr)
            answers[func_name] = new_arr
        
        print(answers)
        

        输出:

        {'linear': [0, 1, 2, 3, 4, 5, 6, 7, 8, 9], 'squared': [0, 1, 4, 9, 16, 25, 36, 49, 64, 81], 'cubed': [0, 1, 8, 27, 64, 125, 216, 343, 512, 729]}
        

        有了这个,当你有一个新函数时,你需要做的就是将它添加到函数字典中。没有其他东西需要改变。也许您可以进一步简化它。

        【讨论】:

          【解决方案6】:

          你可以试试:

          def cond1(x):
              return x
          
          def cond2(x):
              return x**2
          
          def cond3(x):
              return x**3
          
          def cond4(x):
              return x + 4.34
          
          my_conds = (cond1, cond2, cond3, cond4)
          variables = [list(map(cond, range(100))) for cond in my_conds]
          

          【讨论】:

            猜你喜欢
            • 2014-10-09
            • 2021-11-08
            • 2019-10-28
            • 1970-01-01
            • 2020-05-09
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2021-07-01
            相关资源
            最近更新 更多