0612 - 我入门 Python 后总结的基础教程 - V2EX
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 7058 次点击
    这是一个创建于 3056 天前的主题,其中的信息可能已经有所发展或是发生改变。

    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 Cod 后正常
    • 调试工具跟 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
    总结的很完善了。
    rrubick
        2
    rrubick  
       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     Solana     2659 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 29ms UTC 13:26 PVG 21:26 LAX 06:26 JFK 09:26
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86