如何学Python?

很多人问过我“怎么开始学Python?”,“Python是什么”,“Python已经学了基础,如果进阶”。所以我打算整理一下我认为不错的学习资料,以后如果有人问我这些问题,就可以直接给他们推荐这个页面了。

本文档不定期更新。我碰到比较好的资源就会加进来。如果你是一个Python老手,知道一些这个文档没有列出的内容,欢迎在下面留言!

0.Python2 还是Python3

Python 3

Python3版本(例如Python 3.6.4)是不兼容Python2的(最常见的Python2是Pyhton2.7,这是一个“长期支持版本”)这很不常见,因为一般的软件都是兼容老版本的。Python之所以不兼容旧版本是因为Python旧版本有很多设计不好的地方,Python社区勇敢地重新设计了这些地方,使Python使用起来更好。但是为之付出的代价就是Python3代码无法兼容Pyhton2.但是近几年很多公司都在积极的向Python3迁移,比如QuoraInstagram

使用新版本的Python可以体验Python很多不错的特性。大多数Python库都是支持Python3的

Github上有一份不错Python3特性教程:arogozhnikov/python3_with_pleasure

1.零基础

我从来没有学过编程,该从哪里开始?

  1. learnxinyminutes.com 是一个快速入门的网站,从域名就可以看出来,在Y分钟内学会X。其中Python的部分也不错,可以让你在5分钟之内体验一下Python的语法。
  2. learn-python3》Jupyter notebook 是一个基于 web 界面的交互解释器,这个仓库是一些代码片段,演示和学习 Python3.通过代码来学习可能成本更低一些。
  3. A byte of Python》是一个免费的在线书,可以下载PDF。适合零基础的人,从教你安装Python开始。给你介绍几本的一些概念,通过代码学习。
  4. 廖雪峰的Python教程》同样面向零基础的读者。这种教程屏蔽了一些你初学的时候不需要了解的复杂细节,方便入门。但是最好尽早习惯查阅Python的官方文档。这是解决问题最有效的方法。
  5. 学习的时候可以结合 python tutor 这个在线工具,可以将数据结构可视化,容易理解。
  6. 字符串格式化是非常常用的操作,这个网站可以让你在5分钟内了解Python是如何格式化字符串的:https://pyformat.info 。
  7. Python Web 开发指南 可以看下,有一些有价值的笔记和注意事项。
  8. learn-python 用 Python 的 assert 的方式教你学 Python,类似一个 playground,不过需要懂 Python 的assert 和运行测试,也不算 0 基础吧,不过挺全面的。

2.进阶

我已经看完一些基本的入门教程,但是要自己写程序的时候要是一片空白,接下来该怎么做?

入门项目

不必担心,这几乎是每个人都会经历的。接下来可以去找一些简单的编程任务来做,例如在线题目(leetcode支持Python),或者尝试看一看一些简单的项目,例如:

  1. howdoi 这是一个简单的命令行工具,只有一个文件,需要简单的一点入门知识就可以读懂。
  2. requests 这是一个 HTTP 请求仓库,如果要写爬虫,几乎每天都要用它。可以用它来写一个简单的爬虫试试。这个项目的代码比起第一个稍稍复杂,但是花点时间也能看懂。
  3. pylons 有很多与 web 相关的项目,都比较小巧,适合学习源代码。
  4. agithub 是一个很简洁的 REST API 客户端,之前的版本只有 300 行代码,大量使用了 __getattr__ 的特性,这个库的源代码值得一读,你会体会到 Python “动态” 的特性。
  5. tinydb 这是用 Python 实现的一个小型的文档型(NoSQL)数据库,目前有 2000 行左右的代码,注释和文档也很丰富。核心思想就是用一个 Json 文件来保存数据,类似 SQLite。建议阅读一下源代码。

书籍资料

