草草的看了一遍,有些设计代码讲解地方由于个人层次不及,尚不能理解。python
基本
# 处理不一样版本的包名不一样,或者使用兼容包模拟另外一个包
try:
import functionXX
except ImportError:
import python2_functionXX as functionXX
# 处理2和3不一样包引入,设置能够预设2to3的兼容方案
import sys
if sys.version < "3":
import python2_functionXX as functionXX
else:
import functionXX
变量与类型
- Python是动态类型的语言,变量没有一个固定的类型。变量被实现为对象的指针。
- 复用变量名对代码效率提高没有任何帮助
- 一个变量只赋值一次是良好的实践
- 变量命名示例:item_string = "sb" \n item_list= [250,520]
- 可变类型:容许in-place改变对象的内容,例如列表和字典,都提供了append()或者pop()等变动自身的方法
- 可变类型不能用做字典的键,由于字典在键存储时使用了哈希方式,不容许键发生变化
- 字符串是不可变类型
-
字符拼接:apache
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) # 最佳风格
文档
内部
- 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版本,该版本修复了若干bug
- PyPy 是Python的一个纯Python实现。使用PyPy代码不须要任何改动,就能运行得更快。
- future.concurrent 这个包装了threading和mutliprocessing,用起来方便,可是性能略差。(我的见解)
数据序列化
- 将结构数据转化为可以被共享或者存储的格式,保留必要的信息传输数据的接收端(或者从存储中读取数据时)可以在内存中重建对象
- 可让被序化的数据占用最小化,便于最小化磁盘需求或者网络带宽需求
- pickle模块在遇到错误和恶意结构的数据时是不安全的,不要使用pickle对来源不明的数据进行反序列化
- 跨语言序列化可使用谷歌的protobuf
网络编程
- asyncio 提供异步事件循环来管理与非阻塞套接字或者队列通讯,以及任意用户定义的协程。asyncio目前仍不成熟。临时性的存在于标准库中
- gevent 因轻量,与底层C库libev紧耦合,性能很高,而被普遍使用
- pika 提供一个清凉的AMQP客户端,用于链接RabbitMQ或者其余消息代理