在Python里,普通一维列表遍历容易理解,但嵌套列表按姓名查成绩时,函数究竟该return结果还是直接print输出,容易混淆。本文基于一个学生成绩查询示例,说明两种常见写法差异、调用方式和边界处理。示例数据student_score = [[1, 'Lily', 95], [2, 'Bob', 83], [3, 'Tom'], [4, 'Lis', 89]],子列表结构为[编号,姓名,成绩],其中Tom没有第三项,因此访问student[2]时会触发IndexError。
方式一:函数只负责返回数据,print交给调用方
函数get_grade(student_score,name)遍历student_score,如果student[1]等于name,尝试取student[2]作为grade并return grade。若子列表缺少成绩项,捕获IndexError并return '找不到该同学的成绩'。遍历结束仍未匹配,return '找不到该同学的信息'。调用时用a=get_grade(...); print(a)输出。适用于需要复用返回值、测试断言、后续计算的场景。- def get_grade(student_score, name):
- for student in student_score:
- if student[1] == name:
- try:
- grade = student[2]
- return grade
- except IndexError:
- return '找不到该同学的成绩'
- return '找不到该同学的信息'
- student_score = [[1, 'Lily', 95], [2, 'Bob', 83], [3, 'Tom'], [4, 'Lis', 89]]
- a = get_grade(student_score, 'Tom')
- print(a)
- b = get_grade(student_score, '234')
- print(b)
- c = get_grade(student_score, 'Lily')
- print(c)
复制代码 对于Tom返回“找不到该同学的成绩”;对于234返回“找不到该同学的信息”;Lily返回95。
方式二:函数内部直接print,再用return结束流程
同样遍历和匹配,命中后取grade,print('{}的成绩是:{}'.format(name, grade)),然后return。若IndexError,print('找不到该同学的成绩')并return。循环外print('找不到该同学的信息')并return。调用时不需要print返回值,直接get_grade(...)。这适合只关心控制台输出的脚本,但不便于获取结果做二次处理。- def get_grade(student_score, name):
- for student in student_score:
- if student[1] == name:
- try:
- grade = student[2]
- print('{}的成绩是:{}'.format(name, grade))
- return
- except IndexError:
- print('找不到该同学的成绩')
- return
- print('找不到该同学的信息')
- return
- student_score = [[1, 'Lily', 95], [2, 'Bob', 83], [3, 'Tom'], [4, 'Lis', 89]]
- get_grade(student_score, 'Bob')
- get_grade(student_score, 'Tom')
- get_grade(student_score, '234')
复制代码 输出分别为Bob的成绩是83,Tom找不到成绩,234找不到信息。
对比与适用场景
方式一函数返回数据,调用方控制输出,适合模块化、复用和测试;方式二函数耦合打印,调用简单,但返回值不可用,适合临时脚本或一次性查看结果。IndexError的原因是Tom子列表只有两个元素,访问student[2]越界。两种方式都基于Python基础语法,无需额外库。实际写脚本时,如果需要继续处理成绩值,建议采用方式一;如果只是运行后看控制台结果,可以采用方式二。注意两种写法都通过return终止函数流程,避免后续分支继续输出。 |