一些读物,最好对Python稍微了解之后再去读,但是并不要求很高深的知识:

  1. Python 工匠豆瓣 Github开源版本 这本书着重于提高 Python 的代码质量,从小的方面出发,介绍了如何写好 Python 代码的方法。如果你已经会写 Python,那么这本书让你写更好的 Python。
  2. Python3 cookbook》这本书(其实所有叫 Cookbook 的书都是如此)的形式是:提出一个问题,提出一些问题的解决方案,讨论这些方案并延伸。所以对深入 Python 细节来说是不错的。
  3. 《Python的常见陷阱》 中文 En
  4. Python Guide》主要是介绍 Python 生态,比如说如何组织你的项目,如何使用 logging,如何编写测试,如何配置 CI/CD,用 Python 写 GUI 程序有哪些库可以使用等等,几乎是必读的资料。建议新手老手都看一遍,会有很大收获。
  5. 《Learning Python》这本书一直在更新,都已经有第五版了,推荐英文好的同学去读一读。此书涉及了很多Python的细节,非常啰嗦。也可以不读,直接去翻阅文档。
  6. Python 3 Module of the Week 这个列表介绍了标准库以及简单用法,概括。适合快速阅读,熟悉标准库。
  7. 推荐读一下 Stack Overflow 关于 Python 问题。打开Python标签,按照Vote排序,会发现很多不错的回答。(这个宝贵资源是Risent告诉我的。)
  8. 这里有一份更详细的 FAQ,值得一读 http://effbot.org/pyfaq/(这个网页已经不能访问)
  9. 啄木鸟社区有很多丰富的资源,上网冲浪!
  10. Python 的官方 itertools 文档好好看一下,里面有很多线程的函数,如果有兴趣也可以去看一下源代码。如果你平时不怎么用这个库,那么写代码的时候就会多造很多轮子,而且往往有缺陷。
  11. 去 Follow 一些不错的资源,比如:
    1. 本博客右侧推荐的其他 Python 程序员的博客
    2. Python weekly 每周周报
    3. 加入和你相关的邮件列表,看看大家都在讨论什么,推荐加入 python-dev 关注下 Python 语言的发展动态
  12. Python 双下划线开头和结束的方法叫做 “dunder method”,这是 Python 鸭子类型的基础。仔细读一下这篇 A Guide to Python’s Magic Methods,遇到了更复杂的问题再去仔细读文档。
  13. 这里有一篇 Transforming Code into Beautiful, Idiomatic Python 看一下漂亮、Pythonic 的代码是怎么写的吧。

工具

我已经用Python在写一个项目了,有什么建议吗?

