V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
quietjosen
V2EX  ›  Python

0612 - 我入门 Python 后总结的基础教程

  •  
  •   quietjosen ·
    atjason · 2017-06-13 07:58:28 +08:00 · 6579 次点击
    这是一个创建于 2727 天前的主题,其中的信息可能已经有所发展或是发生改变。

    0) 先唠叨几句

    学习 Python 有几周了,也写了 2 个小项目来解决自己的实际需求。简单记录一下,供自己备忘,也供后来者参考。

    0.0) 我为什么选择 Python

    我之前使用 Swift + Vapor 开发了 iPic (图床工具) 的后端服务,遇到很多问题:

    • 主要还是 Swift 在 Ubuntu 下并不成熟,甚至很多关键性、基础性的库,都是 TBD ;
    • 以及,基于 Swift + Ubuntu 的库并不多,开发起来很吃力。

    接下来要开发 Klib (Kindle、iBooks 标注管理) 的标注分享功能,需要后端支持,于是打算好好学一学后端开发。

    适合后端开发的语言还是挺多的,比如 Java、PHP、Python、Ruby、Go、Javascript、等等。我其实并没有严格比较,最后选择了 Python,主要原因其实是和 Swift 相对的:

    • Python 成熟,无论在 Windows/Linux/macOS 都很稳定。
    • Python 轮子多,几乎所有能标准化的操作都能找到库,然后你可以专注于自己的业务。

    还有个原因,之前我接触过的开发语言( VB/C++/Java/C#/Swift )都是编译型的,这次想学个 解释型 的玩玩。

    0.1) 首先,知道要学什么

    先形而上地聊聊这个话题。

    至少从我的经验来看,在学习一样新东西时,我很希望能被告知要学什么,类似于一个大纲、知识点清单。这样,我就可以对照着清单一样样学习,方向感清晰、还不怕走弯路。

    而事实上,很少有这样的「清单」,最接近的可能是书的目录。可惜,好书实在太少了。尤其技术更新快,书中的知识很可能是陈旧的。

    出于这个理解,本文我只会 罗列我学习 Python 时所遇到的知识点,尽量组织成系统的清单

    0.2) 然而,我并不会教你怎么学

    清单上的知识点,我并不打算展开讲,因为:

    • 这太花()时()间()了
    • 通常,官方文档已经足够好,我没必要复制粘贴

    所以,对于某一个具体的点,还得你自己去学习。至于怎么学?我建议,在项目开发实际用到某个点时,再参考官网系统性的学习

    如果你实在急的必须在被炒鱿鱼之前解决某个问题(通常并不存在),你可以上网搜索,通常在技术博客、StackOverflow 这样的网站上能找到答案。

    不过,这是种投机行为、可能会有 陷阱

    • 如果你找对了方案,可能很快就解决问题。
    • 可如果你找了过期的、错误的、不适合你的环境的方案,你可能会掉入解决 A 问题时遇到 B 问题、解决 B 问题时又遇到 C 问题这样的陷阱,所花的时间,会当初系统性地学习,更多。

    1) Python 语法及基础

    好,唠叨了半天,终于来干的了。

    1.0) Python 2 or 3?

    Python 的 2、3 之争,在网上可以找到很多。虽然我一向主张学新不学旧(比如我甚至尝试用 Swift 开发后端,no zuo no die …),但在后端方面,由于吃了 Swift 的亏,我建议先学习成熟的 Python 2。真到了不得不用 3 的时,学。据说差别并不大(我保证,绝对没有 Swift 2 和 3 的差别大)

    1.1) 入门教程

    虽说我一向建议以官网为基础学习,但 Python 的官网的文档实在是太长了。没办法,为了全面性,各种犄角旮旯、你一辈子都用不到点的,官网也要提及。

    这里介绍 2 个 Python 入门教程:

    2) 尽早开发 Python 项目

    我建议,一旦有了语法基础,尽早 开发实际的、能解决自己问题的项目(或表述为工程、产品、工具、轮子)。

    注意,一定要是「能解决自己问题的项目」。相信我,如果只是做一个你自己根本用着的博客系统、爬虫之类的,学习过程中的困难一定会让你半途而废的。

    2.0) 项目的文件夹结构

    如果你真的想写个好项目,项目的文件夹结果一定要拿得出手,比如要区分代码、配置、数据、文档、测试等文件。尤其对于在不同服务器上部署、需要区分开发与生产环境的项目,更重要。

    注意,文件夹结构并没有唯一解;并且,和你使用的网络框架(后面会介绍)相关。在实践中逐渐优化,越早形成一套自己熟悉的项目结构,收益越大。

    我在 GitHub 上创建了一个 Python 项目文件夹结构示例,供参考。

    参考:

    2.1) 单元测试

    单元测试很重要、很重要、很重要

    尤其对于后端程序,几乎没有用户交互,非常适合进行单元测试。也许,一些已经超出了单元测试的范畴,称之为功能测试、压力测试、等等更合适。Anyway,叫测试就对了。

    我在开发过程中有写单元测试的习惯,甚至有时会先写单元测试、再写功能代码(恩,这就是测试驱动开发)。

    在多个测试框架中,我目前选择 pytest:一直在更新、对 Python 3 支持好、自动发现测试用例。

    2.2) IDE

    我一位大学同学,用 Windows 记事本开发了一个局域网内 IM 工具,可那是为了学习。人生苦短,还是用 IDE 开发吧。

    选什么呢?其实我并没有纠结,因为之前在 Windows 上使用 Visual Studio、且一直听闻 Visual Studio Code 不错,就直接上了 VS Code

    不过,VS Code 本身只提供一个框架,要打造适合自己的 IDE,还得有一系列的配置,比如主题、字体、快捷键、插件、等等。

    就 Python 开发,目前还有几点不顺手(如果你知道怎么做,麻烦告诉我):

    • 出错时,不能点击错误日志跳转至对应的代码
    • 单元测试有时会卡死,重启 VS Code 后正常
    • 调试工具跟 Xcode 等工具有差距
    • 快捷键没办法和 Xcode 统一,用起来很割裂

    3) 善用 Python 库

    Python 的优势之一,就是轮子多,也就是库(模块)丰富。碰到一个问题,你不愁找不到库,而是不知道该选哪个,甜蜜的烦恼。

    号外:我为 Python 造的第一个轮子:AES256CBC

    3.1) 标准库

    任何语言都会把常用的库,纳入自己的标准库中。其实,很多时候我们说一门语言,都是在学其标准库。

    对于标准库的学习,倒是建议参考 官方文档

    3.2) 管理 Python 库

    库多了,管理就成了问题。这个没什么好说的,直接使用 pip

    小技巧:

    • 对于项目的依赖库,可以使用 requirements.txt 集中管理。
    pip freeze > requirements.txt
    pip install -r requirements.txt
    
    • 可以将 Python 的安装源改为国内豆瓣、阿里等镜像源,速度快。

    3.3) Python 运行环境

    库+库,就是 Python 运行环境。尤其,当你需要在服务器上部署 Python 项目时,保证服务器和开发环境有一致的 Python 运行环境,很重要。

    推荐使用 pyenv,其利用 Shell 的 shims 机制,当你 cd 到项目目录时,自动切换 Python 版本(对比 virtualenv,其需要手动执行 source 命令,麻烦)。

    小建议:要在自己的电脑上特别建立一个「Python 脏环境」,用于平时写临时代码、测试新模块时使用,确保不会破坏电脑上的 Python 环境。

    4) 使用 Python 开发网络服务

    前面据说,我学 Python 主要是为了后端。我目前使用的是 Flask + Gunicorn + Nginx + MySQL + Supervisor 组合。

    4.0) Flask

    Python 的 Web 框架不少,不过据说主要还是 DjangoFlask。据说:

    • Django 的特点的大而全、开箱即用。
    • Flask 的特点的小巧灵活、定制性高。

    只要不是太不成熟、坑太多,我通常会选择简单的,于是,选 Flask.

    Flask 是个大话题,根本不适合在这里介绍,直接看 Flask Web Development 这本书吧,建议读原文。

    4.1) Gunicorn

    Flask 自带的 Web 服务器只是能让代码跑起来,而真正用于生产,则需要考虑并发、缓存等问题。

    主要的选择是 uWSGIGunicorn,和 Flask 与 Django 的对比很相似:

    • uWSGI 的特点的成熟、用的人多、高性能、强大(复杂)
    • Gunicorn 则更简单、易用

    于是,选 Gnuicorn.

    Gnuicorn 的配置简单,直接看官方文档即可。

    4.2) Nginx

    有了 Flask + Gunicorn,为什么还要 Nignx ?职责不同,Nginx 在处理静态资源、https/http2、负载均衡等方面,更擅长。

    Nginx 我就不介绍了吧?主要还是和 Gnuicorn 的配合。

    4.3) MySQL

    本地测试,我直接使用 SQLite,但要用于服务器,还是 MySQL 吧。

    主要这次开发 Klib 后端服务,业务上的数据比较规整,适合关系数据库;以后有机会再试试 NoSQL 吧。

    4.4) Supervisor

    服务,要的就是稳定。

    啥叫稳定?就是程序挂了能满血复活、重新运行。

    于是,使用 Supervisor,监控程序运行,挂了就立即重新运行。

    5) 尾巴

    这么长、这么枯燥的文章你都能看完?牛!粉我的公众号吧,以后每周二都会有一篇技术长文。

    Python 我只是入门,要学的东西还很多,以后还会有小结、分享。

    未完待续…


    博客原文:0612 - 我入门 Python 后总结的基础教程

    第 1 条附言  ·  2017-06-13 09:27:10 +08:00
    PS:关于初学者,是先学 Python 2、还是直接入 Python 3,楼下很多老司机都推荐 Python 3. 我收回文中的建议,大家自己判断吧; 3 我还没学,不能给大家建议了。可以先简单了解下 2、3 后,再决定先学哪个。
    第 2 条附言  ·  2017-06-13 12:02:15 +08:00
    受不了老司机 BS,要去学 Python 3 了…
    42 条回复    2017-06-22 14:27:51 +08:00
    xaganji
        1
    xaganji  
       2017-06-13 08:40:47 +08:00   ❤️ 1
    总结的很完善了。
    magic3584
        2
    magic3584  
       2017-06-13 08:42:35 +08:00
    原来你就是 Klib 的作者 Orz。。。最近刚开始学习 python, 是不是先学 Flask ? PS:廖老师的实战第三课我就放弃了。。。
    findsomeone
        3
    findsomeone  
       2017-06-13 08:51:49 +08:00 via iPhone
    用 pycharm debug 就可以跳转了
    kunimi
        4
    kunimi  
       2017-06-13 08:59:27 +08:00
    **我建议先学习成熟的 Python 2**
    Python 3 已经很成熟了,对于新手来说,最佳的选择显然是 3
    xiaket
        5
    xiaket  
       2017-06-13 09:00:55 +08:00
    强烈不建议新人入坑 python2. 直接 python3 更合适.
    ziyuan
        6
    ziyuan  
       2017-06-13 09:01:33 +08:00
    很好,正好在学习 python,非常有帮助
    alphadog619
        7
    alphadog619  
       2017-06-13 09:05:45 +08:00
    受益匪浅,总结的很好。
    rocksolid
        8
    rocksolid  
       2017-06-13 09:09:47 +08:00
    2,3 有什么可吵得,都得学新手应该先学会配置 pyenv+virtualenv 或者 anaconda
    eqqmy2
        9
    eqqmy2  
       2017-06-13 09:12:12 +08:00
    建议先学 py3,目前有人维护的轮子基本上都支持了 py3,而且个人觉得 py2 的字符串真是坑啊_(:з」∠)_
    sunjws
        10
    sunjws  
       2017-06-13 09:16:43 +08:00
    受益匪浅
    quietjosen
        11
    quietjosen  
    OP
       2017-06-13 09:19:55 +08:00
    @xaganji 都是流水账啦,不深入。
    quietjosen
        12
    quietjosen  
    OP
       2017-06-13 09:20:57 +08:00
    @magic3584 Flask 是 Web 框架,看你自己的需求吧。

    PS:廖老师的实战…我也没坚持多久…所以良心建议初学者先绕道,回头再来学。
    quietjosen
        13
    quietjosen  
    OP
       2017-06-13 09:21:25 +08:00
    @findsomeone 已经好多人推荐 pycharm 了,看来是要入这个坑了。
    fengtalk
        14
    fengtalk  
       2017-06-13 09:22:21 +08:00
    原来是 iPic 的作者,已关注。
    ipwx
        15
    ipwx  
       2017-06-13 09:22:43 +08:00
    建议学习 Python3。写库兼顾 2&3 的话,一定要以 3 的思维去写,用 six 去兼顾 2。

    另外不建议字符串常量用 u'xxx'。根据我的经验,除非你写 web framework,或者常量要用中文,否则直接用字符串最好( 2 下面解释为多字节,3 下面解释为 unicode )。不然会碰到各种奇怪的 bug。
    quietjosen
        16
    quietjosen  
    OP
       2017-06-13 09:22:57 +08:00
    @kunimi @xiaket 好吧,我收回建议,大家自己决定先学 2 还是 3.
    quietjosen
        17
    quietjosen  
    OP
       2017-06-13 09:23:48 +08:00
    @alphadog619 @ziyuan 不客气,我也只是记流水账。
    quietjosen
        18
    quietjosen  
    OP
       2017-06-13 09:24:50 +08:00
    @eqqmy2 @ipwx Python 2 的字符串,真的是坑。这点 3 基本无痛。
    quietjosen
        19
    quietjosen  
    OP
       2017-06-13 09:25:03 +08:00
    @fengtalk 哈哈,碰到用户啦 :)
    jy02201949
        20
    jy02201949  
       2017-06-13 09:30:26 +08:00
    啥年代了,还推荐 2 啊。。。这句话貌似我四五年前在某教程上看过
    justtery
        21
    justtery  
       2017-06-13 09:39:07 +08:00 via Android
    当我看到建议学成熟的 2 版本的时候,我就打算直接来评论了。不想斯比,不想争论,你开心就好,不过请不要误人子弟,谢谢,现在已经是 2017 年了,不是 2007 年
    gotounix
        22
    gotounix  
       2017-06-13 09:49:43 +08:00
    Flask 项目结构可以参考 https://github.com/sloria/cookiecutter-flask
    quietjosen
        23
    quietjosen  
    OP
       2017-06-13 09:54:27 +08:00
    @gotounix 不错;不过略复杂了些,可以熟悉后自己删除不用的、保留必须的。
    quietjosen
        24
    quietjosen  
    OP
       2017-06-13 09:55:07 +08:00
    @jy02201949 @justtery 请看 APPEND,我已经收回建议了。
    Kilerd
        25
    Kilerd  
       2017-06-13 10:16:15 +08:00
    > 我建议先学习成熟的 Python 2
    > 我目前选择 pytest:一直在更新、对 Python 3 支持好、自动发现测试用例

    这会不会自相矛盾?

    况且在这个时候,还推荐 Python 2 是十分不负责任的做法。
    Kilerd
        26
    Kilerd  
       2017-06-13 10:23:22 +08:00   ❤️ 1
    再者。你对 Flask 的理解略少,项目文件分布也不应该这样来。

    ======

    谨慎使用 pip freeze 功能,详情请看 pycon 2017
    anyele
        27
    anyele  
       2017-06-13 10:30:22 +08:00 via Android
    说实话,一看到建议居然是 Python2 的时候我就知道我该留言然后关帖子了
    kmahyyg
        28
    kmahyyg  
       2017-06-13 10:55:39 +08:00 via Android
    pycharm + py 3
    quietjosen
        29
    quietjosen  
    OP
       2017-06-13 11:51:01 +08:00
    @Kilerd 请看 APPEND.

    关于选择 pytest,因为之后我肯定会过渡到 3,选个支持 3 的 pytest 并不矛盾。

    关于 Flask 结构,我是照着教程搭建的。欢迎在 GitHub 上新建一个好的项目文件,分享给大家。

    关于 pip freeze,谢谢建议,我去看看。
    green15
        30
    green15  
       2017-06-13 12:14:32 +08:00 via iPhone
    py2 和 py3 都有用,对于新手来说 py3 更友好……而且两个版本转换并没有网上传呼那么困难。
    quietjosen
        31
    quietjosen  
    OP
       2017-06-13 12:20:29 +08:00
    @green15 是啊,大把口水浪费在 2、3 之争,却不如关注开发本身。
    keisuu
        32
    keisuu  
       2017-06-13 13:38:05 +08:00
    学习了
    hjkl0001
        33
    hjkl0001  
       2017-06-13 15:52:05 +08:00
    学习了,对新手有帮助
    quietjosen
        34
    quietjosen  
    OP
       2017-06-13 18:42:09 +08:00
    @keisuu @hjkl0001 共同学习…
    troywinter
        35
    troywinter  
       2017-06-14 11:54:14 +08:00
    人生苦短,为何不用 pycharm
    quietjosen
        36
    quietjosen  
    OP
       2017-06-14 13:08:15 +08:00
    @troywinter 恩,会去试试的。
    chiu
        37
    chiu  
       2017-06-16 22:51:16 +08:00
    为什么我会觉得这头像很熟悉……
    quietjosen
        38
    quietjosen  
    OP
       2017-06-16 23:01:23 +08:00
    @chiu 哈哈,哪里见过?
    yucongo
        39
    yucongo  
       2017-06-17 17:46:12 +08:00
    肯定要学 Python 3 啦老大……
    quietjosen
        40
    quietjosen  
    OP
       2017-06-17 23:19:06 +08:00
    @yucongo 估计下周就开始学 Python 3,2 中已经遇到字符串的坑。
    sangmong
        41
    sangmong  
       2017-06-21 23:33:57 +08:00
    请问楼主买的哪家的服务器...都好贵哦...
    quietjosen
        42
    quietjosen  
    OP
       2017-06-22 14:27:51 +08:00
    @sangmong Vultr

    国内买了阿里云,不过因为文中提到的外网速度,事实上没有用。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2838 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 30ms · UTC 09:07 · PVG 17:07 · LAX 01:07 · JFK 04:07
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.