2012-03-14 83 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是否是單個函數,然後在對其進行操作之前將其包含在列表中,則會拋出錯誤。