有没有一种有效的方法可以将参数传递给输入文件中的函数?

时间:2019-01-23 00:21:15

标签: python function parameters

我正在使用参数扫描测试不同变量如何影响模型。我正在尝试从文本文件中读取参数,并将其传递给函数,在该函数中将计算模型并返回答案并输出。

例如,如果我有一个输入文件,其参数名是第一行,连续的行是我要计算的参数组合:

input.txt 
param1, param2, param3, ..., paramm
0,0,1
0,0,2
0,1,1
0,1,2
0,2,1
0,2,2
1,0,1
1,0,2
1,1,1
1,1,2
1,2,1
1,2,2

我有一个计算我的模型的函数。为简单起见,我将说模型是我所有参数的总和:

def model(param1,param2,param3...,paramm):
    param1=0
    param2=0
    param3=0
    param4=0
    param5=0
    .
    .
    .
    paramn=0

    answer=parma1+param2+param3+param4+param5

    return answer

其中将参数设置为0是初始化它们的一种方式(我现在知道它不适用于param1,param2或param3,因为它会覆盖写给它们的内容)。我包含param4和param5来表示可能还有其他参数,这些参数我不会改变,但采用一些默认值。

如何读取文件并运行所有参数组合?我应该只创建一些称为params的元组并在每次读取文件后调整值吗?还是有更好的方法?


EDIT1:

我已经编辑了问题,以添加更多在文本文件和常量中已知的参数。对于每次传递给函数的情况,我最好创建一个参数对象并编辑该对象的值。

请注意,尽管该函数在此示例中是一个求和器,但在实际程序中它将更加复杂,可能仅使用参数的子集来调用其他函数。例如

def model1(param1):
    a=1
    b=2
    c=3

    return a*param1**2+b*param1+c 

def model(param1,param2,param3...,paramm):
    param1=0
    param2=0
    param3=0
    param4=0
    param5=0
    .
    .
    .
    paramn=0

    answer=model1(param1)+param2+param3+param4+param5

2 个答案:

答案 0 :(得分:0)

使用with open并使model更容易解决问题,请使用以下代码作为完整代码:

def model(param1,param2,param3):
    return param1 + param2 + param3
with open('input.txt','r') as f:
    next(f)
    for i in f:
        print(model(*i.split(',')))

答案 1 :(得分:0)

有几种方法可以做到这一点。如果文件中的第一行不存在,则可以将该文件视为.csv文件(“ param1,param2,param3”的第一行是标题,而后几行是逗号分隔的值)这三列)。 Python已经有易于使用的模块,可以在CSV文件中读写数据。您可以here来了解它。

但是,在您的特定情况下,文件以一行数据开头,第二行后面是CSV标头,然后第三行及以后都有CSV dat。如果您最终尝试读取数值数据的每一行并将其传递给函数,则可以执行以下操作:

def find_sum(values):
    return sum(values)

with open(r"C:\tmp\myfile.txt", 'r') as f:
    data = f.readlines()

dataname = data[0].strip()            # The first row of the file
row_names = data[1].strip().split(',')  # The second row of the file

for line in data[2:]:
    values = [ float(i) for i in line.strip().split(',') ]
    print "My function on", values, "returns", find_sum(values)

打印输出:

My function on [0.0, 0.0, 1.0] returns 1.0
My function on [0.0, 0.0, 2.0] returns 2.0
My function on [0.0, 1.0, 1.0] returns 2.0
My function on [0.0, 1.0, 2.0] returns 3.0
My function on [0.0, 2.0, 1.0] returns 3.0
My function on [0.0, 2.0, 2.0] returns 4.0
My function on [1.0, 0.0, 1.0] returns 2.0
My function on [1.0, 0.0, 2.0] returns 3.0
My function on [1.0, 1.0, 1.0] returns 3.0
My function on [1.0, 1.0, 2.0] returns 4.0
My function on [1.0, 2.0, 1.0] returns 4.0
My function on [1.0, 2.0, 2.0] returns 5.0

仔细查看命令[ float(i) for i in line.strip().split(',') ],其作用是从文件中取出一行数字,最后使用.strip()截断换行符,将内容拆分为逗号,并将内容从字符串转换为浮点数。您可以使用整数而不是浮点数,但是我不知道您的实际数据是否可能包含非数字值。如果需要使用变量,我还从文件的前两行中制作了变量。

编辑:如果正如评论者所解释的那样,readlines()因为您有成千上万的行而无法完成工作,那么这是一种重新设计,尽管它会跳过行直到找到为止以一个假定的数字开头的是一行数据:

reached_numbers = False
with open(r"C:\tmp\myfile.txt", 'r') as f:
    for line in (f):
        if reached_numbers:
            values = [ float(i) for i in line.strip().split(',') ]
            print "My function on", values, "returns", find_sum(values)
        else:
            reached_numbers = line[0].isdigit()