是否非常想学好 Python,一方面被琐事纠缠,一直没能动手,另一方面,担心学习成本太高,心里默默敲着退堂鼓?
幸运的是,Python 是一门初学者友好的编程语言,想要完全掌握它,你不必花上太多的时间和精力。
Python 的设计哲学之一就是简单易学,体现在两个方面:
语法简洁明了:相对 Ruby 和 Perl,它的语法特性不多不少,大多数都很简单直接,不玩儿玄学。
切入点很多:Python 可以让你可以做很多事情,科学计算和数据分析、爬虫、Web 网站、游戏、命令行实用工具等等等等,总有一个是你感兴趣并且愿意投入时间的。
废话不多说,学会一门语言的捷径只有一个: Getting Started
¶ 起步阶段
任何一种编程语言都包含两个部分:硬知识和软知识,起步阶段的主要任务是掌握硬知识。
硬知识
“硬知识”指的是编程语言的语法、算法和数据结构、编程范式等,例如:变量和类型、循环语句、分支、函数、类。这部分知识也是具有普适性的,看上去是掌握了一种语法,实际是建立了一种思维。例如:让一个 Java 程序员去学习 Python,他可以很快的将 Java 中的学到的面向对象的知识 map 到 Python 中来,因此能够快速掌握 Python 中面向对象的特性。
如果你是刚开始学习编程的新手,一本可靠的语法书是非常重要的。它看上去可能非常枯燥乏味,但对于建立稳固的编程思维是必不可少。
下面列出了一些适合初学者入门的教学材料:
廖雪峰的 Python 教程 Python 中文教程的翘楚,专为刚刚步入程序世界的小白打造。
笨方法学 Python 这本书在讲解 Python 的语法成分时,还附带大量可实践的例子,非常适合快速起步。
The Hitchhiker’s Guide to Python! 这本指南着重于 Python 的最佳实践,不管你是 Python 专家还是新手,都能获得极大的帮助。
Python 的哲学:
学习也是一样,虽然推荐了多种学习资料,但实际学习的时候,最好只选择其中的一个,坚持看完。
必要的时候,可能需要阅读讲解数据结构和算法的书,这些知识对于理解和使用 Python 中的对象模型有着很大的帮助。
软知识
“软知识”则是特定语言环境下的语法技巧、类库的使用、IDE的选择等等。这一部分,即使完全不了解不会使用,也不会妨碍你去编程,只不过写出的程序,看上去显得“傻”了些。
对这些知识的学习,取决于你尝试解决的问题的领域和深度。对初学者而言,起步阶段极易走火,或者在选择 Python 版本时徘徊不决,一会儿看 2.7 一会儿又转到 3.0,或者徜徉在类库的大海中无法自拔,Scrapy,Numpy,Django 什么都要试试,或者参与编辑器圣战、大括号缩进探究、操作系统辩论赛等无意义活动,或者整天跪舔语法糖,老想着怎么一行代码把所有的事情做完,或者去构想圣洁的性能安全通用性健壮性全部满分的解决方案。
很多“大牛”都会告诫初学者,用这个用那个,少走弯路,这样反而把初学者推向了真正的弯路。
还不如告诉初学者,学习本来就是个需要你去走弯路出 Bug,只能脚踏实地,没有奇迹只有狗屎的过程。
选择一个方向先走下去,哪怕脏丑差,走不动了再看看有没有更好的解决途径。
自己走了弯路,你才知道这么做的好处,才能理解为什么人们可以手写状态机去匹配却偏要发明正则表达式,为什么面向过程可以解决却偏要面向对象,为什么我可以操纵每一根指针却偏要自动管理内存,为什么我可以嵌套回调却偏要用 Promise...
更重要的是,你会明白,高层次的解决方法都是对低层次的封装,并不是任何情况下都是最有效最合适的。
技术涌进就像波浪一样,那些陈旧的封存已久的技术,消退了迟早还会涌回的。就像现在移动端应用、手游和 HTML5 的火热,某些方面不正在重演过去 PC 的那些历史么?
因此,不要担心自己走错路误了终身,坚持并保持进步才是正道。
起步阶段的核心任务是掌握硬知识,软知识做适当了解,有了稳固的根,粗壮的枝干,才能长出浓密的叶子,结出甜美的果实。
¶ 发展阶段
完成了基础知识的学习,必定会感到一阵空虚,怀疑这些语法知识是不是真的有用。
没错,你的怀疑是非常正确的。要让 Python 发挥出它的价值,当然不能停留在语法层面。
发展阶段的核心任务,就是“跳出 Python,拥抱世界”。
在你面前会有多个分支:科学计算和数据分析、爬虫、Web 网站、游戏、命令行实用工具等等等等,这些都不是仅仅知道 Python 语法就能解决的问题。
拿爬虫举例,如果你对计算机网络,HTTP 协议,HTML,文本编码,JSON 一无所知,你能做好这部分的工作么?而你在起步阶段的基础知识也同样重要,如果你连循环递归怎么写都还要查文档,连 BFS 都不知道怎么实现,这就像工匠做石凳每次起锤都要思考锤子怎么使用一样,非常低效。
在这个阶段,不可避免要接触大量类库,阅读大量书籍的。
类库方面
「Awesome Python 项目」:vinta/awesome-python · GitHub
这里列出了你在尝试解决各种实际问题时,Python 社区已有的工具型类库,如下图所示:
vinta/awesome-python
你可以按照实际需求,寻找你需要的类库。
至于相关类库如何使用,必须掌握的技能便是阅读文档。由于开源社区大多数文档都是英文写成的,所以,英语不好的同学,需要恶补下。
书籍方面
这里我只列出一些我觉得比较有一些帮助的书籍,详细的请看豆瓣的书评:
科学和数据分析:
❖「集体智慧编程」:集体智慧编程 (豆瓣)
❖「数学之美」:数学之美 (豆瓣)
❖「统计学习方法」:统计学习方法 (豆瓣)
❖「Pattern Recognition And Machine Learning」:Pattern Recognition And Machine Learning (豆瓣)
❖「数据科学实战」:数据科学实战 (豆瓣)
❖「数据检索导论」:信息检索导论 (豆瓣)
爬虫:
❖「HTTP 权威指南」:HTTP权威指南 (豆瓣)
Web 网站:
❖「HTML & CSS 设计与构建网站」:HTML & CSS设计与构建网站 (豆瓣)
...
列到这里已经不需要继续了。
聪明的你一定会发现上面的大部分书籍,并不是讲 Python 的书,而更多的是专业知识。
事实上,这里所谓“跳出 Python,拥抱世界”,其实是发现 Python 和专业知识相结合,能够解决很多实际问题。这个阶段能走到什么程度,更多的取决于自己的专业知识。
¶ 深入阶段
这个阶段的你,对 Python 几乎了如指掌,那么你一定知道 Python 是用 C 语言实现的。
可是 Python 对象的“动态特征”是怎么用相对底层,连自动内存管理都没有的C语言实现的呢?这时候就不能停留在表面了,勇敢的拆开 Python 的黑盒子,深入到语言的内部,去看它的历史,读它的源码,才能真正理解它的设计思路。
这里推荐一本书:
「Python 源码剖析」:Python源码剖析 (豆瓣)
这本书把 Python 源码中最核心的部分,给出了详细的阐释,不过阅读此书需要对 C 语言内存模型和指针有着很好的理解。
另外,Python 本身是一门杂糅多种范式的动态语言,也就是说,相对于 C 的过程式、 Haskell 等的函数式、Java 基于类的面向对象而言,它都不够纯粹。换而言之,编程语言的“道学”,在 Python 中只能有限的体悟。学习某种编程范式时,从那些面向这种范式更加纯粹的语言出发,才能有更深刻的理解,也能了解到 Python 语言的根源。
这里推荐一门公开课
「编程范式」:斯坦福大学公开课:编程范式
讲师高屋建瓴,从各种编程范式的代表语言出发,给出了每种编程范式最核心的思想。
值得一提的是,这门课程对C语言有非常深入的讲解,例如C语言的范型和内存管理。这些知识,对阅读 Python 源码也有大有帮助。
Python 的许多最佳实践都隐藏在那些众所周知的框架和类库中,例如 Django、Tornado 等等。在它们的源代码中淘金,也是个不错的选择。
¶ 最后的话
每个人学编程的道路都是不一样的,其实大都殊途同归,没有迷路的人只有不能坚持的人!
希望想学 Python 想学编程的同学,不要犹豫了,看完这篇文章,
Just Getting Started !!!
Python 其实挺简单的,也挺强大的。
我用 Python 做科学计算,自学一年,也记了一年的笔记。
附上笔记的链接:
GitHub - 中文 Python 笔记
Jupyter Notebook - 中文 Python 笔记
就我个人而言,主要的感受如下:
English is important.
大部分的文档,帮助都是英文的,很多函数的命名都与英文意思相关,不学好英文怎么行。中文翻译版?呵呵,我反正是不看的。
Try it yourself.
很多事情要自己动手做一遍才有感觉,光靠看是没有用的。不试试怎么知道这东西怎么用,有多少种用法?
Ipython Notebook (or Jupyter Notebook) is useful.
不得不说,Ipython Notebook 是用来学习 Python 的好工具,既可以看别人的说明和结果,又可以自己尝试,比那些只能看不能玩的教程好多了。
Start coding in Python.
学了那么多东西之后,会用才是王道啊。而且,大部分教程中给的实例都不会很复杂,一到实用的部分,肯定会有很多新问题出现,搞定这些新问题,你的水平肯定又上了一个台阶。
Learn how to find code.
因为用 Python 的人很多很多,基本上你能想到的功能,都会有现成的实现,造轮子不如用轮子啊。
附上现在笔记的目录:
01. Python 工具
01.01 Python 简介
01.02 Ipython 解释器
01.03 Ipython notebook
01.04 使用 Anaconda
02. Python 基础
02.01 Python 入门演示
02.02 Python 数据类型
02.03 数字
02.04 字符串
02.05 索引和分片
02.06 列表
02.07 可变和不可变类型
02.08 元组
02.09 列表与元组的速度比较
02.10 字典
02.11 集合
02.12 不可变集合
02.13 Python 赋值机制
02.14 判断语句
02.15 循环
02.16 列表推导式
02.17 函数
02.18 模块和包
02.19 异常
02.20 警告
02.21 文件读写
03. Numpy
03.01 Numpy 简介
03.02 Matplotlib 基础
03.03 Numpy 数组及其索引
03.04 数组类型
03.05 数组方法
03.06 数组排序
03.07 数组形状
03.08 对角线
03.09 数组与字符串的转换
03.10 数组属性方法总结
03.11 生成数组的函数
03.12 矩阵
03.13 一般函数
03.14 向量化函数
03.15 二元运算
03.16 ufunc 对象
03.17 choose 函数实现条件筛选
03.18 数组广播机制
03.19 数组读写
03.20 结构化数组
03.21 记录数组
03.22 内存映射
03.23 从 Matlab 到 Numpy
04. Scipy
04.01 SCIentific PYthon 简介
04.02 插值
04.03 概率统计方法
04.04 曲线拟合
04.05 最小化函数
04.06 积分
04.07 解微分方程
04.08 稀疏矩阵
04.09 线性代数
04.10 稀疏矩阵的线性代数
05. Python 进阶
05.01 sys 模块简介
05.02 与操作系统进行交互:os 模块
05.03 CSV 文件和 csv 模块
05.04 正则表达式和 re 模块
05.05 datetime 模块
05.06 SQL 数据库
05.07 对象关系映射
05.08 函数进阶:参数传递,高阶函数,lambda 匿名函数,global 变量,递归
05.09 迭代器
05.10 生成器
05.11 with 语句和上下文管理器
05.12 修饰符
05.13 修饰符的使用
05.14 operator, functools, itertools, toolz, fn, funcy 模块
05.15 作用域
05.16 动态编译
06. Matplotlib
06.01 Pyplot 教程
06.02 使用 style 来配置 pyplot 风格
06.03 处理文本(基础)
06.04 处理文本(数学表达式)
06.05 图像基础
06.06 注释
06.07 标签
06.08 figures, subplots, axes 和 ticks 对象
06.09 不要迷信默认设置
06.10 各种绘图实例
07. 使用其他语言进行扩展
07.01 简介
07.02 Python 扩展模块
07.03 Cython:Cython 基础,将源代码转换成扩展模块
07.04 Cython:Cython 语法,调用其他C库
07.05 Cython:class 和 cdef class,使用 C++
07.06 Cython:Typed memoryviews
07.07 生成编译注释
07.08 ctypes
08. 面向对象编程
08.01 简介
08.02 使用 OOP 对森林火灾建模
08.03 什么是对象?
08.04 定义 class
08.05 特殊方法
08.06 属性
08.07 森林火灾模拟
08.08 继承
08.09 super() 函数
08.10 重定义森林火灾模拟
08.11 接口
08.12 共有,私有和特殊方法和属性
08.13 多重继承
09. Theano
09.01 Theano 简介及其安装
09.02 Theano 基础
09.03 Theano 在 Windows 上的配置
09.04 Theano 符号图结构
09.05 Theano 配置和编译模式
09.06 Theano 条件语句
09.07 Theano 循环:scan(详解)
09.08 Theano 实例:线性回归
09.09 Theano 实例:Logistic 回归
09.10 Theano 实例:Softmax 回归
09.11 Theano 实例:人工神经网络
09.12 Theano 随机数流变量
09.13 Theano 实例:更复杂的网络
09.14 Theano 实例:卷积神经网络
09.15 Theano tensor 模块:基础
09.16 Theano tensor 模块:索引
09.17 Theano tensor 模块:操作符和逐元素操作
10. 有趣的第三方模块
10.01 使用 basemap 画地图
10.02 使用 cartopy 画地图
10.03 探索 NBA 数据
11. 有用的工具
11.01 pprint 模块:打印 Python 对象
11.02 pickle, cPickle 模块:序列化 Python 对象
11.03 json 模块:处理 JSON 数据
11.04 glob 模块:文件模式匹配
11.05 shutil 模块:高级文件操作
11.06 gzip, zipfile, tarfile 模块:处理压缩文件
其实python非常适合初学者入门。相比较其他不少主流编程语言,有更好的可读性,因此上手相对容易。自带的各种模块加上丰富的第三方模块,免去了很多“重复造轮子”的工作,可以更快地写出东西。配置开发环境也不是很复杂,mac和linux都内置了python。另外据我所知,不少学校也开始使用python来教授程序设计课程。
关于自学python,个人最大的3点经验:
找一本浅显易懂,例程比较好的教程,从头到尾看下去。不要看很多本,专注于一本。把里面的例程都手打一遍,搞懂为什么。我当时看的是《简明python教程》,不过这本书不是非常适合零基础初学者。
去找一个实际项目练手。我当时是因为要做一个网站,不得已要学python。这种条件下的效果比你平时学一门新语言要好很多。所以最好是要有真实的项目做。可以找几个同学一起做个网站之类。注意,真实项目不一定非要是商业项目,你写一个只是自己会用的博客网站也是真实项目,关键是要核心功能完整。
最好能找到一个已经会python的人。问他一点学习规划的建议,然后在遇到卡壳的地方找他指点。这样会事半功倍。但是,要学会搜索,学会如何更好地提问。没人愿意帮你写作业或是回答“一搜便知”的问题。
然而,别人的经验未必能完全复制。比如我没有说的是,在自学python之前,我已在学校系统学习过其他的编程语言。
对于完全没有编程经验的初学者,在学习python的时候,面对的不仅仅是python这门语言,还需要面临“编程”的一些普遍问题,比如:
从零开始,不知道从何入手,找了本编程教材发现第二章开始就看不懂了;
缺少计算机基础知识,被一些教程略过的“常识性”问题卡住;
遇到问题不知道怎么寻找解决方案;
看懂语法之后不知道拿来做什么,学完一阵子就又忘了;
缺少数据结构、设计模式等编程基础知识,只能写出小的程序片段。
所以除了前面说的3点经验,给初学编程者的额外建议:
首先要有信心。虽然可能你看了几个小时也没在屏幕上打出一个三角形,或者压根儿就没能把程序运行起来。但相信我,几乎所有程序员一开始都是这么折腾过来的。
选择合适的教程。有些书很经典,但未必适合你,可能你写了上万行代码之后再看它会比较好。
写代码,然后写更多的代码。光看教程,编不出程序。从书上的例程开始写,再写小程序片段,然后写完整的项目。
除了学习编程语言,也兼顾补一点计算机基础,和英语。
不但要学写代码,还要学会看代码,更要会调试代码。读懂你自己程序的报错信息。再去找些github上的程序,读懂别人的代码。
学会查官方文档,用好搜索引擎和开发者社区。
现在有很多人都想学一点编程,但是直接看教程又有点太难下手。
学习可以按照以下路线进行:
阶段一:Python开发基础
Python全栈开发与人工智能之Python开发基础知识学习内容包括:Python基础语法、数据类型、字符编码、文件操作、函数、装饰器、迭代器、内置方法、常用模块等。
阶段二:Python高级编程和数据库开发
Python全栈开发与人工智能之Python高级编程和数据库开发知识学习内容包括:面向对象开发、Socket网络编程、线程、进程、队列、IO多路模型、Mysql数据库开发等。
阶段三:前端开发
Python全栈开发与人工智能之前端开发知识学习内容包括:Html、CSS、JavaScript开发、Jquery&bootstrap开发、前端框架VUE开发等。
阶段四:WEB框架开发
Python全栈开发与人工智能之WEB框架开发学习内容包括:Django框架基础、Django框架进阶、BBS+Blog实战项目开发、缓存和队列中间件、Flask框架学习、Tornado框架学习、Restful API等。
阶段五:爬虫开发
Python全栈开发与人工智能之爬虫开发学习内容包括:爬虫开发实战。
阶段六:全栈项目实战
Python全栈开发与人工智能之全栈项目实战学习内容包括:企业应用工具学习、CRM客户关系管理系统开发、路飞学城在线教育平台开发等。
阶段七:数据分析
Python全栈开发与人工智能之数据分析学习内容包括:金融量化分析。
阶段八:人工智能
Python全栈开发与人工智能之人工智能学习内容包括:机器学习、图形识别、无人机开发、无人驾驶等。
阶段九:自动化运维&开发
Python全栈开发与人工智能之自动化运维&开发学习内容包括:CMDB资产管理系统开发、IT审计+主机管理系统开发、分布式主机监控系统开发等。
阶段十:高并发语言GO开发
Python全栈开发与人工智能之高并发语言GO开发学习内容包括:GO语言基础、数据类型与文件IO操作、函数和面向对象、并发编程等。
想要系统的自学Python,就要有一套系统的学习Python的视频教程,如果是0基础,可以先从Python基础课程学习,学习的过程中要边看视频,边动手操作,入门之后,可以找一些实践试题做一做,多思考原理,这样就能从根本上学会Python,学习的后期要动手做项目,毕竟Python技术的掌握是要从实践中来的,只要你能坚持,动手能力强,智商还算正常,学好Python就不是什么问题的!