工欲善其事,必先利其器!推荐一下工具:

  1. virtualenv 永远工作在虚拟环境中!在系统的Python环境中安装依赖可能会影响系统的稳定性。所以为每一个项目创建一个虚拟的Python环境是一个最佳实践!BTW, 依赖管理其实是每一个编程语言要解决的问题,Python 为什么有 virtualenv 呢?看一下这篇 How virtual environment libraries work in Python 你就明白啦。
  2. virtualenvwrapper 一个上面工具的封装,可以让创建、激活、删除虚拟环境更加方便。
  3. pipsi 安装命令行工具的时候,使用pipsi install 而不是 pip install 可以自动为你要安装的工具创建一个虚拟环境。这样你安装的工具不会产生“依赖黑洞”,并且保持系统Python的清洁。(现在这个项目已经不维护了,推荐使用 pipx
  4. 学会打包Python package并发布到pypi,这里有一个例子可以参考:setup.py 。现在推荐使用 poetry 来打包了,更简单易用。
  5. 学会使用jupyter和ipython,这两个工具简直是神器!
  6. 读一下PEP 8,在自己的编辑器中加入lint检查,使自己写出的代码习惯PEP8.
  7. Python的一个很大的优点就是生态系统非常好,你想要的东西可能早有包来实现了。所以动手之前务必先Google一下有没有现成的东西。以及,解决问题最好的地方是Python官方文档,其次是Google、github和stackoverflow,最后是邮件列表和论坛。在网上向别人提问注意礼貌。

3.深入理解

我的主要工作是Python,像深入理解一下Python,尤其是工作中不常用到的东西,例如asyncio,多线程等。

我推荐一些阅读资料:

  1. 《Fluent Python》,中文版《流畅的Python》也不错。这是我最喜欢的一本Python书!此书基本上是以讨论为主,深入了Python的方方面面。很多地方,比如协程,我看了很多资料都云里雾里,但是这本书一段话让我大彻大悟!而且此书经常介绍问题的渊源和典故,能了解到不少有趣的知识。还提供了很多链接,根据此书的指引,还能发现不少好资料。缺点就是在纸质书上印这么多链接有点反人类。
  2. Python并行编程》这是我正在翻译的一本书,还没有完成。这本书介绍了多线程、多进程、异步编程等话题,内容不深,而且都有示例代码。不过我的翻译水平有限,如果看到错误或者错字,麻烦告诉我一下。希望能在大年之前完成此书。
  3. Effective Python》介绍了高质量编写Python代码的技巧,值得一读。
  4. 看一看PEP的更新和Python社区的邮件列表,关注Python的发展动向
  5. 本博客的侧边栏有一些有关Python的链接,例如PyCoders weekly。还有一些Python工程师的博客,值得关注。
  6. 当然,我也写很多Python有关的内容。点击Python分类

4.面试的准备

如果你正在找工作,可以看一下这些链接,如果这些问题你都理解并知道原理,找个好工作应该不难。

  1. https://github.com/taizilongxu/interview_python
  2. http://www.wklken.me/posts/2015/08/26/python-some-test-questions.html
  3. https://github.com/kenwoodjw/python_interview_question

5.FAQ

1.我在学习机器学习,有必要学习Python吗?

如果没有兴趣,可以不学。如果要用到numpy和scipy,可以通过它们的文档来学习。像numpy、scipy、flask、django这些框架,是有自己的一套设计的。你甚至可以理解为:这些Python是不同的东西。学习numpy(web框架也是)而不学习Python,我认为是可以的,遇到需要了解的Python有关的问题可以再去学习也不迟。

2.有必要使用Linux吗?

没有必要但是推荐使用Linux的命令行。我所有的工作内容都是在终端下完成的,终端相比于IDE更加高效,而且有很多awesome的工具。如果学会使用终端编辑器,你就不必为每种编程语言找到对应的 IDE 才能写的顺手,你可以用一把锤子敲遍世界上所有的钉子,并且并不是所有的文件编辑都有很好的 IDE 的,比如 Vagrantfile, Dockerfile, nginx.conf, yml, csv 等等,使用终端编辑器的话编辑什么都不会成为问题。还有,如果你想使用虚拟机或 VPS 来学习 Nginx 之类的东西,那么这是没有 GUI 的,终端编辑器可能是你唯一的选择。但是你也可以用windows或IDE,这些都不是强制的。但是一定要学会高效的解决自己遇到的问题,以及:了解你自己用的工具。比如PyCharm的调试技巧等。

3.为什么Python的for循环退出之后还能使用for循环定义的变量?

和其他语言不同,Python的代码块是没有作用域的,try-except代码块也没有。详见:《谈谈Python for循环的作用域》

4.为什么Python的字符串没有.length之类的属性或方法来获取长度而使用len()函数?

Python很多功能都是通过协议实现的。使用len(str)其实是调用了str.__len__方法。这样可以在中间做一些其他的处理。例如__getitem__就支持了描述器等特性。详见:http://lucumr.pocoo.org/2011/7/9/python-and-pola/

如何学Python?”已经有25条评论

  1. 陆陆续续学习了大约3年了,只能写简单一点的脚本,分析下日志什么的,好长时间不用现在也基本上快忘光了,丢了的东西,得再拿回来,哈哈,在 mycli 的 contributers 里面过来的,我看到居然有一个国人,非常感谢,嘿嘿

Leave a comment

您的电子邮箱地址不会被公开。 必填项已用*标注