2016-08-01 32 views
0

如何使用可選的輸出參數編寫函數。 在示例如何在Python中使用可選輸出參數編寫函數

1)mat = ReadBinFile(filename)
2)[mat,titles] = ReadBinFile(filename)

如果我完成與

return mat,titles 

的 「ReadBinFile」 函數I在第一示例

具有元組中的 「墊」

謝謝你的幫助

+0

這是什麼情況?如果你不想要第二個元組元素,就忽略它。 – mhawke

+0

你不能這樣做。無論如何,這不是一個好主意。只需解壓縮結果並丟棄任何不需要的元素。 – BrenBarn

+0

在元組上使用生成器具有潛在的降低時間的優點(如果每個元素需要一段時間才能獲得) –

回答

-1

有兩種方法可以做到這一點。一個是接受一個決定返回值的參數。第二,(更有趣的)是返回一個生成器。

def ReadBinFile(filename): 
    yield mat 
    yield titles 

mat,titles = ReadBinFile(filename) 

這將讓你只獲得第一個或獲得第n個返回值。

+1

這不起作用。如果你使用'mat = ReadBinFile(filename)','mat'將會獲得生成器本身,而不是第一個產生的值。 – BrenBarn

+0

我不認爲有一種方法可以完成你想要做的事情。在Python中,您不能更改語法,但可以獲得功能性結果。我非常肯定,這提供了您所需要的所有功能。 –

0

如果不向函數指示需要哪種返回類型,或者屏蔽函數名稱(請參閱我的註釋),則無法執行此操作。

讓我來證明一下爲什麼。

在Perl中,我們可以通過測試調用的上下文來做到這一點。第一個(單一返回值)是標量上下文,第二個是列表上下文。我們可以使用名爲wantarray的函數進行測試(谷歌「python wantarray」 - 其他搜索引擎可用)。由於這個原因,許多Perl不常見,如果不是唯一的話。

Python不能像那樣工作,儘管與其他語言相比,內省可以被用於極端。轉讓形式爲:

name = object 

其中name是無類型的參考。所以:

mat = ReadBinFile(filename) 

即使通過一些偷偷摸摸的手段,我們考察了字節碼,我們就無法知道應該什麼類對象mat的引用方式。 A listtupleintbirdplane

的語法告訴你:

[mat,titles] = ReadBinFile(filename) 

是一個謎。雖然有效,但它沒有實際區別:

mat,titles = ReadBinFile(filename) 

哪一個當然是元組。那麼,我們如何才能知道:

mat = ReadBinFile(filename) 

應該是一個tuple,一個list,或任何物體mat的類應該參考一下。

畢竟,在我看來,不同類的返回對象是一個可疑的練習,即使在Perl中。有一些例外情況,例如在某些情況下返回None。爲什麼懷疑?因爲代碼變得難以閱讀,修改和支持。

相關問題