- 开篇
- 选用教材
- 这3步一定要自己完成
- 新手错误清单
- ValueError: ‘Conv2d_1a_3×3’ is not a valid scope name
- “SyntaxError :invalid syntax”
- “IndentationError:unexpected indent”
- “TypeError: ‘list’ object cannot be interpreted as an integer”
- “NameError: name ‘X’ is not defined”
- “AttributeError: ‘str’ object has no attribute ‘lowerr’”
- “IndexError: list index out of range”
- “KeyError:‘foo’”
- “UnboundLocalError: local variable ‘someVar’ referenced before assignment”
- 学习辅助
开篇
写这份自学手册,有两个目的。
一是觉得现在知识比问题泛滥,选择成本太高,需要人去压缩;
二是认为,自学是每个人都必须掌握的能力,老师再牛,学习还得靠自己。
学编程不仅是学一门语言,更是学语言背后的意义,也就是计算机体系知识,以及解决问题的方法。
观察编程难,主要在三个坎:
- 基本语法,这是对话计算机的基础,先记再熟能生巧;
- 问题抽象,编程整个过程都在抽象层,问题得先抽象;
- 保持精进,出错不可怕,可怕的是丢了那份好奇心。
写过两篇文章,详细讲述了为什么编程难学,该如何解决问题,以及学习方法。**
选用教材
从多本教材中,我挑选了最简单的《简明 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,都有自己的安装方式,照着做,然后运行起来。
python -V
安装完,你会知道,在命令行输入命令名字前,你得先让它知道从哪里找。
了解了它寻找命令的方式,你也就知道,其实一个操作系统上可以安装很多个Python版本。
你也会知道,很多编程语言的安装配置,都是相似的。
关于编辑器、解释器和IDE:
当你能在命令行里执行python命令时,你已经安装好了解释器。
你可以直接在python交互式环境中写代码,比如
但这并不方便修改和保存,你可以用任何编辑器写代码,比如操作系统自带的写字板。
而IDE,就是所谓“集成开发环境”,它可以给你更多辅助,比如语法提示、代码调试等。
相比PyCharm,我更愿意推荐你用VSCode,有两个原因:
- 它更通用,前后端开发都适用,还有很多插件可以定制功能,应用更广;
- 它更轻量,启动速度快,资源占用少,可以开多个一起用。
用VSCode写Python的安装配置过程,可以分为5步:
- 下载 VSCode,并安装软件
- 打开软件,在扩展中搜索“python”,安装扩展
- 新建代码文件,选择解释器版本
- 创建运行或调试配置
- 执行或调试程序
安装第三方模块:
pip install requests
关于环境安装,更详细的指南可以看这里:
VSCode Python 指南
第二步:理解程序执行思维
入门第一个难点,是让你用“高智商”人类思维,模拟出执行的每一个小步。
也许很多时候,你会觉得理所当然,但请照顾下“智商有限”的计算机,因为你们未来会是很好的伙伴。
看完教程后,请你用自己的语言,回答下面的6个问题:
- 什么是变量?
- 程序中有哪些从0开始计数的情况?
- python脚本怎样输入输出?
- 你觉得循环和判断能用在哪?
- 什么是元组、列表、词典?
- python有哪些地方体现出复用思维?
第三步:学会搜索错误提示
错了不要紧,关键是能找到一些线索,去上网搜索,找到答案。
程序错误问题,优先用Google,其次用Bing,实在没办法才用baidu。
国内可以用Chrome浏览器的Ghelper插件,实现Google访问(也仅限于访问Google)。
比如,
你可以复制“NameError: name ‘Print’ is not defined”去搜索,第一页往往都会有相关内容。
但并不是每次都这么好运,这时你可以把具体的信息隐藏掉,看看通用问题。
你可以复制“NameError: name is not defined”去搜索同类的问题。
新手错误清单
ValueError: ‘Conv2d_1a_3×3’ is not a valid scope name
注意中英文符号,如,
- ,和,
- ‘和‘
- ;和;
错误中的×,是中文输入法下的乘号,而不是X
“SyntaxError :invalid syntax”
检查是否在 if , elif , else , for , while , class ,def 声明末尾忘了加冒号
如,
if spam == 42
print('Hello!')
检查是否用错了赋值操作(=)和比较操作(==)
如,
if spam = 42:
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是一种不可变的数据类型,错误代码如,
spam = 'I have a pet cat.'
spam[13] = 'r'
print(spam)
numEggs = 12
print('I have ' + numEggs + ' eggs.')
正确做法:
spam = 'I have a pet cat.'
spam = spam[:13] + 'r' + spam[14:]
print(spam)
numEggs = 12
print('I have ' + str(numEggs) + ' eggs.')
print('I have %s eggs.' % (numEggs))
同类错误中,“TypeError: ‘range’ object does not support item assignment”
这是因为Python2中range()返回list,但Python3中返回的是range object,需要转为list。
正确代码:
spam = list(range(10))
spam[4] = -1
在定义类方法时,“TypeError: myMethod() takes no arguments (1 given)”
需要把方法第一个参数加上,习惯上叫”self”,
class Foo():
def myMethod():
print('Hello!')
a = Foo()
a.myMethod()
“NameError: name ‘X’ is not defined”
这类错误是指代码里调用了没有被定义过的变量。
也有可能你把变量名字写错了,比如少写了个字母,导致解释器识别不了。
“AttributeError: ‘str’ object has no attribute ‘lowerr’”
这类错误是指在调用了错误的对象属性。
也有可能是你把属性名写错了,比如把lower写成了lowerr
“IndexError: list index out of range”
这类错误是指引用超过了list最大范围,错误代码如,
spam = ['cat', 'dog', 'mouse']
print(spam[3])
“KeyError:‘foo’”
这类错误是指引用了不存在的字典键值。
“UnboundLocalError: local variable ‘someVar’ referenced before assignment”
这类错误是指使用了未被定义的局部变量,同时有同名的全局变量,如,
someVar = 42
def myFunction():
print(someVar)
someVar = 100 # 关键是这里定义了局部变量
myFunction()
这类错误比较隐蔽,但是如果习惯了规范,比较少会犯这类错误。
学习辅助
教材内容
- 基本语法:它告诉你程序的结构及组成部分,其中变量命名非常灵活,建议一开始就参考规范养成习惯。
- 运算符与表达式:讲了数值运算、逻辑运算以及计算顺序,其中二进制的位计算如果一开始不理解可以暂时略过,等用到时再回来看;逻辑运算主要会用在条件判断。
- 控制流:if-elif-else是条件判断,for-in是循环迭代(也就是对序列里的元素一个个检验),while是根据条件判断循环执行;for和while都可以实现循环,for更适合对序列迭代。
- 函数:把你设计的执行过程,封印在一个黑盒子里,只留出参数输入和返回结果的洞(返回可以省掉);不建议去用global关键词定义全局变量,有个原则:尽量少用语言提供的特性,除非只有它能帮你解决一堆麻烦。
- 模块:当你积累的黑盒子越来越多时,就可以考虑把它们集合在一起,方便找。
- 数据结构:list, tuple, dictionary and set,就如它们字面意思,是Python最基本的4类数据结构。
- 面向对象:class类是更高维度的抽象,不仅可以重复调用方法,还可以按模板复制出一个个对象,对象内包含了变量数据以及处理数据的方法。
- 输入输出:命令行的打印输出,文件打开和写入,网络收发数据,都是输入输出,因为在操作系统眼中,都是从某个地方把数据搬到程序内存中,然后再从程序内存中把数据搬运到某个设备去。
- 异常:异常是为了能让程序在出现非致命错误时还能执行下去的手段;实践中,我们会用异常来补获错误信息,生成日志。
- 标准库:安装完Python后会自带一堆标准库,比如sys可以对话当前运行的Python解释器,os对话操作系统;标准库很多,一开始不必记,等应用的时候就可以边用边学。
参考规范
参考PEP8规范,编辑器装好PEP8插件后会自动提示,也可以自动格式化。
- 代码文件头部加入#—coding:utf-8—标识
- 统一使用4个空格进行缩进(很多编辑器会提供Tab转4空格的辅助)
- 每行代码尽量不超过80个字符,可以换行
- 模块名、函数名、变量名、类属性和方法,尽量短,都用小写;类名首字母大写;常量全部大写,多词用下划线分离。
- 类方法的第一个参数是self,静态方法第一个参数是cls
参考手册
- 官方文档:最全的文档,虽然不适合作为入门教材,但可以当成一本词典,方便查找如标准库、版本变化等。