2016-12-06 60 views
0

根據調用者的不同,python中的函數可能返回不同數量的變量嗎?根據調用者返回不同數量的變量

我是一個Matlab程序員,在這個語言中它使用了很多,但我想知道如果Python也有這個選項,如果它是一個很好的編程習慣。

Matlab的例子:

minval  = min([5,2,7,1,6]) % will only return the min value 
minval, idx = min([5,2,7,1,6]) % will return the min value and the index 

min函數這裏僅僅是一個例子(我的功能有什麼用計算最小值做)。

我想創建一個函數,在90%的情況下,只有第一個返回的值將被使用(如在min中,有時您不關心索引但僅僅需要該值本身)。

當然,我可以強制每次調用2個返回值,但我認爲如果您可以僅根據您的需要使用一個返回值或2來調用它,它會更乾淨和更好。

我已經看到一些有趣的提議,關於傳遞一個標誌與默認值告訴函數有多少輸出是預期的,但我正在尋找一些完全透明的東西。

+2

可能嗎?是。值得做?編號 –

+0

許多功能(例如在web API中)總是返回列表 - 帶有許多結果,如果沒有結果,則返回一個結果或空列表 - 它使生活變得更容易。 – furas

+0

關於MATLAB如何處理返回值,沒有什麼「乾淨」或「很好」。它使包裝函數等簡單的事情變得痛苦,使得類似於重寫索引惡夢的類,並且使通用匿名包裝函數變得不可能。 – TheBlackCat

回答

3

沒有標準的Python方法來做到這一點;一個Python函數通常不知道它被調用的上下文。

我不會聲稱它是不可能因爲有方法可以通過堆棧跟蹤返回,檢查代碼對象等等,誰知道,這可能是某種方式 - 但不是以你想要的方式使用。

在Python你要麼通過一個選項具有默認值,因此您不必將它傳遞在正常情況下:

def min(iterable, return_index=False): 
    ... 

minval = min([5,2,7,1,6]) 
minval, i = min([5,2,7,1,6], return_index=True) 

或者你永遠都返回,而忽略一個其中:

minval, _ = minwithindex([5,2,7,1,6]) 
+0

請注意,'_'並不真正「忽略」輸出的相應部分,但'_'是一個有效的變量名,因此'_'將在此語句後保存對索引的引用。還要注意,__with python3__你可以將多個值解壓縮到一個列表中,也就是說,如果'min'返回了三個或更多的值而不是兩個,而你只想存儲第一個值,你可以使用'minval,* ignore = min(... )'。然後「忽略」將把剩下的值作爲一個列表。 –

-2

當然你可以做到!只需準備一個empy列表並使用它來接收不同數量的值。看看我的例子:

def foo(number): 
    if number < 0: 
     return "more","values","returned" 
    else: 
     return "single value" 

num = 5 
myList = foo(num)