2011-12-13 80 views
6

我有一個函數,我返回兩個值。我想將這兩個值直接放入兩個不同的數組中。我知道如何將輸出作爲兩個不同的值返回以後添加到數組中,但我不想擁有臨時佔位符。一個例子如下所示。Python - 從函數返回多個值到不同的陣列

def two_outputs(): 
    output_one = 5 
    output_two = 6 
    return output_one, output_two 

one_array = []  # initialize array 
two_array = []  # initialize array 

a, b = two_outputs() # get values 

one_array.append(a) # store first value in first array 
two_array.append(b) # store second value in first array 

理想情況下,我想不使用a和b,並且必須在代碼的後面添加。我想將函數的輸出直接附加到兩個數組中。這甚至有可能嗎?

感謝您的任何幫助。我希望我做到了這一點,因爲這是我的第一篇文章。你們已經幫助我很多編程問題了。

更新:我猜根據下面的回答,這是不可能直接做到這一點。感謝大家幫助找到其他方法來實現目標。

+2

你爲什麼要這樣做?臨時佔位者有什麼問題? – tkone 2011-12-13 19:31:58

+1

我正在做很多工作,從數據庫中收集信息,創建返回許多值的函數。我不喜歡臨時佔位符,因爲它增加了代碼的步驟,並且我希望代碼更小/更短。除此之外,沒有技術上的原因。我只是好奇,如果有可能直接獲取函數的輸出到兩個不同的數組(或更多)。根據下面的答案,看起來這是不可能的。 – ruffryder 2011-12-13 19:45:05

回答

1

假設我正確地理解了你,你需要在聲明函數之前定義你的數組。

one_array, two_array = [], [] 

def two_outputs(): 
    one_array.append(5) 
    two_array.append(6) 

#call function 
two_outputs() 

print one_array, two_array 
#[5] [6] 
5

如何使用幫助函數?

def zippend(lists, values): 
    assert len(lists) == len(values) 
    for l,v in zip(lists, values): 
    l.append(v) 

zippend((one_array, two_array), two_outputs()) 

功能zippend有兩個參數。第一種是可迭代的List s(你所說的「數組」實際上是Python中的List s)。第二個是要附加到這些列表的值的迭代。

只要列表數量與值的數量相匹配(每個列表一個值),它就可以根據需要採用任意數量的列表和值。

編輯:如果two_outputs()他們回來的List秒的元組要連接到one_arraytwo_array,那麼你可以更改功能使用extend而不是append

def zextend(lists, values): 
    assert len(lists) == len(values) 
    for l,v in zip(lists, values): 
    l.extend(v) 

或者,如果你真的想到,您可以使用一個具有if語句的單個函數,該語句檢查它得到的是哪種類型的值,並根據情況編輯appendextend

+2

我建議名稱「zippend」。 – 2011-12-13 19:35:43

1

你總是可以改變你的函數返回列表的元組:

def test(): 
    # some code 
    return [a], [b] 

a, b = test() 

,這將使A和B名單時,他們正在返回

0

可以在一個行完成與以下發電機。對「任何」的調用只是使得生成器被消耗,因此其中的表達式被執行。

any(lst.append(item) for lst,item in zip((one_array, two_array), two_outputs())) 

NB。我不會推薦這種編程風格 - 閱讀變得更加困難。 也許,如果它在那裏太頻繁了一個成語,我會寫一個簡短的輔助功能 像分配:

def multi_append(lists, multi_function, *args, **kw): 
    for lst, result in zip(lists, multi_function(*args, **kw)): 
     lst.append(result) 

而且在代碼的「身體」,只寫:

multi_append((array_one, array_two), two_outputs) 

爲了完整起見,我添加了一個建議,允許您使用賦值運算符。

在這種情況下需要什麼是一個自定義List對象,它具有執行追加的屬性。創建這樣的班級是2班,但是,他列出的代碼必須來自這個班級:

class MList(list): 
    last = property(lambda s:s[-1], list.append) 

array_one, array_two = MList(), MList() 

array_one.last, array_two.last = two_outputs()