《Python学习手册》学习总结
-
- 第三章 如何运行程序
- 第四章 介绍Python对象类型
- 第五章 数字
- 第六章 动态类型简介
- 第七章 字符串
- 第八章 列表
- 第9章 元组、文件及其他
- 第10章 Python语句简介
- 第11章 赋值、表达式和打印
- 第12章 if测试
- 第13章 while和for循环
- 第十四章 文档
- 第十五章 函数基础
- 第十六章 作用域与参数
- 第17章 函数的高级话题
- 第18章 模块:宏伟蓝图
- 第19章 模块代码编写基础
- 第20章 模块包
- 第21章 高级模块话题
- 第22章 OOP:宏伟蓝图
- 第23章 类代码编写基础
- 第24章 类代码编写细节
- 第25章 类的设计
- 第26章 类的高级主题
- 第27章 异常基础
- 第29章 异常的设计
本篇文章是作者关于在学习了《 Python学习手册 》以后,分享的学习心得,在此之前,我们先给大家分享一下这本书:
下载地址: Python学习手册第4版
之前为了编写一个svm分词的程序而简单学了下Python,觉得Python很好用,想深入并系统学习一下,了解一些机制,因此开始阅读《Python学习手册》。
在前两章节都是对基本的信息做了概述,我们从第三章开始。
第三章 如何运行程序
import进行模块导入只能运行一次,多次运行需使用reload。
模块往往是变量名的封装,被认为是命名空间。例如:
#myfile.py
title = "test"
>>>import myfile
>>>print myfile.title
test
替代方案是from,下面有同样的效果:
>>>from myfile import title
>>>print tittle
test
from myfile import * 则可以把myfile所有变量全部导入(第19章内容)。
第四章 介绍Python对象类型
虽然字符串支持多种操作,但是它具有不可变性,即原字符串不能改变,只能用新字符串作为结果赋予一个变量。下面是一个试图改变原字符串的操作及报错信息:
>>> s="spam"
>>> s[0] = 'z'
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: 'str' object does not support item assignment
第五章 数字
str和repr显示格式
>>>num = 1/3.0
>>>num
0.33333333333333331
>>>print num
333333333333
>>>repr(num)
'0.33333333333333331' #交互模式回显
>>>str(num)
'333333333333' #打印语句
浮点数运算在精确方面有缺陷。这和硬件有关,打印结果也不能完全解决。
>>> 0.1+0.1+0.1-0.3
5.551115123125783e-17
>>> print 0.1+0.1+0.1-0.3
5.55111512313e-17
使用小数对象可以进行修正
>>> from decimal import Decimal
>>> Decimal('0.1') + Decimal('0.1') + Decimal('0.1') - Decimal('0.3')
Decimal('0.0')
第六章 动态类型简介
a =
3这个语句实际上执行了三个步骤:创建一个对象代表值3;如果还未创建,创建一个变量a;将变量与新的对象3连接。这时,变量a成为了对象3的一个引用,也可以看做是指针。
类型属于对象,而不是变量,这就很好理解为什么Python中同一个变量名可以作为不同类型的对象的引用了。
在这种机制下,每个对象都有一个引用计数器,当计数器为0时就被系统回收,这便是Python中对象的垃圾收集的方法了。
不同变量引用同一个数字或字符串时,对变量操作(eg.a=3
a=a+2)只是创建了一个新的对象并使它引用新对象,这也是上一章提到的字符串不能改动的原因。而对于一些类型来说,有的操作确实能改变对象,如下所示:
#situation 1
>>>L1=[2,3,4]
>>>L2=L1
>>>L1=24
>>>L2
[2,3,4]
#situation 2
>>L1=[2,3,4]
>>>L2=L1
>>>L2[0]=24
>>>L1
[24,3,4]
为了让两个变量使用不同的对象,可以拷贝对象,使用L2=L1[:]来代替L2=L1即可。对于字典则使用D.copy()方法。标准库的copy模块提供了一个对任意对象的调用方法,下面两种方式的区别暂不讨论:
import copy
X = copy.copy(Y) #表层拷贝
X = copy.deepcopy(Y) #深拷贝
这里就出现了个问题,两个引用是否是同一对象?可以用下面的方式判断:
>>>L=[1,2,3]
>>>M=L
>>>L== M
True
>>>L is M
True
负值索引相当于从末尾倒数。-1就是最后一个元素的索引。对于s=“spam”,-5是个非法的索引值。分号:前的空值表示从第一个开始,后的空值表示直到最后一个。
第七章 字符串
单双引号是一样的,这样允许用户不使用转移字符来实现带有单或双引号的字符串。个人认为避免了按shift才能使用双引号“的麻烦。
>>>'knight"s ',"knight's"
('knight"s ',"knight's")
此外,合并相邻的字符串常量,如’knight"s ’ “knight’s”(中间有空格)会显示为’knight"s
knight’s’。可见,最外层是单引号,为了保持原内容,Python把单引号里的单引号改写成了转义字符,这个例子和书上的不同,更有助于理解。转义字符和C很类似,多了几种;但是Python里没有空字符串,Python为每个字符串保存了内容和长度。同时,如果一个字符串中没有合法的转义编码出现在"“后,那么它将在字符串中保留反斜线。抑制转义的方法是在字符串前加r,如r"C:\new\text.dat”,此时的\n和\t就不会被当做是转义字符,同时,这样做也不必把\改写成\。
三重引号适用于多行的字符串的直接输入而不使用转义字符。利用三重引号也可以实现类似C中/* */注释掉代码的目的。
Unicode字符串通过在前面加u获得。
扩展分片是第三个索引,用作步进。这时完整的分片形式为X[I:J:K],其中步进为K。当步进取-1时,可以把字符串反转,很神奇的方法。
利用分片,可以对字符串进行修改,即把新字符串加到原字符串上,再把原字符串切掉。
字符串格式化的用法与C的printf很像,不同之处在于所有参数外需要加一个(),形成%(arg1,arg2,arg3)的形式。格式化代码请参考原书表格,通用结构:%[(name)][flags][width][.precision]code,其中name可以是字典名,这时在参数表里提供这个字典的键即可。
既然字符串是对象,那么它就有对应的方法。书上介绍了修改字符串的replace()、查找find()、把每个元素取出创建列表的list()、把列表合并成字符串的join()(可以作为list()的反操作)、提取组件的split()。
第八章 列表
用中括号表示列表,列表的组成对象是有序的,组成列表的各个对象允许不同。
用大括号表示字典,字典的组成对象是无序的,字典键的搜索方式是哈希搜索,速度很快。
可以用字典来模拟列表:使用序数作为字典的索引即可。类似地,字典可以用来表示一些稀疏矩阵。
字典的get方法用于避免不存在的键,如果键不存在,返回值是0。
字典接口是使用方式类似字典并且实际工作都和字典一样的一些Python扩展程序的接口。
第9章 元组、文件及其他
用小括号表示元组,元组不能原处修改。
为了避免只含一个元素的元