我已经写了四五年的Python了,我一直在用我的“强迫症”来维持我的代码质量。除了谷歌的Pythoncodespecification之外,我从来没有看过类似的书。偶然看到这样一本书,看完觉得还不错,就简单记下了。想学习类似知识,又懒得看全书的朋友,可以参考一下。一:入门建议1.理解Pythonic概念——详见《Python中的《Python之禅》。变量名太长等。有时候,长变量名会使代码更易读。(2)深入学习Python相关知识,如语言特性、库特性等,如Python的演进过程等。深入学习一两个业界公认的Pythonic代码库,如如Flask等建议3:了解Python与C的区别,如缩进与{}、单引号与双引号、三元运算符?、Switch-Case语句等建议4:在代码中适当添加注释建议5:适当增加空行,使代码布局更合理建议6:编写函数的4个原则(1)函数设计要尽量短,嵌套层次不要太深(2)函数声明要be合理、简单、易用(3)函数参数设计要考虑向后兼容(4)一个函数只做一件事,尽量保证函数粒度的一致性建议七:将常量集中在一个文件中,常量南e尽量全部使用大写字母2:编程习语建议8:使用assert语句发现问题,但要注意,assert断言会影响效率建议9:不建议在交换值的时候使用临时变量,直接a,b=b,a建议十:充分利用惰性求值(Lazyevaluation)的特点,避免不必要的计算建议使用type进行类型检查,因为有时候type的结果不一定可靠。如果有需要,建议使用isinstance函数,而不是建议13:做除法前尽量将变量转为浮点型(Python3不需要考虑)。建议14:警惕eval()函数的安全漏洞,有点类似于SQL注入建议15:使用enumerate()同时获取序列迭代的索引和值建议16:区分适用场景of==andis,尤其是比较字符串等不可变变量时(详见注释)建议17:尽量使用Unicode。Python2编码很头疼,Python3不用想太多。建议18:构建合理的包层次结构来管理Module3:基本使用建议19:谨慎使用from...import语句,防止命名空间污染建议20:首先使用绝对导入来导入模块(相对导入在Python3中已被移除)建议21:i+=1不等于++i。在Python中,++i前面的加号只表示正,不是建议22:习惯使用with自动关闭资源,尤其是文件读写建议23:使用else子句简化循环(异常处理)建议24:遵循异常处理的一些基本原则(1)注意异常的粒度,尽量在try块中写尽可能少的代码(2)谨慎使用单独的except语句,或者exceptException语句,但是定位具体异常(3)注意异常捕获的顺序,在合适的层级处理异常(4)使用更友好建议25:避免finally中可能出现的陷阱建议26:深入理解None,并正确判断对象是否为空。Python中以下数据会被判断为空:建议27:对连接字符串使用join函数代替+操作建议28:格式化字符串对象和不可变对象时尽量使用.format函数代替%形式,特别是作为函数参数建议30:[]、{}和():容器初始化的一致形式。使用列表理解可以使代码更清晰、更高效。建议31:给函数传递参数,既不是按值也不是按引用,而是传递对象或对象引用。建议32:警惕默认参数的潜在问题,尤其是默认参数为可变对象时的建议33:在函数中谨慎使用变长参数args和*kargs(1)这种使用过于灵活,使得函数签名不够清晰,可读性差(2)如果是因为函数参数的原因如果参数太多,为了简化变长参数的函数定义,那么一般可以重构函数,目的是为了可读性,而返回形式是字符串形式,具有很高的用户友好性和可读性;而repr是针对Python解释器或Python开发者的,其目的是准确,其返回值代表Python解释器内部定义(2)在解释器中直接输入变量,默认调用repr函数,而print(var)默认调用str函数。(3)repr函数的返回值一般可以通过eval函数恢复。(4)两者分别是调用对象的内置函数str__()和__repr()建议35:区分静态方法staticmethod和类方法classmethod的使用场景4:库建议36:掌握基本用法ofstrings建议37:选择sort()和sorted()函数“sort()”就地对列表进行排序,因此无法对元组等不可变类型进行排序。"sorted()可以对任何可迭代类型进行排序,而不改变原始变量本身。建议38:使用复制模块深拷贝对象,区分浅拷贝和深拷贝ConfigParser建议41:使用argparse模块处理命令行参数建议42:使用pandas处理大型CSV文件》Python本身提供了CSV文件处理模块,并提供了reader和writer等函数。》pandas可以提供分块、合并处理等,适用于数据量较大的情况,对二维数据进行操作更方便。建议43:使用ElementTree解析XML建议44:了解pickle模块的优缺点《优点:接口简单,全平台通用,支持的数据类型广泛,可扩展性强》缺点:数据操作的原子性不强保证,并且存在安全问题。不同语言不兼容建议45:序列化JSON模块的另一种选择:加载和转储操作建议46:使用traceback获取堆栈信息建议47:使用logging记录日志信息建议48:使用threading模块编写多线程程序建议49:使用Queue模块让多线程编程更安全建议5:设计模式建议50:使用模块实现单例模式建议51:使用mixin模式让程序更灵活建议52:使用发布-订阅模式实现松耦合建议53:使用状态模式美化代码6:内部机制建议54:理解内置对象建议55:init__()不是构造方法,理解__new()和它的区别建议56:理解变量查找机制,即scope>localeffectDomain"GlobalScope"NestedScope"Built-inScope建议57:为什么需要self参数su建议58:理解MRO(MethodResolutionOrder)和多重继承建议59:理解Descriptor机制建议60:getattr__()和_getattribute()方法的区别建议61:使用更安全的属性建议62:Mastermetaclasses建议63:熟悉Python对象协议建议64:使用运算符重载实现中缀语法建议65:熟悉Python的迭代器协议建议66:熟悉Python的生成器建议67:基于生成器的协程和greenlets,了解协程的区别,多-线程、多进程建议68:了解GIL的局限性建议69:对象管理和垃圾回收7:使用工具辅助项目开发建议70:从PyPI安装第三方包建议71:使用pip和yolk安装和管理包75:使用测试驱动开发(TDD)来改进代码的可测试性建议76:使用Pylint检查代码风格“代码风格审查”代码错误检查“查找重复和不合理的代码以便于重构”高度可配置和可定制“支持集成各种IDE和编辑器”可以生成基于UML图关于Python代码》可以结合Jenkins等持续集成工具支持自动代码审查建议77:进行高效的代码审查建议78:将包发布到PyPI8:性能分析和优化建议79:理解代码优化建议80的基本原则:使用性能优化工具建议81:使用cProfile定位性能瓶颈建议82:使用memory_profiler和objgraph分析内存使用情况建议83:尝试降低算法复杂度建议84:掌握循环优化的基本技巧》减少循环内部计算《将显式循环改为隐式循环,当然是以牺牲代码可读性为代价的》尝试在循环中引用局部变量》重点关注内部嵌套循环建议85:使用生成器提高效率建议86:使用不同的数据结构优化性能建议87:充分利用set的优势建议88:使用multiprocessing模块克服GIL缺陷建议89:使用线程池提高效率建议90:使用C/C++模块扩展提高性能建议91:使用Cythonb编写扩展模块
