草草的看了一遍,有些设计代码讲解地方因为我的层次不及,尚不能理解。

基本留白胜于紧凑 |> 一行只写一条语句明确胜于隐晦 |> 判断代码写的是否优雅的一个规则是:其他开发者是否只阅读函数的首行和末行就能理解程序的作用错误不应被默默的忽略,除非你明确地忽视 |> 没有指定任何异常类型的except语句将捕获所有的异常,会屏蔽键盘发出的KeyboradInterrupt,使得ctrl +c无法被正确响应与*args的理由类似,kwargs这类强大的技术应该用在真正需要之处。如果函数的意图可以通过更简单更清晰的结构来充分表达,那么不应该使用这类技术。相比较于运行速度,Python更在意代码的可读性,Python把用户友好看的比性能更重函数Python函数应具有如下特点易读:函数名称和参数都无需解释易改: 添加新的关键字参数不会破坏代码其他参数尽量在移除返回函数结果,函数体的返回点越少越好,当函数不能正确执行时,最好返回FalseNone 一个函数只做一件事类使用@property的目的是将函数与数据相分离自觉的编程习惯Python中没有private关键字私有属性和实现细节的主要约定是为所有的内部变量增加“_”前缀任何不开放给外部使用的方法或者属性,都应带下划线前缀随时都可以讲私有属性公有化,但是把公有化属性私有化会困难很多访问字典时,使用key in dict的判断语法而不是dict.has_keys(),还可以使用dict.get()处理键值为空时的默认值访问列表或者数组时,使用enumerate()来生成元素位置,比手动维护一个 i += 1 in for 更pythonic

如果解包是需要赋值,单又不需要其中的某个值,可以使用双下划线(__)来代替此位置的值。双下划线比单下划线 更优

集合set比列表list的速度更快无法使用with结构时,可以使用try: do xx \nfinnally: do yy来代替模块与包使用import *的代码更难阅读,依赖也难以区分如果包内的模块和子包不需要共享任何代码,那么init.py文件留空是最佳实践。依赖引入的兼容性处理

# 处理不同版本的包名不同,或者使用兼容包模拟另一个包try: import functionXXexcept ImportError: import python2_functionXX as functionXX# 处理2和3不同包引入,设置可以预设2to3的兼容方案import sysif sys.version < "3": import python2_functionXX as functionXXelse: import functionXX变量与类型Python是动态类型的语言,变量没有一个固定的类型。变量被实现为对象的指针。复用变量名对代码效率提升没有任何帮助一个变量只赋值一次是良好的实践变量命名示例:item_string = "sb" \n item_list= [250,520]可变类型:允许in-place改变对象的内容,例如列表和字典,都提供了append()或者pop()等变更自身的方法可变类型不能用作字典的键,因为字典在键存储时使用了哈希方式,不允许键发生变化字符串是不可变类型

字符拼接:

sb = "me"sb2 = "you"string = "%s %s " %(sb,sb2) # 官方废弃string = "{},{}".format(sb,sb2)string = "{0},{1}".format(sb,sb2) # 与C#的方式略有类似string = "{people1},{people2}".format(people1=sb,people2=sb2) # 最佳风格文档sphinx是最流行的Python文档工具内部Python调用栈包含当前Python解释器正在执行的指令。如果函数f()调用了函数g(),那么函数f()会先入栈。待g()被调用时则会入栈压到f()的上面。当g()返回时,它从栈中被弹出,f()会从原来中断的位置继续执行。代码发布一般会使用PyInstaller去打包程序,PyInstaller会将程序用到的所有Python库都放入dist文件夹,所以在分发可执行文件时,需要分发整个dist文件夹命令行应用argparse替代了已经废弃的optparse模块,是Python标准库内置的包。最优使用docopt使用函数或者文件的doc位置设置命令行交互。click使用注释器的方式来实现命令交互编写clint可以着色和便利的处理缩进问题GUI应用tkinter库所有依赖已经捆绑进Python发行版PyObjC可以提供OC接口,制作MacOS的专用程序WSGI服务器相比较于传统的Web服务器(nginx,apache),wsgi服务器性能好,资源少。比较流行的的服务器有gunicorn,其使用配置比较简单代码管理和改进持续集成,tox |> 打包,测试,部署,Travis-CI |> 分布式持续集成,可与GitHub无缝集成并评论Pull Request与Jenkins API进行交互最常用的Python工具是python-jenkins服务器自动化:ssh |> Ansible |> 最大的优势是不要求在客户端上安装Python以外的任何东西系统监控: RawSystemInfo |> psutil > glances (扩展版的top,比较综合,信息全)系统任务管理:ssh |> Fabric速度优化threading 多线程,使用多线程,当Python内核发现某个线程正阻塞在I/O读写上时,会切换到另一个线程来使用处理器,直到这个线程也被阻塞和结束mutliprocessing 多进程,但是不同进程之间的通信需要注意数据的共享安全subprocess用于发起系统调用,推荐Python2用户使用subprocess32版本,该版本修复了若干bugPyPy 是Python的一个纯Python实现。使用PyPy代码不需要任何改动,就能运行得更快。future.concurrent 这个包装了threading和mutliprocessing,用起来方便,但是性能略差。(个人看法)数据序列化将结构数据转化为能够被共享或者存储的格式,保留必要的信息传输数据的接收端(或者从存储中读取数据时)能够在内存中重建对象可以让被序化的数据占用最小化,便于最小化磁盘需求或者网络带宽需求pickle模块在遇到错误和恶意结构的数据时是不安全的,不要使用pickle对来源不明的数据进行反序列化跨语言序列化可以使用谷歌的protobuf网络编程asyncio 提供异步事件循环来管理与非阻塞套接字或者队列通信,以及任意用户定义的协程。asyncio目前仍不成熟。临时性的存在于标准库中gevent 因轻量,与底层C库libev紧耦合,性能很高,而被广泛使用pika 提供一个清凉的AMQP客户端,用于连接RabbitMQ或者其他消息代理