2012-09-30 37 views
0
import random 

def some_function(): 
    example = random.randint(0, 1) 
    if example == 1: 
     other_example = 2 
    else: 
     return False 
    return example, other_example 

有了這個例子,有可能返回一個或兩個變量。通常,對於一個變量,我會使用var = some_function()而兩個,var, var2 = some_function()。我怎麼知道函數返回了多少個變量?如何從函數中檢索所有返回的變量?

+0

python version? –

+0

我正在使用Python 2.7.3。 – user1447941

回答

2

嘗試這樣:

>>> lis=(1,)[:2] #just one value, 
>>> lis 
(1,) 


>>> lis=(1,2)[:2] #two values 
>>> lis 
(1, 2) 


>>> lis=(1,2,3,4,5)[:2] #any number of values 
>>> lis 
(1, 2) 

# used [:2] here, because you only expect a maximum of 2 values 
# use [:] to collect any number of values     

但是這種方法唯一的問題是,你需要在每一個return語句返回tuple, 所以return False使用iter()成爲return False,

,這也期望你總是返回一個元組或任何可迭代的:

>>> ret=((1,)) 
>>> ret=iter((1,)) 
>>> a,b=ret.next(),list(ret)[:1] #used [:1] coz we need to store only 2 elements 
>>> a,b 
(1, []) 


>>> ret=iter((1,2)) 
>>> a,b=ret.next(),list(ret)[:1] 
>>> a,b 
(1, [2]) 

>>> ret=iter((1,2,3,4)) 
>>> a,b=ret.next(),list(ret)[:1] 
>>> a,b 
(1, [2]) 
2

沒有辦法確定返回單個tuple的函數和返回多個非元組值的函數之間的區別。如果您知道該函數不返回tuple,雖然,那麼你可以使用此代碼來檢查多個返回值:

return_val = some_function() 
if isinstance(return_val, tuple): 
    # number of returned values is len(return_val) 
    if len(return_val) == 2: 
     var, var2 = return_val 
else: 
    # returned a single non-tuple item 
    var = return_val 

來處理這種情況的最好辦法,然而,就是寫功能,唐在不同情況下不會返回不同數量的值。相反,你可以做類似...

def some_function(): 
    example = random.randint(0, 1) 
    if example == 1: 
     other_example = 2 
    else: 
     return False, None 
    return example, other_example 

...因此該函數總是返回兩個值。另外,您也可以隨時返回一個元組,只是檢查元素在元組數(所以例如,返回一個空的元組()或用單假值(False,)元組。

1
var_returned = some_function() 
num_vars = len(vars_returned) if (not vars_returned == False) else 0 

三元然後!這是可以做到更短

vars_returned = 7, 2 
num_vars = len(vars_returned) if vars_returned else 0 
print(num_vars) 
# 2 

vars_returned = False 
num_vars = len(vars_returned) if vars_returned else 0 
print(num_vars) 
# 0 
+0

這將失敗的單個返回值(例如'TypeError:'bool'object is not iterable'),如果返回的值不是可迭代的(並且如果它是一個長度大於1的迭代將給出錯誤的答案)。 – Amber

+0

很對,現在已經修好了。 – zeffii

1

爲什麼不試試這個:

import random 

def some_function(): 
    example = random.randint(0, 1) 
    if example == 1: 
     other_example = 2 
    else: 
     return() 
    return example, other_example 

這樣,你將永遠有一個元組的RET urn值,但是當你想要的時候元組將會測試爲False。像這樣使用它:

answer = some_function() 
if answer: 
    var1, var2 = answer 
1

讓一個函數返回顯着不同類型的函數是不好的做法。通常,如果函數返回元組,它將始終返回元組,並且它們始終具有相同數量的項目,除非它們返回None。原因正是促使你提出這個問題的原因:很難解釋給定的回報價值。無論你在哪裏調用你的函數,你都有解碼返回值的開銷。任何文檔都必須解釋每種情況下的期望輸出。

有很多合理的選擇。您可以返回在某些情況下包裝數據的對象,或者字典或collections.namedtuple。或者,對於大多數現實世界的代碼,您可以沿着不同的線更容易理解的功能。