《Head_First_Python》阅读笔记(1-6章)

前言

最近利用闲暇时间开始学习Python,经朋友介绍,首先从《Head_First_Python》一书下手,现在读了一半,个人觉得此书非常有趣,内容包含了大量有趣的插图小故事,一次性读完100页都没有无聊的感觉,强力推荐Python新手阅读。还是老习惯,阅读过程中将一些知识点记录了下来,写成笔记,以用来查阅使用,也防止以后遗忘。

正文

第一章:初识Python:人人都爱列表

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
>>> movies = ["The Holy Grail","The Life of Brian","The Meaning of Life"]#创建movies列表,类似数组
>>> print(movies[1]) #使用标准的中括号偏移量来访问一个列表槽中的数据项
The Life of Brian
>>> cast = ["Cleese",'Palin','Jones',"Idle"]
>>> print(cast) #显示整个列表
['Cleese', 'Palin', 'Jones', 'Idle']
>>> print(len(cast)) #显示cast列表中的数据项个数
4
>>> print(cast[1])
Palin
>>> cast.append("Gilliam") #在列表末尾增加一个数据项
>>> print(cast)
['Cleese', 'Palin', 'Jones', 'Idle', 'Gilliam']
>>> cast.pop() #删除列表数据的最后一项
'Gilliam'
>>> print(cast)
['Cleese', 'Palin', 'Jones', 'Idle']
>>> cast.extend(["Gilliam","Chapman"]) #在列表末尾增加一个数据项集合
>>> print(cast)
['Cleese', 'Palin', 'Jones', 'Idle', 'Gilliam', 'Chapman']
>>> cast.remove("Chapman") #删除一个特定的数据项
>>> print(cast)
['Cleese', 'Palin', 'Jones', 'Idle', 'Gilliam']
>>> cast.insert(0,"Chapman") #在某个特定的位置前面增加一个数据项
>>> print(cast)
['Chapman', 'Cleese', 'Palin', 'Jones', 'Idle', 'Gilliam']

>>> fav_movies = ["The Holy Grail","The Life of Brian"]
>>> for each_flick in fav_movies: #使用for循环遍历列表
print(each_flick)

The Holy Grail
The Life of Brian
>>> count = 0 #使用while循环遍历列表
>>> while count<len(movies):
print(movies[count])
count = count + 1

The Holy Grail
1975
The Life of Brian
1979
The Meaning of Life
1983

>>> movies = ["The Holy Grail",1975,"Terry Jones & Terry Gilliam",91,["Graham Chapman",["Michael Palin","John Cleese","Terry Gilliam","Eric Idle","Terry Jones"]]]#嵌套列表
>>> print(movies[4][1][3])
Eric Idle

>>> dir(__builtins__) #显示Python提供的内置方法列表,所有小写单词都是BIF(内置函数)
>>> help(input) #查看内置方法的使用方法
>>> def print_lol(the_list):#创建一个函数,其中函数名为print_lol,参数为the_list,本函数实现了递归
for each_item in the_list: #这行以下为函数代码组
if isinstance(each_item,list): #如果each_item是list
print_lol(each_item)
else:
print(each_item)


>>> print_lol(movies) #调用了上面创建的函数(递归)
The Holy Grail
1975
Terry Jones & Terry Gilliam
91
Graham Chapman
Michael Palin
John Cleese
Terry Gilliam
Eric Idle
Terry Jones

Python术语:
BIF:内置函数。
组(suite):Python代码块,会通过缩进来指示分组。
知识点:
标识符是指示数据对象的名字。标识符没有“类型”,不过标识符所指示的数据对象有类型。
列表可以存放任意数据,而且数据可以是混合类型。列表还可以包含其他列表。
列表可以随需要伸缩。数据使用的所有内存都由Python为你管理。
Python使用缩进将语句归组在一起。
isinstance()BIF会检查一个标识符是否指示某个指定类型的数据对象,例如isinstance(each_item,list):检查each_item是否为list
cast.pop(n):删除cast列表的第n项,第一项为cast.pop(0),n为空删除最后一项

第二章:共享你的代码:函数模块

1
2
>>> import sys;sys.path	#Python模块位置,将代码放在以下位置,可以直接用import引入
['', 'D:\\Program Files (x86)\\Python3.3.5\\Lib\\idlelib', 'C:\\Windows\\system32\\python33.zip', 'D:\\Program Files (x86)\\Python3.3.5\\DLLs', 'D:\\Program Files (x86)\\Python3.3.5\\lib', 'D:\\Program Files (x86)\\Python3.3.5', 'D:\\Program Files (x86)\\Python3.3.5\\lib\\site-packages']

构建发布



我们已经有了一个文件夹,其中包含了两个文件:模块代码放在nester.py中,模块的有关数据放在setup.py中,现在来构架发布。
1、构建一个发布文件:在命令行窗口进入文件夹目录,执行以下命令
> d:\Python33\python.exe setup.py sdist
2、将发布安装到Python本地副本中
> d:\Python33\python.exe setup.py install

