Python中max()函数处理元组生成器的运行原理咨询
关于Python中max()函数处理生成器与元组比较的原理解答
我正在阅读Python教程,想请教一个问题:已知max()函数常接收列表作为参数,以下代码却能正常运行,请问其原理是什么?此前我并不了解max()可以处理元组,观察结果似乎它只比较元组的第一个元素。
>>> class student: ... def __init__(self, gpa, name): ... self.gpa = gpa ... self.name = name ... >>> graduates = [student(1.0, "nick"), student(2.0, "geoff")] >>> m = max((s.gpa, s.name) for s in graduates) >>> print(m) (2.0, 'geoff')
原理说明
- max()函数的参数要求是可迭代对象,不是只能接收列表。你代码里的
(s.gpa, s.name) for s in graduates是生成器表达式,属于可迭代对象,所以max()可以直接遍历它来找到最大值。 - Python中元组的比较规则是按元素顺序依次对比:先比较第一个元素,若能分出大小,直接得出结果,不会继续比较后续元素;只有当第一个元素相等时,才会比较第二个元素,以此类推。你例子里两个元组的第一个元素(gpa)分别是1.0和2.0,2.0更大,所以直接返回对应的元组,不会再去对比名字。
- 如果你的需求是获取gpa最高的student对象,而非元组,更推荐用key参数简化代码:
max(graduates, key=lambda s: s.gpa),这样返回的是完整的student实例,更方便后续操作。
内容的提问来源于stack exchange,提问作者Nick
相关产品推荐
相关产品推荐

