2012-03-14 70 views
0

考虑下面的代码段:循环过度的功能阵列出现故障为单功能在Python

def integ(fncts, propagate, stpSz): 
    conditions = propagate.copy() 
    iterator = 0 
    for i in fncts: 
     conditions[iterator] = conditions[iterator] + stpSz * i(0) 
     iterator+=1 

    return conditions 

fncts是函数数组,像这样:

f1 = lambda x: x 
f2 = lambda x: 2*x 
fncts = (f1, f2) 

问题是,该以上代码适用于length(fncts)> 1。但是,如果只有一个功能,则失败。如果用户只输入一个函数,如何确保代码可以执行?

+0

它是如何失败?你会得到什么错误? – 2012-03-14 14:22:58

+0

请根据“失败”进行展开。有没有回溯?如果是这样,请将其添加到您的问题。我怀疑你正在像'integ((f1),propagate,stpSz)'调用'inteq''而不是像这样'integ((f1,),propagate,stpSz)''。注意'f1'后面的逗号。这使它成为一个元组而不仅仅是括号。 – 2012-03-14 14:24:13

回答

5

我假设你的意思是用户输入fncts = f?您可以要求用户始终使用一个序列,因此可以使用fncts = [f]fncts = (f,),或者检查callable(fncts);元组和列表不可调用。

+0

原来我可以用'if len(fncts)> 1:'来解决它,但是谢谢你的回答,所以我会给你信用! – Ingo 2012-03-14 14:33:05

+1

@thomas:如果检查'fncts'的长度有效,那么这个答案是不正确的。这里的所有答案都假设你将一个函数而不是元组传递给'integ'。然而,考虑一个函数的长度会导致一个TypeError(例如'len(lambda:1)',所以这个假设是错误的。下一次请更精确地询问你的问题并回应澄清请求。预期的行为或发布回溯,你会得到更好的答案。 – 2012-03-14 15:24:47

+0

谢谢,我会尽我所能。 – Ingo 2012-03-14 22:26:34

1

如果第一个参数不是列表(至少是长度为1的列表),或者检查fncts是否是单个函数,然后在对其进行操作之前将其包含在列表中,则会抛出错误。