1
2
3
4
5
6
7
8
9
10
11
>>> import nester	//导入模块
>>> cast = ['palin','cleese','idle','gilliam','chapman']
>>> nester.print_lol(cast) //使用模块中的print_lol函数
palin
cleese
idle
gilliam
chapman

for num in range(level) //遍历0到level-1,并将每次遍历的值赋给num
print(“\t”,end=’’) //使print不换行

Python术语:
使用“三重引号字符串”可以在代码中加入一个多行注释。
知识点:
模块是一个包含Python代码的文本文件。
setpu.py程序提供了模块的元数据,用来构建、安装和上传打包的发布。
如果为函数参数提供一个缺省值,这个函数参数就是可选的。
使用#可以注释一行代码,或者为程序增加一个简短的单行注释。
range()BIF可以与for结合使用,从而迭代固定次数。
包含end=’’作为print()BIF的一个参数会关闭其默认行为(即在输入中自动包含换行。)

第三章:文件与异常:处理错误

文件操作

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
>>> import os	//从标准库导入“os”
>>> os.getcwd() //获得当前工作目录
'D:\\Python33'
>>> os.chdir('c:/python/HeadFirstPython/chapter3') //切换为其他文件夹
>>> os.getcwd()
'c:\\python\\HeadFirstPython\\chapter3'
>>> data = open('sketch.txt') //打开一个命令文件,将文件赋至一个名为“data”的文件对象
>>> print(data.readline,end='') //输出文件中的一个数据行
>>> data.seek(0) //退回到文件的起始位置
0

>>> for each_line in data: //使用for循环遍历整个文件
print(each_line,end='')
>>> data.close() //使用完毕记得关闭文件对象

>>> for each_line in data:
if not each_line.find(‘:’) == -1 //检查each_line中是否存在’:’,如果不存在则返回-1
(role, line_spoken) = each_line.split(':', 1) //根据’:’进行分解1次,’:’前面赋值给role,后面赋值给line_spoken
print(role, end='')
print(' said: ',end='')
print(line_spoken,end='')

两种列表:可变列表(用中括号包围),不可变列表(又称元组,用小括号包围)

异常
exception因运行时错误而出现,会产生一个traceback(运行时错误的详细描述)
数据不符合期望的格式时会出现ValueError,数据无法正常访问时会出现IOError。
异常处理机制:

1
2
3
4
5
6
try:		//如果try语句中出现错误,则会执行except中的语句
......
except:
pass //可以认为是空语句或null语句
finally:
......

1
2
import os
if os.path.exists(‘sketch.txt’): //检查路径是否存在

Python术语:
“异常”(exception)因运行时错误而出现,会产生一个traceback。
知识点:
使用open()BIF打开一个磁盘文件,创建一个迭代器从文件读取数据,一次读取一个数据行。
Python中不可该表的常量列表称为元组。一旦将列表数据赋至一个元组,就不能再该表。
pass语句就是Python的空语句或null语句,它什么也不做。

第四章:持久存储:数据保存到文件

1
2
3
>>> out = open("data.out","w")	//以写模式打开文件data.out,如果文件存在则清空内容,不存在则创建一个
>>> print("Norwegian Blue stun easily.",file = out) //标准输出是屏幕,使用file将写数据对象改为out文件
>>> out.close() //关闭文件,此时才会将数据写入至磁盘,称为刷新输出

追加到一个文件:a
完成写和读:w+

if 'data' in locals(): //locals()会返回当前作用域中定义的所有名的一个集合

代码1:

1
2
3
4
5
6
7
8
try:
data = open('its.txt', “w”)
print(“It’s...”, file = data)
except IOError as err:
print('File error: '+ str(err))
finally:
if 'data' in locals():
data.close()

代码2:

1
2
3
4
5
try:
with open(‘its.txt’, “w”) as data:
print(“It’s...”, file = data)
except IOError as err:
print('File error: '+ str(err))

代码1和代码2的在功能上完全相同,with语句利用了一种名为上下文管理协议的Python技术。

多个调用的情况:

1
2
3
4
with open(‘data1.txt’, “w”) as data1:
print(“It’s...”, file = data1)
with open(‘data2.txt’, “w”) as data2:
print(“It’s...”, file = data2)

或者

1
2
3
with open(‘data1.txt’, “w”) as data1,open(‘data2.txt’, “w”) as data2:
print(“It’s...”, file = data1)
print(“It’s...”, file = data2)

“腌制”数据:pickle

1
2
3
4
5
6
7
8
9
10
11
12
import pickle	//导入pickle模块

try:
with open('mydata.pickle','wb') as mysavedata: //wb:使用二进制写打开
pickle.dump([1,2,'three'],mysavedata) //使用dump保存数据到文件

with open('mydata.pickle','rb') as myrestoredata: //rb:使用二进制读打开
a_list = pickle.load(myrestoredata) //使用load从文件中恢复数据,并赋至a_list

print(a_list)
except:
print('error')

