开篇

写这份自学手册,有两个目的。
一是觉得现在知识比问题泛滥,选择成本太高,需要人去压缩;
二是认为,自学是每个人都必须掌握的能力,老师再牛,学习还得靠自己。

学编程不仅是学一门语言,更是学语言背后的意义,也就是计算机体系知识,以及解决问题的方法。
观察编程难,主要在三个坎:

  1. 基本语法,这是对话计算机的基础,先记再熟能生巧;
  2. 问题抽象,编程整个过程都在抽象层,问题得先抽象;
  3. 保持精进,出错不可怕,可怕的是丢了那份好奇心。


写过两篇文章,详细讲述了为什么编程难学,该如何解决问题,以及学习方法。**

  1. 《有一种执着,叫“我要学编程”》
  2. 《我学计算机,也会修电脑》

选用教材

从多本教材中,我挑选了最简单的《简明 Python 教程》,方便入门。
作者:Swaroop C H,译者:沈洁元
英文版:《A Byte of Python》
Github:《A Byte of Python》

byte-of-python-chinese-edition (1).pdf

注意:请确保使用Python3版本,比如Python3.7版本,因为Python2版本已经停止官方维护。

这3步一定要自己完成

第一步:请你亲自安装环境

虽然很多培训课会自带编辑器,培训班甚至自带电脑,但“学会编程”,是指让你能在任何一台电脑上编程。
不管是Windows,还是MacOS,或是Linux or Unix,都有自己的安装方式,照着做,然后运行起来。

  1. python -V

安装完,你会知道,在命令行输入命令名字前,你得先让它知道从哪里找。
了解了它寻找命令的方式,你也就知道,其实一个操作系统上可以安装很多个Python版本。
你也会知道,很多编程语言的安装配置,都是相似的。

关于编辑器、解释器和IDE:
当你能在命令行里执行python命令时,你已经安装好了解释器。
你可以直接在python交互式环境中写代码,比如
image.png
但这并不方便修改和保存,你可以用任何编辑器写代码,比如操作系统自带的写字板。
而IDE,就是所谓“集成开发环境”,它可以给你更多辅助,比如语法提示、代码调试等。
相比PyCharm,我更愿意推荐你用VSCode,有两个原因:

  1. 它更通用,前后端开发都适用,还有很多插件可以定制功能,应用更广;
  2. 它更轻量,启动速度快,资源占用少,可以开多个一起用。

image.png
image.png

用VSCode写Python的安装配置过程,可以分为5步:

  1. 下载 VSCode,并安装软件
  2. 打开软件,在扩展中搜索“python”,安装扩展
  3. 新建代码文件,选择解释器版本
  4. 创建运行或调试配置
  5. 执行或调试程序

安装第三方模块:

  1. pip install requests

关于环境安装,更详细的指南可以看这里:
VSCode Python 指南

第二步:理解程序执行思维

入门第一个难点,是让你用“高智商”人类思维,模拟出执行的每一个小步。
也许很多时候,你会觉得理所当然,但请照顾下“智商有限”的计算机,因为你们未来会是很好的伙伴。

看完教程后,请你用自己的语言,回答下面的6个问题:

  1. 什么是变量?
  2. 程序中有哪些从0开始计数的情况?
  3. python脚本怎样输入输出?
  4. 你觉得循环和判断能用在哪?
  5. 什么是元组、列表、词典?
  6. python有哪些地方体现出复用思维?

第三步:学会搜索错误提示

错了不要紧,关键是能找到一些线索,去上网搜索,找到答案。

程序错误问题,优先用Google,其次用Bing,实在没办法才用baidu。
国内可以用Chrome浏览器的Ghelper插件,实现Google访问(也仅限于访问Google)。

比如,
image.png
你可以复制“NameError: name ‘Print’ is not defined”去搜索,第一页往往都会有相关内容。
image.png
但并不是每次都这么好运,这时你可以把具体的信息隐藏掉,看看通用问题。
你可以复制“NameError: name is not defined”去搜索同类的问题。
image.png

新手错误清单

ValueError: ‘Conv2d_1a_3×3’ is not a valid scope name

注意中英文符号,如,

  • ,和,
  • ‘和‘
  • ;和;

错误中的×,是中文输入法下的乘号,而不是X

“SyntaxError :invalid syntax”

检查是否在 if , elif , else , for , while , class ,def 声明末尾忘了加冒号
如,

  1. if spam == 42
  2. print('Hello!')

检查是否用错了赋值操作(=)和比较操作(==)
如,

  1. if spam = 42:
  2. print('Hello!')

检查有没有用Python保留的关键词,如class、if、else等,这些不能当变量名。
此外,Python不错在 ++ 或者 — 自增自减操作符。

同类错误如:
“SyntaxError: EOL while scanning string literal”

这是因为某个字符串首尾引号没有配齐,少了一个。

“IndentationError:unexpected indent”

这类错误是指代码的缩进格式有问题,检查代码的空格或者Tab制表符。
最常见的问题就是TAB和space键的混用,这个是很容易报错的,借助IDE编辑器可以减少犯错机率。

