一个对编码有所追求的人,想必被些问题困扰过。由于这些问题很晦涩,多种写法都是等价的,很少人会把它摆上台面认真的讨论,下面我来分享一下我的思索。
一个函数只应有一个 return 吗?——即对又错。没有意外情况只应有一个 return,意外情况要提前 return (导致多个 return )。举例:
students = dict(...)
# 正确的写法
def get_studen_age(studen_name): # 需求:若学生不存在返回-1
student = students.get(studen_name, None)
if student is None: # 意外情况
return -1
student.access_count += 1 # 需求:增加访问计数
return student.age
# 错误的写法[1]
def get_studen_age(studen_name):
student = students.get(studen_name, None)
if student is None: # 意外情况
return -1 # 错误情况应该尽早返回,代码可读性更佳
else:
student.access_count += 1
return student.age
# 错误的写法[2]
def get_studen_age(studen_name):
student = students.get(studen_name, None)
if student is None: # 意外情况
student_age = -1
else:
student.access_count += 1
student_age = student.age
return student_age # 错上加错,只有一个 return,营造没有错误情况的假象
什么时候应该提前 return,什么时候应该用 else 语句?——正如上面的例子所说,意外情况才要提前 return,否则写在 else 语句里。这又引入了另一个问题:怎么定义意外情况?有一个衡量的方法:if 条件... : [THEN] else [ELSE] 如果在普遍情况下[THEN]部分和[ELSE]部分执行的频度一致,说明没有意外情况,否则[THEN]部分和[ELSE]部分两者中执行频度较低的一方可判定为意外情况(通常为错误处理)。举例:
# 正确的写法
def min(a, b):
if a < b:
r = a
else:
r = b
# 普遍情况下[r = a]和[r = b]执行的频度(运行的机会)是一致的,这里没有意外情况
return r
# 错误的写法
def min(a, b):
if a < b:
return a # 这里不该应该是意外
return b
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.