任务
你有一个列表L,还有一个索引号i,你希望当i是L,的有效索引时获取L[i],若不是有效索引,则返回一个默认值v。如果L是字典,可以使用L.get(i,v)来满足需求,可是列表并没有 get这个方法。
解决方案
很明显,我们得自己写个函数,在这里,最简单直接的方法就是最好的方法
def list_get(L,i,v = None):
if -len(L) <= i < len(L): return L[i]
else: return v
讨论
解决方案中的函数根据 Python 的索引规则来检査i的有效性:有效索引只能在大于等于-len(L)和小于 len(L)这个区间中。但如果所有传递给 list_get 函数的参数i都是有效的索引,你可能会喜欢另外一种方式:
def list_getegfp(L,i,v = None):
try:return L[i]
except IndexError:return v
但是,除非传递给此函数的索引绝大多数都是有效索引,否则这个函数(通过某些测试工具测量)将会比解决方案中的list_get函数慢4倍。因此,这个“获得原谅总是比获得许可容易(easier to get forgiveness than permission,EGFP)”的函数,虽然更具有Python 的精神和风格,但在这种特殊的情况下,并不值得推荐,我还试过几个看上去更漂亮、更复杂和更迷惑人的方法,不过,除了更加难于解释和理解之外,它们无一例外地比那个朴实无华的list_get 函数慢。这里给出一个通用的准则:当你写 Python程序时,应当倾向于清晰和可读性,而不是紧凑和精炼–选择简单,而不是精巧。只要你坚持这么做,你常常会发现你的代码跑得更快,而且也更强健,更易于维护。在真实世界中,对于 99.9%的应用而言,遵循这个原则要比获得一点速度提升重要的多。