同类错误还有如:
“IndentationError:unindent does not match any outer indetation level”
“IndentationError:expected an indented block”

“TypeError: ‘list’ object cannot be interpreted as an integer”

同类问题还有如,
“TypeError: ‘str’ object does not support item assignment”
“TypeError: Can’t convert ‘int’ object to str implicitly”

这是因为string是一种不可变的数据类型,错误代码如,

  1. spam = 'I have a pet cat.'
  2. spam[13] = 'r'
  3. print(spam)
  4. numEggs = 12
  5. print('I have ' + numEggs + ' eggs.')

正确做法:

  1. spam = 'I have a pet cat.'
  2. spam = spam[:13] + 'r' + spam[14:]
  3. print(spam)
  4. numEggs = 12
  5. print('I have ' + str(numEggs) + ' eggs.')
  6. print('I have %s eggs.' % (numEggs))

同类错误中,“TypeError: ‘range’ object does not support item assignment”
这是因为Python2中range()返回list,但Python3中返回的是range object,需要转为list。
正确代码:

  1. spam = list(range(10))
  2. spam[4] = -1

在定义类方法时,“TypeError: myMethod() takes no arguments (1 given)”
需要把方法第一个参数加上,习惯上叫”self”,

  1. class Foo():
  2. def myMethod():
  3. print('Hello!')
  4. a = Foo()
  5. a.myMethod()

“NameError: name ‘X’ is not defined”

这类错误是指代码里调用了没有被定义过的变量。
也有可能你把变量名字写错了,比如少写了个字母,导致解释器识别不了。

“AttributeError: ‘str’ object has no attribute ‘lowerr’”

这类错误是指在调用了错误的对象属性。
也有可能是你把属性名写错了,比如把lower写成了lowerr

“IndexError: list index out of range”

这类错误是指引用超过了list最大范围,错误代码如,

  1. spam = ['cat', 'dog', 'mouse']
  2. print(spam[3])


记住list从0开始计数。

“KeyError:‘foo’”

这类错误是指引用了不存在的字典键值。

“UnboundLocalError: local variable ‘someVar’ referenced before assignment”

这类错误是指使用了未被定义的局部变量,同时有同名的全局变量,如,

  1. someVar = 42
  2. def myFunction():
  3. print(someVar)
  4. someVar = 100 # 关键是这里定义了局部变量
  5. myFunction()

这类错误比较隐蔽,但是如果习惯了规范,比较少会犯这类错误。

学习辅助

教材内容

  1. 基本语法:它告诉你程序的结构及组成部分,其中变量命名非常灵活,建议一开始就参考规范养成习惯。
  2. 运算符与表达式:讲了数值运算、逻辑运算以及计算顺序,其中二进制的位计算如果一开始不理解可以暂时略过,等用到时再回来看;逻辑运算主要会用在条件判断。
  3. 控制流:if-elif-else是条件判断,for-in是循环迭代(也就是对序列里的元素一个个检验),while是根据条件判断循环执行;for和while都可以实现循环,for更适合对序列迭代。
  4. 函数:把你设计的执行过程,封印在一个黑盒子里,只留出参数输入和返回结果的洞(返回可以省掉);不建议去用global关键词定义全局变量,有个原则:尽量少用语言提供的特性,除非只有它能帮你解决一堆麻烦。
  5. 模块:当你积累的黑盒子越来越多时,就可以考虑把它们集合在一起,方便找。
  6. 数据结构:list, tuple, dictionary and set,就如它们字面意思,是Python最基本的4类数据结构。
  7. 面向对象:class类是更高维度的抽象,不仅可以重复调用方法,还可以按模板复制出一个个对象,对象内包含了变量数据以及处理数据的方法。
  8. 输入输出:命令行的打印输出,文件打开和写入,网络收发数据,都是输入输出,因为在操作系统眼中,都是从某个地方把数据搬到程序内存中,然后再从程序内存中把数据搬运到某个设备去。
  9. 异常:异常是为了能让程序在出现非致命错误时还能执行下去的手段;实践中,我们会用异常来补获错误信息,生成日志。
  10. 标准库:安装完Python后会自带一堆标准库,比如sys可以对话当前运行的Python解释器,os对话操作系统;标准库很多,一开始不必记,等应用的时候就可以边用边学。

参考规范

参考PEP8规范,编辑器装好PEP8插件后会自动提示,也可以自动格式化。

  1. 代码文件头部加入#—coding:utf-8—标识
  2. 统一使用4个空格进行缩进(很多编辑器会提供Tab转4空格的辅助)
  3. 每行代码尽量不超过80个字符,可以换行
  4. 模块名、函数名、变量名、类属性和方法,尽量短,都用小写;类名首字母大写;常量全部大写,多词用下划线分离。
  5. 类方法的第一个参数是self,静态方法第一个参数是cls

参考手册

  • 官方文档:最全的文档,虽然不适合作为入门教材,但可以当成一本词典,方便查找如标准库、版本变化等。