Python术语:
“腌制”:将数据对象保存到一个持久存储中的过程。
“解除腌制”:从持久存储中恢复一个已保存的数据对象的过程。
知识点:
strip()方法可以从字符串去除不想要的空白符
print()的file参数控制将数据发送/保存到哪里
finally组总会执行,而不论try/except语句中出现什么异常
会向except组传入一个异常对象,并使用as关键字赋至一个标识符
str()可以用来访问任何数据对象(支持串转换)的串表示
locals()返回当前作用域的变量集合
in操作符用于检查成员关系
“+”操作符用于字符串时将联接两个字符串,用于数字时则会将两个数相加
with语句会自动处理所有已经打开文件的关闭工作,即使出现异常也不例外。with语句也使用as关键字
sys.stdout是Python中所谓的“标准输出”,可以从标准库的sys模块访问
标准库的pickle模块允许你容易而高效地将Python数据对象保存到磁盘及从磁盘恢复。
pickle.dump()函数将数据保存到磁盘
pickle.load()函数从磁盘回复数据

第五章:处理数据

1
2
3
4
5
6
7
8
9
10
11
12
>>> data = [6,3,1,2,4,5]
>>> data
[6, 3, 1, 2, 4, 5]
>>> data.sort() //对数据进行原地排序
>>> data
[1, 2, 3, 4, 5, 6] //数据顺序已经改变
>>> data = [6,3,1,2,4,5]
>>> data2 = sorted(data) //对数据进行复制排序
>>> data
[6, 3, 1, 2, 4, 5] //与原先一样
>>> data2
[1, 2, 3, 4, 5, 6] //复制的数据从小到大排序

sort()和sorted()默认按升序对数据排序,要以降序对数据排序,需要传入参数reverse=True

列表推导:clean_mikey = [sanitize(each_t) for each_t in mikey]
clean_mikey:创建新列表
sanitize:指定一个转换
each_t:应用于各个数据项
mikey:一个现有列表

例子:

1
2
3
4
5
6
7
8
9
>>> mins =[1,2,3]
>>> secs = [m*60 for m in mins]
>>> secs
[60, 120, 180]

>>> lower = ["I","don't","like","spam"]
>>> upper = [s.upper() for s in lower]
>>> upper
['I', "DON'T", 'LIKE', 'SPAM']

工厂函数:用于创建某种类型的新的数据项。
set():集合,无序、不允许重复

1
2
3
4
5
distances = set()	//用set()创建一个新的空集合,并赋至变量distances
>>> distances=set()
>>> distances={1,2,3,4,5,2,1}
>>> distances
{1, 2, 3, 4, 5}

列表分片
list[3:6] //这会访问列表中从索引位置3直到索引位置5的列表项(list[3],list[4],list[5])

Python术语:
“原地”排序:转换然后替换。
“复制”排序:转换然后返回。
“方法串链”:从左向右读,对数据应用一组方法。
“函数串链”:从右向左读,对数据应用一组函数。
知识点:
sort()方法可以在原地改变列表的数序。
sorted()BIF通过提供复制排序可以对几乎任何数据结构排序。
要访问一个列表中的多个数据项,可以使用分片。
使用set()工厂方法可以创建一个集合。

第六章:定制数据对象

字典:这是一个内置的数据结构(内置于python中),允许将数据与键而不是数字关联。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
>>> cleese={}	//使用大括号创建空字典
>>> palin=dict() //使用工厂函数也能创建空字典
>>> type(cleese) //查看类型
<class 'dict'>
>>> type(palin)
<class 'dict'>
>>> cleese['Name'] = 'John Cleese' //通过将值与键关联,增加一些数据
>>> cleese['Occupations']=['actor','comedian','writer','film producer']
>>> cleese['age']=23
>>> palin = {'Name':'Michael Palin','Occupations':['comedian','actor','writer','tv']} #也可以一次性创建并增加数据
>>> palin['Name'] //使用中括号指定的字典中的索引来访问数据项
'Michael Palin'
>>> palin['Birthplace']="Broomhill, Sheffield, England"
>>> cleese['Birthplace']="Weston-super-Mare, North Somerset, England"
>>> cleese
{'Birthplace': 'Weston-super-Mare, North Somerset, England', 'Occupations': ['actor', 'comedian', 'writer', 'film producer'], 'Name': 'John Cleese', 'age': 23}
>>> palin
{'Birthplace': 'Broomhill, Sheffield, England', 'Occupations': ['comedian', 'actor', 'writer', 'tv'], 'Name': 'Michael Palin'}

类(class)
在一个对象实例上调用类方法时,Python要求第一个参数是调用对象实例,因此类中定义的所有方法需要self作为它的第一个参数

创建一个定制类:

继承

Python术语:
“字典”:这时一个内置的数据结构,允许将数据值与键关联。
知识点:
类似于列表和集合,Python的字典会随着新数据增加到这个数据结构中而动态扩大。
类方法(代码)与函数的定义基本相同,也就是说,要用def关键字定义。
类中的每个属性前面都必须有self,从而将数据与其实例关联。
类可以从零开始构建,也可以从Python的内置类或其他定制类继承。