作者:IGI,网易游戏运维专家,10年运维老司机,负责网易游戏私有云平台的运维工作,专注于运维技术能力的深入打磨,专治运维界各类疑难杂症,拥有强大的故障分析能力及丰富的故障解决经验
随着互联网技术的发展,现如今信息爆炸越来越明显,大家在工作中需要接触及学习的技术点也是越来越多.在这种大背景的情况下,以号称「简洁」著称的Python语言自然而然火了起来.
那是不是只要使用Python来写代码,就算「简洁」编码呢?非也,即使用同样的语言,代码的「简洁」程度也是因人而异,本文将结合生产环境中常见的代码写法进行讲解,给大家拨开迷雾见云彩,看透其中的奥秘.
何谓「简洁」编码?在开始前,先问大家一个问题,什么样的代码算得上「简洁」?
这类问题,其实也隐藏在我们的日常生活中,这里我直接举个例子,大家请看下面三句话
1.家有千金,行止由心.2.形若槁骸,心如死灰.3.君莫欺我不识字,人间安得有此事.
大家看了上面三句话的第一眼是什么感觉?用了古文的写法,表达也非常到位,可是大家细想,在理解这三句话真正含义的时候,是不是脑海里面有过短暂的消化和转化的时间?大家再看以下三句话,与上面三句话表达出同样的意思.
1.有钱,任性2.心好累3.我读书少,你不要骗我
是不是一眼就能抓住这几句话的含义?
简短,直观,易于理解,这就是「简洁」,而符合这种特性的代码,则为「简洁」的编码
简洁代码的思路讲解接下来,我将以下工作中常见的代码写法来讲解,如何简洁化我们的python代码
注:以下代码样例仅针对最常用的python2版本
1.使用dict的默认操作符可以方便的获取到key,减少不必要的dict.keys()和dict.has_key()操作代码样例1
代码样例2
2.当需要同时获取字典的key和value时,可以使用iteritems迭代器代码样例3
3.文件的默认操作符也是类似的,在循环时可以直接使用代码样例4
小贴士1:如果类型支持,就直接使用默认迭代器和操作符,例如列表,字典和文件.默认操作符和迭代器简单高效,没有额外的方法调用.
4.尽可能使用隐式布尔值条件语句代码样例5
代码样例6
代码样例7
小贴士2:
Python会在条件语句上下文中求布尔值.按简单的直觉来讲,就是所有的「空」值都被认为是false.因此0,None,[],{},“”都被认为是false.使用Python布尔值的条件语句更易读也更不易犯错.大部分情况下,也更快.
永远不要用==或者!=来比较None和布尔值,直接使用ifx:代替,如果需要区分False和None,可以使用ifxisNone:这样的语句.
5.利用set和list简化多个条件语句的值判断代码样例8
代码样例9
6.利用locals函数或是globals函数可以更方便的完成多个变量的检查代码样例10
7.利用条件语句的取反(ifnot),可以尽可能的减少复杂逻辑中的代码嵌套层级样例11改进前
样例11改进后
写出「简洁」Python代码的学习资料上面举了11个例子,让大家有了真实的「简洁」思路,那这些思路从何而来,以下是我认为需要反复阅读并理解吸收的知识
1.《Python之禅》相信很多同学在学习Python的时候,也看过箸名的Python之禅,像上面的样例11,改进前就是违背了扁平胜于嵌套的信条,我们可以多在review自己代码时,思考一下代码是不是违背了这些信条
优美胜于丑陋(以编写优美的代码为目标)明了胜于晦涩(优美的代码应当是明了的,命名规范,风格相似)
简洁胜于复杂(优美的代码应当是简洁的,不要有复杂的内部实现)
复杂胜于凌乱(如果复杂不可避免,那代码间也不能有难懂的关系,要保持接口简洁)
扁平胜于嵌套(优美的代码应当是扁平的,不能有太多的嵌套)
间隔胜于紧凑(优美的代码有适当的间隔,不要奢望一行代码解决问题)
可读性很重要(优美的代码是可读的)
即便假借特例的实用性之名,也不可违背这些规则(这些规则至高无上)
不要包容所有错误,除非你确定需要这样做(精准地捕获异常,不写except:pass风格的代码)
当存在多种可能,不要尝试去猜测,而是尽量找一种,最好是唯一一种明显的解决方案(如果不确定,就用穷举法)
虽然这并不容易,因为你不是Python之父(这里的Dutch是指Guido)
做也许好过不做,但不假思索就动手还不如不做(动手之前要细思量)
如果你无法向人描述你的方案,那肯定不是一个好方案;反之亦然(方案测评标准)
命名空间是一种绝妙的理念,我们应当多加利用(倡导与号召)
注:《Python之禅》是年的Python改进提案,编号为PEP20。以禅诗、偈颂的形式。这个是一位老资格的Python人TimPeters将Python语言创始人GuidovanRossum的Python设计指导原则简明扼要地归纳而来,是我们学好python并写出高质量python代码的关键点,每一个Python开发者都应该反复阅读、理解、记忆、运用的信条.
2.PEP8和GooglePythonStyleGuildPEP8一定要读几次,有些规范记不住没关系,可以多使用pylint检查工具来给检查代码,GooglePythonStyleGuild也是非常值得大家熟读的
PEP8: