2013-07-02 99 views
0

我正在嘗試創建一個函數new_function,它以一個數字作爲參數。 該函數將根據我作爲參數傳遞的數字操縱列表中的值。在這個函數中,我將放置另一個函數new_sum,它負責處理列表中的值。 例如,如果我將4傳入new_function,則需要new_function在前四個元素的每一個上運行new_sum。相應的值會改變,我需要創建四個新的列表。Python函數不能正常工作

例如:

listone=[1,2,3,4,5] 
def new_function(value): 
    for i in range(0,value): 
     new_list=listone[:] 
     variable=new_sum(i) 
     new_list[i]=variable 
     return new_list 

# running new_function(4) should return four new lists 
# [(new value for index zero, based on new_sum),2,3,4,5] 
# [1,(new value for index one, based on new_sum),3,4,5] 
# [1,2,(new value for index two, based on new_sum),4,5] 
# [1,2,3,(new value for index three, based on new_sum),5] 

我的問題是,我不斷獲取一個巨大的名單。我究竟做錯了什麼?

回答

7

修復return語句的縮進:

listone=[1,2,3,4,5] 
def new_function(value): 
    for i in range(0,value): 
     new_list=listone[:] 
     variable=new_sum(i) 
     new_list[i]=variable 
    return new_list 
+2

從OP代碼的語義看來,他實際上想要「yield」,而不是「return」,「new_list」。 –

2

return new_list的問題是,一旦你return,該功能就完成了。

可以讓事情變得更加複雜積累的結果,並return荷蘭國際集團所有這些在最後:

listone=[1,2,3,4,5] 
def new_function(value): 
    new_lists = [] 
    for i in range(0,value): 
     new_list=listone[:] 
     variable=new_sum(i) 
     new_list[i]=variable 
     new_lists.append(new_list) 
    return new_lists 

然而,這正是發電機是:如果你yield,而不是return,給人的調用者一個值,然後在他請求下一個值時恢復。所以:

listone=[1,2,3,4,5] 
def new_function(value): 
    for i in range(0,value): 
     new_list=listone[:] 
     variable=new_sum(i) 
     new_list[i]=variable 
     yield new_list 

不同的是,第一個版本給呼叫者的四個列表清單,而第二個給呼叫者的四個列表的迭代器。通常情況下,你並不在乎差異 - 事實上,迭代器可能更適合響應性,內存或性能的原因。*

如果你照顧,它通常更有意義,只是做在你需要的地方從迭代器中列出一個列表。換句話說,使用該函數的第二個版本,那麼就寫道:

new_lists = list(new_function(4)) 

順便說一句,你可以通過不試圖變異就地new_list簡化了這一點,而不是僅僅更改值同時複製。例如:

def new_function(value): 
    for i in range(value): 
     yield listone[:i] + [new_sum(i)] + listone[i+1:] 

*響應性,因爲你只要它已經準備好獲得的第一個結果,而不是隻後,他們都準備好了。內存使用得到了改善,因爲您不需要一次只保留所有內存列表,只需一次一個。性能可能會提高,因爲交錯工作可以導致更好的緩存行爲和流水線。