准备
版本选择
- 第一个话题是版本选择,是为了确定一下我们从哪里开始。我们主要使用 CPython(2.7.x)—— 最常见的发行版
- 如果有机会做 lucene / hadoop / hbase 这些 Java 界工具的相关工作,可以使用 Jython(运行于 JVM 中,Java 和 Python 的混搭),性能和易用性都不错。
- 如果愿意深入研究 Python 实现,或者求高性能 & 好玩,可以鼓捣一下 PyPy
- Python 3 看起来更合理,为什么没使用 Python 3? 因为下文提到的一些好玩好用的工具在 Python 3 中还没有被全面支持
编译
- 如上所述,我们使用 CPython。常见的 C 源码安装方法: ./configure --prefix=<your-path> && make && make install
包管理 & 源
- 包管理使用 pip。
为什么不是 setuptools?因为无卸载
为什么不是 virtualenv? 这个更科学,可以自己搞,但我们用 Python 多数是“玩”,不必这么严肃
btw: 我自己使用 ArchLinux,使用操作系统自身的包管理工具(pacman & yaourt)比 Python 的貌似更方便,如果你和我一样,欢迎这样搞
- 官方源不是被墙就是速度慢,这时我们可以自己指定源,比如指定 V2EX 的源:pip install flask -i http://pypi.v2ex.com/simple。类似的还有豆瓣、清华等源。使用的时候默默的感谢他们一下
辅助工具
- ipython 或 bpython 或 Python 自己的 repl,用来快速的“试”代码,Python 常用函数、数据结构什么的非常符合直觉,很多东西试一下就行了~
注意事项
- 我们的服务器是 CentOS,默认镜像中 Python 依赖工具可能不全,这会导致安装 Python 失败或者安装成功后某些标准库运行不正常,这个时候需要 yum install aaa bbb ccc 后重新编译安装一下
- Python 在酒店搜索 & QHotel 方面主要用于辅助 Java 世界的东西和一些小工具。无人帮助 QA 和运维,需要自己保证质量
- 以上 & 以下提到的关键词,如 pip 之类,如果此一次见,请 search google,浏览一眼官方文档,如果有时间请实际操练一下 hello world
主要应用点
数据导来导去
- 经常会有产品经理找到开发要数据,酒店的数据来源一般有:MySQL、PostgreSQL、磁盘上日志、HDFS上日志或表
- MySQL 的数据需要用到 Python 连接 MySQL 模块,我个人使用的是 PyMySQL,其他的还有 MySQLDB 之类的,连接 PostgreSQL 我个人使用 Pyscopg2
- HDFS 上的表或文件一般都用 Hadoop Shell 的命令,拉取到本地形成文本文件,和本地磁盘日志等同处理
- 导数据一般都需要 join、统计、排序什么的,这个时候要灵活运用 Python 的标准数据结构:dict、list、set 等(这一点对于初学者必须多做几次才有体会)
- Python 处理数据在环境完备的情况下出代码很快。Python 各种数据访问模块不如 JDBC 那样一致,但是结果集可以很方便的转化成 dict,代码简洁得多
- 如果涉及到多个 / 多种数据源,各种机器,难以申请各种互访环境,在这种条件下导数据,需要使用到下文的 Fabric
文本处理
- 字符串处理,Python 中有很多便捷的的字符串处理方法,并且字符串本身也是 list,这方面看书读文档吧
- 正则表达式,Python 中没有正则类型,使用的是字符串,这个和 SQL 一样,都是语言本身之外的功夫
- json,标准库里的 json 对于一般需求(处理接口数据,自动化测试对比 ...)来说就够了,可以和 dict 互转。说这个要比 Java 中简洁几十倍并不夸张。标准库中的 json 在我看来有一点不是很方便:对于非标准的 json(属性不带双引号 or 其他 js 引擎能正确识别的情况),这种情况还是使用 nodejs 里面的命令行工具好了
- xml,标准库里面的 ElementTree 对于一般需求来说就够了,我们这里在接口方面一般不使用 XML,XML 一般用在(热发布)配置文件。和 XML 有关的 bug、故障、delay 因素什么的已经有好几起了,因此,对于开发来说,熟练的掌握这个是必要的,可以用来生成配置文件数据、检查节点和数据完整性、检查编码、查找替换等
- 自然语言处理,用 Python 写个 trie 只需数十行代码,用来做个简单的词典分词、转拼音什么的很方便。NLP 这方面话题比较大,有专门的书介绍这个,以后有机会共同学习
运维
- fabric,在Q有个神器叫 atnodes —— 批量 ssh 工具(作者之一是万珣新万大师,perl 写的),Python 世界里有好几个和这个对应的东西,我用过最好用并认为最有前途的是 fabric,可以批量运行 ssh、上传下载、脚本化运行方面结合 Python 代码,清晰明了。从其 roadmap 可以看出有打造 Python 世界中 rake 和 chef 的趋势。fabric 在哪儿执行最方便?当然是跳板机啦~
- supervisor,类似 systemd、daemontools等,Python 世界中的进程管理工具,用于启动 nginx,Python 脚本,flask web应用、gunicorn 等。纯 Python 实现,有需要进程管理的就交给它吧
算法 & 机器学习
- numpy,用来做数值计算,Python 的简洁语法在这里体现非常明显
- scikit-learn,主流机器学习算法在这里都有,并且统一接口,易于上手,对着教材写个 hello world 什么的至少是很快的,别的不说,官方文档图文并茂,帅呆了
- Matplotlib,数据可视化,代码和图图都漂亮的就靠这个了
web
- flask,Servlet 写烦了有木有,Spring 太重了有木有,Jsp 一坨一坨太磕碜了有木有,Java 搭个环境一闭眼一睁眼一星期过去了有木有。试试 flask,分分钟出 demo
小工具
- requests,数据抓取用这个很方便,它的 slogan 是 HTTP For Human Beings,言外之一是啥,其他库不是给 Human Beings 用的~
- gevent,代码执行太慢?一般是阻塞了,gevent 基于 libev,提供类似协程的执行体,加上非阻塞 IO 模型,最潮的“并发”执行方式
- pyparse,自己写个 JSON diff 工具,自己写个 Hive SQL Code Formatter 什么的,顺便复习(重学、入门)一下编译原理
- pyXXX,和码农有关的 tag 前面加个 py 后搜一下,一般都会有个玩意儿,比如 pySVN 什么的,能干什么?发挥自己的想象力好了~
资料推荐
以下是在 Python 方面我收集的一些电子书,我也没有完全读完,但这些还都不错,有兴趣的话欢迎交流
- Beginning.Python.pdf
- byte.of.python.30.pdf
- Core.Python.Applications.Programming.3rd.pdf
- Data.Structures.and.Algorithms.in.Python.pdf
- Data.Structures.and.Algorithms.Using.Python.pdf
- diveintopython.pdf
- diveintopython3.pdf
- Expert.Python.Programming.pdf
- Fundamentals.of.Python--From.First.Programs.through.Data.Structures.pdf
- Generators.pdf
- Getting.Started.with.Pyparsing.pdf
- Head.First.Python.pdf
- How.to.Think.Like.a.Computer.Scientist--Learning.With.Python.pdf
- Introduction.to.Computer.Science.Using.Python.pdf
- Learning.Python.4th.pdf
- Learning.Python.5th.pdf
- Matplotlib.for.Python.Developers.pdf
- NLP.with.Py.pdf
- NumPy.Beginners.Guide.2nd.pdf
- NumPy.Cookbook.pdf
- pandas.pdf
- Programming.Computer.Vision.with.Python.pdf
- Py.Cookbook.chm
- PyPy.in.Production.pdf
- Python+学习笔记+第二版.pdf
- python-guide.pdf
- Python.Algorithms.pdf
- Python.Cookbook.3rd.pdf
- Python.for.Data.Analysis.pdf
- Python.for.Everyone.pdf
- Python.for.Unix.and.Linux.System.Administration.pdf
- Python.Testing.Cookbook.pdf
- Scipy.and.Numpy.pdf
- The.Python.Standard.Library.by.Example.pdf
- Think.Python.pdf
- Thinking.In.Python.pdf
- Violent.Python.pdf
- 用Python做科学计算.pdf
心得
- 以上提到这些东西是一年多以来我在酒店 Python 方面鼓捣过的东西,多数都是浅尝辄止,但是很有乐趣
- 有问题先 search the f^cking web & read the f^cking manual
- 官方文档、华蟒邮件列表、stackoverflow 多看看。其他 nodejs、ruby 社区也没事儿逛逛,这些生态系统中的好东西一般都可以和 Python 一比一翻译
- 有些问题一定是要自己经历亲身经历一下才知道以后如何解决的,比如丢失依赖、乱码、第三方库的烂坑等。遇到这些问题时,如果时间上有余地,可以深挖一下
- 标准库不给力(不强大,不好用)的情况下一般会有个第三方包,比如 requests,还有日期处理之类的(Java 和 Python 的日期、时间处理的标准库都不好用)
- 其他生态系统中好东西在 Python 世界一般都会有一份包装,比如 PyLucene(Lucene)、Gevent(Libev),PyLibpcap(Libpcap),PyWebkit(webkit)等