如果是上面这种写法,你需要找到所有调用 latlon_to_address 的地方,补上多出来的这个变量,否则 ValueError: too many values to unpack 就会找上你:
country, province, city, district = latlon_to_address(lat, lon) # 或者使用 _ 忽略多出来的返回值 country, province, city, _ = latlon_to_address(lat, lon)对于这种可能变动的多返回值函数,使用 namedtuple/dict 会更方便一些。当你新增返回值时,不会对之前的函数调用产生任何破坏性的影响:
# 1. 使用 dict def latlon_to_address(lat, lon): return { 'country': country, 'province': province, 'city': city } addr_dict = latlon_to_address(lat, lon) # 2. 使用 namedtuple from collections import namedtuple Address = namedtuple("Address", ['country', 'province', 'city']) def latlon_to_address(lat, lon): return Address( country=country, province=province, city=city ) addr = latlon_to_address(lat, lon)不过这样做也有坏处,因为代码对变更的兼容性虽然变好了,但是你不能继续用之前 x, y = f() 的方式一次解包定义多个变量了。取舍在于你自己。
5. 控制单个函数内的变量数量人脑的能力是有限的,研究表明,人类的短期记忆只能同时记住不超过十个名字。所以,当你的某个函数过长(一般来说,超过一屏的的函数就会被认为有点过长了),包含了太多变量时。请及时把它拆分为多个小函数吧。
6. 及时删掉那些没用的变量这条原则非常简单,也很容易做到。但是如果没有遵守,那它对你的代码质量的打击是毁灭级的。会让阅读你代码的人有一种被愚弄的感觉。
def fancy_func(): # 读者心理:嗯,这里定义了一个 fancy_vars fancy_vars = get_fancy() ... ...(一大堆代码过后) # 读者心理:这里就结束了?之前的 fancy_vars 去哪了?被猫吃了吗? return result所以,请打开 IDE 的智能提示,及时清理掉那些定义了但是没有使用的变量吧。
7. 能不定义变量就不定义有时候,我们定义变量时的心理活动是这样的:『嗯,这个值未来说不定会修改/二次使用』,让我们先把它定义成变量吧!
def get_best_trip_by_user_id(user_id): user = get_user(user_id) trip = get_best_trip(user_id) result = { 'user': user, 'trip': trip } return result其实,你所想的『未来』永远不会来,这段代码里的三个临时变量完全可以去掉,变成这样:
def get_best_trip_by_user_id(user_id): return { 'user': get_user(user_id), 'trip': get_best_trip(user_id) }没有必要为了那些可能出现的变动,牺牲代码当前的可读性。如果以后有定义变量的需求,那就以后再加吧。
结语碎碎念了一大堆,不知道有多少人能够坚持到最后。变量作为程序语言的重要组成部分,值得我们在定义和使用它时,多花一丁点时间思考一下,那样会让你的代码变得更优秀。
这是『Python 工匠』系列文章的第一篇,不知道看完文章的你,有没有什么想吐槽的?请留言告诉我吧。
问答
如何从变量名中获取字符串?
相关阅读
鹅厂优文 | ReactJS一点通
开发效率太低?您可能没看这篇文章
用CSS画小猪佩奇,你就是下一个社会人!
【每日课程推荐】机器学习实战!快速入门在线广告业务及CTR相应知识