2013-02-11 80 views
0

我想分析和理解一個python程序實現了一個簡單的map-reduce想法。我在理解一些代碼時遇到了一些困難。在Python中返回多個值

Person = namedtuple('Person', ['name', 'gender', 'age', 'height']) 

persons = [ 
    Person('mary', 'fem', 21, 60.2), 
    Person('suzy', 'fem', 32, 70.1), 
    Person('jane', 'fem', 27, 58.1), 
    Person('jill', 'fem', 24, 69.1), 
    Person('bess', 'fem', 43, 66.6), 
    Person('john', 'mal', 25, 70.8), 
    Person('jack', 'mal', 40, 59.1), 
    Person('mike', 'mal', 42, 60.3), 
    Person('zack', 'mal', 45, 63.7), 
    Person('alma', 'fem', 34, 67.0), 
    Person('bill', 'mal', 20, 62.1), 
] 

def height_by_gender_and_agegroup(p): 
    key = p.gender, p.age //10 
    val = p.height 
    return key, val 

功能height_by_gender_and_agegroup(p)似乎每個p返回兩個值。它似乎返回

<key,val> where key is p.gender and val is p.height 
<key,val> where key is p.age and val is p.height 

我一直在用C和C++編程,但是對於python來說還是很新的。我的問題是如何通過值在Python中返回多對值。即假設這就是這個代碼正在做的事情。如果是,我該如何處理返回值?

下面的答案似乎傳達了這樣一個事實,即在Python中返回一個鍵 - 值對類似於返回一個具有兩個成員的結構。我理解該部分。

key = p.gender, p.age //10 

我的問題是上述line.Key似乎取兩個值p.genderp.age。如果是這樣的話我們需要有兩套<key,value>返回P. 的每個值這是如何工作的?

+1

我建議你通過啓動

>>> def f(): return 1, 2 ... >>> type(f()) <type 'tuple'> 

如同任何元組,則可以通過下標或以指定成員訪問其值閱讀[相關的Python教程](http://docs.python.org/2/tutorial/datastructures.html#tuples-and-sequences)。 – flup 2013-02-11 18:47:12

回答

2

它返回的是兩個項目的tuple。 (它基本上相當於在C中返回一個帶有兩個字段的結構)。您可以解壓返回的元組是這樣的:

key, val = height_by_gender_and_agegroup(person) 

它可以幫助這樣想起來:

def height_by_gender_and_agegroup(p): 
    key = p.gender, p.age //10 
    val = p.height 
    return (key, val) # note the optional parentheses to denote a tuple 

ret = height_by_gender_and_agegroup(person) 
key = ret[0] 
val = ret[1] # "key, val =" is just a shortcut for this 

因爲你的情況主要有兩個值,可以解壓進一步:

(gender, age), val = height_by_gender_and_agegroup(person) 

或者如果你喜歡:

key, val = height_by_gender_and_agegroup(person) 
gender, age = key 
+0

感謝您的解釋。請參閱更新的問題。 – liv2hak 2013-02-11 18:58:21

+0

@ liv2hak:查看更新的答案 – 2013-02-11 19:19:52

2

該函數實際上返回tuple

>>> first, second = f() 
>>> second 
2 
2

你可以說:

k,v = height_by_gender_and_agegroup(p)