前言
本文主要给大家介绍了在Python中return和finally共同存在的坑,以及填坑经验,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍吧。
初识 return
相信每一个用过Python函数的童鞋, 肯定会用过return语句, return顾名思义, 就是用来返回值给调用者, 例如:
def test():
a = 2
return a
s = test()
print s
# 输出结果
2
对于上面的结果, 相信大家都不会感到意外, 那么加大点难度, 如果在return语句还有代码呢? 那句代码会怎样呢?
def test():
a = 2
return a
s = 3
print s
s = test()
print s
# 结果是什么?
老司机肯定一眼就能看出结果, 但是对于尚在入门或者对return不很了解的童鞋, 可能就会懵逼了~ 后面的两句代码是否会被执行?
答案是: 不会执行
return正如它的名字那样, 当执行这句代码, 整个函数都会返回, 整个调用就算结束了~ 所以在return后面的代码, 都是不会被执行的!
也正因为这个特性, 所以有种编码规范叫early return的编码规范就被倡导
它的意思大概就是: 当条件已经满足返回时, 就马上返回
举个例子来说明:
def test():
a = 2
if a > 2:
result = 'more than'
else:
result = 'less than'
return result
s = test()
print s
上面的代码应该比较容易理解, 就是根据a的值, 来决定返回的result是什么. 这样的编码相信也是大部分童鞋喜欢用的, 因为这样比较符合我们直觉, 然而, 这样写似乎有点浪费, 因为当第一个判断结束了, 如果结果为真, 就应该返回more than, 然后结束函数, 否则肯定就是返回less than, 所以我们可以把代码调整成这样:
def test():
a = 2
if a > 2:
return 'more than'
else:
return 'less than'
s = test()
print s
甚至是:
def test():
a = 2
if a > 2:
return 'more than'
return 'less than'
s = test()
print s
结果都是和第一个写法是一样的! 第一次看到这样写法的童鞋, 可能会觉得比较难以接受, 甚至觉得可读性很差, 但是其实这样的写法, 我觉得反而会稍微好点. 因为:
- 运行的代码数少了, 调用方能更快得到结果
- 有利于减少嵌套的层数, 便于理解.
对于第2点在这需要解释下, 很多时候我们写得代码, 嵌套很深, 都是因为if/else的锅, 因为嵌套的if/else 比较多, 所以导致一堆代码都嵌套得比较深, 这样对于其他小伙伴, 简直就是灾难, 因为他们很可能在阅读这部分代码时, 就忘了前面的逻辑....
为了更加容易理解, 举个代码例子:
def test():
a = 2
if a > 2:
result = 'not 2'
else:
a += 2
if a < 2:
result = 'not 2'
else:
for i in range(2):
print 'test ~'
result = 'Target !'
return result
s = test()
print s
# 输出结果
test ~
test ~
Target !
代码简化优化版:
def test():
a = 2
if a > 2:
return 'not 2'
a += 2
if a < 2:
return 'not 2'
for i in range(2):
print 'test ~'
return 'Target !'
s = test()
print s
# 输出结果
test ~
test ~
Target !
这样对比这来看, 应该能更好地理解为什么说early return能够减少嵌套的层数吧~ 有疑问欢迎留言讨论~
谈谈深坑
刚才花了比较长的篇幅去介绍return, 相信看到这里, 对于return应该有比较基本的理解了! 所以来聊聊更加迷惑的话题:
当 return 遇上 try..finally, 会怎样呢?
如果刚才有认真看的话, 会注意到一句话, 就是:
return 代表整个函数返回, 函数调用算结束
但事实真的这样吗? 通常这样问, 答案一般都不是 ~~
先来看看例子:
def test():
try:
a = 2
return a
except:
pass
finally:
print 'finally'
s = test()
print s
可以猜猜这句print a会不会打印? 相信很多童鞋都想了一会, 然后说不会~ 然而这个答案是错的, 真正的输出是:
有木有觉得仿佛看见了新大陆, 在一开始的例子中, return后面的语句没有被执行, 但是在这里, 相隔那么远, 却依旧没有忘记, 这或许就是"真爱"吧!
然而就是因为这种"真爱", 总是会让一堆新老司机掉坑里..然后还丨"9d#"z+.."K9yl,y+9l`zh9cc9b&cTTSSz+[\. y.9odX[\. yi9l,yaz`&/SSycf.: #:/,y+]\][B[[OH+[BB`9.9$y.:+db9odi]\. K9...b[[y. z/&ab9id)9f.]\+:-*9l,y+kyd][9d# 9.*i)K9 9d#.yky`/9cc9k9gH9`9.m.#y+9k-*9)狈9n#9&9d#ayb,9k9&K9b*ygdzaBioy.."l,y+9aj:`yky.n#9&ykyk)9ki.h9% !ymg: )iy. 9kn+b{i9"ye)fz* 9.9`{,(,(i)/c.+ |