学习 Python 有几周了,也写了 2 个小项目来解决自己的实际需求。简单记录一下,供自己备忘,也供后来者参考。
我之前使用 Swift + Vapor 开发了 iPic (图床工具) 的后端服务,遇到很多问题:
接下来要开发 Klib (Kindle、iBooks 标注管理) 的标注分享功能,需要后端支持,于是打算好好学一学后端开发。
适合后端开发的语言还是挺多的,比如 Java、PHP、Python、Ruby、Go、Javascript、等等。我其实并没有严格比较,最后选择了 Python,主要原因其实是和 Swift 相对的:
还有个原因,之前我接触过的开发语言( VB/C++/Java/C#/Swift )都是编译型的,这次想学个 解释型 的玩玩。
先形而上地聊聊这个话题。
至少从我的经验来看,在学习一样新东西时,我很希望能被告知要学什么,类似于一个大纲、知识点清单。这样,我就可以对照着清单一样样学习,方向感清晰、还不怕走弯路。
而事实上,很少有这样的「清单」,最接近的可能是书的目录。可惜,好书实在太少了。尤其技术更新快,书中的知识很可能是陈旧的。
出于这个理解,本文我只会 罗列我学习 Python 时所遇到的知识点,尽量组织成系统的清单。
清单上的知识点,我并不打算展开讲,因为:
所以,对于某一个具体的点,还得你自己去学习。至于怎么学?我建议,在项目开发实际用到某个点时,再参考官网系统性的学习。
如果你实在急的必须在被炒鱿鱼之前解决某个问题(通常并不存在),你可以上网搜索,通常在技术博客、StackOverflow 这样的网站上能找到答案。
不过,这是种投机行为、可能会有 陷阱:
好,唠叨了半天,终于来干的了。
Python 的 2、3 之争,在网上可以找到很多。虽然我一向主张学新不学旧(比如我甚至尝试用 Swift 开发后端,no zuo no die …),但在后端方面,由于吃了 Swift 的亏,我建议先学习成熟的 Python 2。真到了不得不用 3 的时,学。据说差别并不大(我保证,绝对没有 Swift 2 和 3 的差别大)
虽说我一向建议以官网为基础学习,但 Python 的官网的文档实在是太长了。没办法,为了全面性,各种犄角旮旯、你一辈子都用不到点的,官网也要提及。
这里介绍 2 个 Python 入门教程:
我建议,一旦有了语法基础,尽早 开发实际的、能解决自己问题的项目(或表述为工程、产品、工具、轮子)。
注意,一定要是「能解决自己问题的项目」。相信我,如果只是做一个你自己根本用着的博客系统、爬虫之类的,学习过程中的困难一定会让你半途而废的。
如果你真的想写个好项目,项目的文件夹结果一定要拿得出手,比如要区分代码、配置、数据、文档、测试等文件。尤其对于在不同服务器上部署、需要区分开发与生产环境的项目,更重要。
注意,文件夹结构并没有唯一解;并且,和你使用的网络框架(后面会介绍)相关。在实践中逐渐优化,越早形成一套自己熟悉的项目结构,收益越大。
我在 GitHub 上创建了一个 Python 项目文件夹结构示例,供参考。
参考:
单元测试很重要、很重要、很重要。
尤其对于后端程序,几乎没有用户交互,非常适合进行单元测试。也许,一些已经超出了单元测试的范畴,称之为功能测试、压力测试、等等更合适。Anyway,叫测试就对了。
我在开发过程中有写单元测试的习惯,甚至有时会先写单元测试、再写功能代码(恩,这就是测试驱动开发)。
在多个测试框架中,我目前选择 pytest:一直在更新、对 Python 3 支持好、自动发现测试用例。
我一位大学同学,用 Windows 记事本开发了一个局域网内 IM 工具,可那是为了学习。人生苦短,还是用 IDE 开发吧。
选什么呢?其实我并没有纠结,因为之前在 Windows 上使用 Visual Studio、且一直听闻 Visual Studio Code 不错,就直接上了 VS Code
不过,VS Code 本身只提供一个框架,要打造适合自己的 IDE,还得有一系列的配置,比如主题、字体、快捷键、插件、等等。
就 Python 开发,目前还有几点不顺手(如果你知道怎么做,麻烦告诉我):
Python 的优势之一,就是轮子多,也就是库(模块)丰富。碰到一个问题,你不愁找不到库,而是不知道该选哪个,甜蜜的烦恼。
号外:我为 Python 造的第一个轮子:AES256CBC
任何语言都会把常用的库,纳入自己的标准库中。其实,很多时候我们说一门语言,都是在学其标准库。
对于标准库的学习,倒是建议参考 官方文档
库多了,管理就成了问题。这个没什么好说的,直接使用 pip
小技巧:
pip freeze > requirements.txt
pip install -r requirements.txt
库+库,就是 Python 运行环境。尤其,当你需要在服务器上部署 Python 项目时,保证服务器和开发环境有一致的 Python 运行环境,很重要。
推荐使用 pyenv,其利用 Shell 的 shims
机制,当你 cd 到项目目录时,自动切换 Python 版本(对比 virtualenv,其需要手动执行 source 命令,麻烦)。
小建议:要在自己的电脑上特别建立一个「Python 脏环境」,用于平时写临时代码、测试新模块时使用,确保不会破坏电脑上的 Python 环境。
前面据说,我学 Python 主要是为了后端。我目前使用的是 Flask + Gunicorn + Nginx + MySQL + Supervisor 组合。
Python 的 Web 框架不少,不过据说主要还是 Django 和 Flask。据说:
只要不是太不成熟、坑太多,我通常会选择简单的,于是,选 Flask.
Flask 是个大话题,根本不适合在这里介绍,直接看 Flask Web Development 这本书吧,建议读原文。
Flask 自带的 Web 服务器只是能让代码跑起来,而真正用于生产,则需要考虑并发、缓存等问题。
主要的选择是 uWSGI 和 Gunicorn,和 Flask 与 Django 的对比很相似:
于是,选 Gnuicorn.
Gnuicorn 的配置简单,直接看官方文档即可。
有了 Flask + Gunicorn,为什么还要 Nignx ?职责不同,Nginx 在处理静态资源、https/http2、负载均衡等方面,更擅长。
Nginx 我就不介绍了吧?主要还是和 Gnuicorn 的配合。
本地测试,我直接使用 SQLite,但要用于服务器,还是 MySQL 吧。
主要这次开发 Klib 后端服务,业务上的数据比较规整,适合关系数据库;以后有机会再试试 NoSQL 吧。
服务,要的就是稳定。
啥叫稳定?就是程序挂了能满血复活、重新运行。
于是,使用 Supervisor,监控程序运行,挂了就立即重新运行。
这么长、这么枯燥的文章你都能看完?牛!粉我的公众号吧,以后每周二都会有一篇技术长文。
Python 我只是入门,要学的东西还很多,以后还会有小结、分享。
未完待续…
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.