我正在尝试分析和理解一个python程序,它实现了一个简单的map-reduce概念。我在理解某些代码时遇到了一些困难。
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
我的问题在上面这一行.Key似乎有两个值p.gender
和p.age
。如果是这种情况,则需要为每个值返回两组<key,value>
P.
这是如何工作的?
答案 0 :(得分: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
答案 1 :(得分:2)
该函数实际上返回tuple。
>>> def f(): return 1, 2
...
>>> type(f())
<type 'tuple'>
与任何元组一样,您可以按下标或按顺序分配成员来访问其值:
>>> first, second = f()
>>> second
2
答案 2 :(得分:2)
你可以说:
k,v = height_by_gender_and_agegroup(p)