Python学习日记(二)
各种常用类型(列表,元组,字符串,字典,集合)的基本操作,以及文件的操作,最后说一下字符的编码和转码。
主要参考Alex老师博客:http://www.cnblogs.com/alex3714/articles/5717620.html
一、列表
列表是用[ ]将多个元素(数据类型可相同可不同)括起来的一种数据类型,各元素用”,”分隔。
列表可以嵌套任何东西。
1、定义列表:
names = [‘1liangxi’,’Alex’,’Tom’]
列表可通过下标来取出元素:
data = names[0]
还可以倒着取:
data = names[-1]#负号代表倒着取,-1代表倒数第一个,-2代表倒数第二个,-3代表倒数第三个.....
2、切片(顾头不顾尾)
names = [“1liangxi”,”Alex”,”Tom”,”Jerry”] print(names[0:3])#顾头:从0开始取。不顾尾:3不取,只取到2 #输出:[“1liangxi”,”Alex”,“Tom”] print(names[0:])#想取到最后一个只能这么取,不能写-1,因为不顾尾 #输出:[“1liangxi”,”Alex”,“Tom”,”Jerry”] print(names[0::2]) #每隔(2-1)个元素,从0一直取到最后。
#输出 ['1liangxi', 'Tom']
3、追加
names = [“1liangxi”,”Alex”,”Tom”,”Jerry”] names.append(“Tony”) #追加只能追加到列表的最后 print(names) #输出: ['1liangxi', 'Alex', 'Tom', 'Jerry', 'Tony']
4、插入
names = [“1liangxi”,”Alex”,”Tom”,”Jerry”] names.insert(2,”Tony”) #前面的数字代表想插入列表的位置下标,后面代表想插入的值。 print(names) #输出: ['1liangxi', 'Alex', 'Tony', 'Tom', 'Jerry']
5、修改
names = [“1liangxi”,”Alex”,”Tom”,”Jerry”] names[2] = “Tony” #修改直接替换掉想修改的值就好 print(names) #输出: ['1liangxi', 'Alex', 'Tony', 'Jerry']
6、删除
names = [“1liangxi”,”Alex”,”Tom”,”Jerry”]
删除有3种方法
(1)del 删除引用
del names[2] #下标 print(names) #输出 ['1liangxi', 'Alex', 'Jerry']
(2)remove( )
names.remove(“Tom”) #指定删除元素 print(names) #输出: ['1liangxi', 'Alex', 'Jerry']
(3)pop( )
names = ["1liangxi","Alex","Tom","Jerry"] print(names.pop( )) #删除最后一个元素并返回该元素 print(names) print(names.pop(1)) #删除列表中下标为3的元素并放回该元素 print(names) #输出: #Jerry #['1liangxi', 'Alex', 'Tom'] #Alex #['1liangxi', 'Tom']
7、扩展
扩展是将两个列表合并起来变成一个列表
names = [“1liangxi”,”Alex”,”Tom”,”Jerry”] names.extend([1,2,3]) #输出:['1liangxi', 'Alex', 'Tom', 'Jerry', 1, 2, 3]
8、拷贝(列表中自带的copy为浅copy)
names = [“1liangxi”,”Alex”,”Tom”,”Jerry”] names_copy = names.copy() print(“names:”,names) print(“names_copy”,names_copy) #输出: #names: ['1liangxi', 'Alex', 'Tom', 'Jerry'] #names_copy ['1liangxi', 'Alex', 'Tom', 'Jerry']
9、统计
names = ["1liangxi","Alex","Tom","Jerry","1liangxi"] print(names.count("1liangxi"))#统计该列表中出现多少次该元素。
10、排序
names = ["1liangxi","3Alex","4Tom","2Jerry"] names.sort()#升序排序 print(names) #输出:['1liangxi', '2Jerry', '3Alex', '4Tom']
Python3里不允许不同数据类型进行排序
names = ["1liangxi","3Alex","4Tom","2Jerry",1,2,3] names.sort() print(names)

11、翻转
将列表反转
names = ["1liangxi","3Alex","4Tom","2Jerry",1,2,3] names.reverse() print(names) #输出:[3, 2, 1, '2Jerry', '4Tom', '3Alex', '1liangxi']
12、获取下标
names = [“1liangxi”,”Alex”,”Tom”,”Jerry”] #若有相同元素,只返回找到的第一个元素的下标。若不在,则会报错。 print(names.index(“Tom”)) #输出:2
二、元组
元组内的元素是使用( )括起来的,元组一旦创立便不能修改。
1、统计
names = (“1liangxi”,”Alex”,”Tom”,”Jerry”,1liangxi) print(name.count(“1liangxi”)) #输出:2
2、获取下标
names = (“1liangxi”,”Alex”,”Tom”,”Jerry”) print(names.index(“1liangxi”)) #输出:0
三、字符串的操作
字符串是不可以进行任何修改的,就算是变大写也是全部覆盖。
name.capitalize() #首字母大写 name.casefold() #大写全部变小写 name.center(50,"-") #输出50个字符,将name放在中间,剩下的位置用’-’补齐 name.count('1') #统计l在name里出现了多少次 name.encode() #将字符串编码成bytes格式 name.endswith("xi") #判断字符串是否以xi结尾 "Alex\tLi".expandtabs(10) #输出'Alex Li', 将\t转换成多长的空格 name.find('A') #查找A,找到返回其索引, 找不到返回-1 name.index(‘a’) #返回a所在字符串的索引 name.isdigit() #该字符串是否为整数 name.split(“,”) #以’,’为分隔符分隔,并将该分隔符删除 name.strip( ) #删除字符串后的空格或换行符
format(格式化输出):
使用{}占位
msg = “my name is {},and age is{}” print(msg.format(“1laingxi”,”22”)) #输出:my name is 1laingxi,and age is22
在{}中填入变量,再在format()中填入相同位置的变量
name = 1liangxi age = 22 msg = “my name is {name},and age is{age}” msg.format(name,age) #输出:my name is 1liangxi,and age is22
format_map():
参数为字典,不过老师说没什么用。
msg = “my name is {name},and age is{age}” msg.format_map({'name':'1liangxi','age':22}) #输出:my name is 1laingxi,and age is22
四、字典操作
字典是用{ }括起来的一种键值对的数据类型,字典的意思就和字面意思一样,通过键可以查找到值。
字典是无序的
key(键)必须是唯一的,所以字典并不会有重复的键。但值可以有相同。
info = {"stu001":"1liangxi","stu002":"Tom","stu003":"Jerry"}
1、增加
增加直接写上键值对就是了
info[“stu004”] = “Jack” print(info) #输出:{'stu001': '1liangxi', 'stu002': 'Tom', 'stu003': 'Jerry', 'stu004': 'Jack'}
2、修改
info[“stu003”] = “1liangxi” print(info) #输出:{'stu001': '1liangxi', 'stu002': 'Tom', 'stu003': '1liangxi'}
3、删除
info = {"stu001":"1liangxi","stu002":"Tom","stu003":"Jerry"}
(1))del
del info["stu003"] print(info) #输出:{'stu001': '1liangxi', 'stu002': 'Tom'}
(2)pop( )
print(info.pop("stu002")) print(info) #输出: #Tom #{'stu001': '1liangxi', 'stu003': 'Jerry'}
(3)popitem() 随机删除一对键值对
info.popitem() print(info) # 输出:{'stu001': '1liangxi', 'stu002': 'Tom'}
4、查找
info = {"stu001":"1liangxi","stu002":"Tom","stu003":"Jerry"}
“stu001” in info #判断是否在字典中,该方法适用于列表,元组,字典,集合。
info.get(“stu001”) #参数Key,返回值为value。如果该key不存在,不会报错,放回None。
5、其他操作
info = {"stu001":"1liangxi","stu002":"Tom","stu003":"Jerry"}
info.values( ) #返回所有value
info.keys( ) #返回所有Key
info.setdefault(“stu001”,”1liangxi”) #第一个参数为Key,第二个参数为key所对应的value。
如果该Key不存在,则会创建一个新的key并对应参数中的value。如果该key存在,则value不会被替代。
info.update(b) #将两个字典合在一起
info.items( ) #将字典变成列表
dict.fromkeys([1,2,3],'testd')#通过一个列表生成默认dict,有个没办法解释的坑,少用吧这个
6、循环字典
for key in info: print(key,info[key]) for k,v in info.items(): #会先把dict转成list,数据里大时莫用 print(k,v)
五、集合
集合是一种将元素用{ }括起来的一种数据类型。
集合是一无序的,不重复的数据类型。
集合主要用于:
(1)去重:把一个列表变为集合,就自动去重了。
(2)关系测试:测试两组数据之间的交集、并集、差集等关系。
常用操作:
1、set(列表)
s = set([1,3,5,7,9]) #将列表转换为集合 print(s) #输出:{1, 3, 5, 7, 9}
2、添加
s = {1,2,3,4,5,6}
s.add(7) #添加一项
print(s)
s.update([7,8,9,10]) #添加多项,参数为一个列表
print(s)
#输出
#{1, 2, 3, 4, 5, 6, 7}
#{1, 2, 3, 4, 5, 6, 7, 8, 9, 10}
3、删除
s = {1,2,,3,4,5,6}
(1) remove( )
s = {1,2,3,4,5,6}
s.remove(5) #参数为在集合中的成员,如果集合中没有该成员则会报错
print(s)
#输出:{1, 2, 3, 4, 6}

(2) discard( )
s = {1,2,3,4,5,6}
s.discard(6) #参数为在集合中的成员,如果集合中没有该成员就do nothing,不会报错。
print(s)
#输出:{1, 2, 3, 4, 5}
4、并集
s = {1,2,3,4,5}
s2 = {3,4,5,6,7}
s3 = s.union(s2) #取并集
print(s3)
s4 = s|s2 #取并集,效果和上面的一样
print(s4)
#输出:
#{1, 2, 3, 4, 5, 6, 7}
#{1, 2, 3, 4, 5, 6, 7}
5、交集
s = {1,2,3,4,5}
s2 = {3,4,5,6,7}
s3 = s.intersection(s2) #取交集
print(s3)
s4 = s&s2 #取交集,效果与上面一样
print(s4)
#输出
#{3, 4, 5}
#{3, 4, 5}
6、差集
s = {1,2,3,4,5}
s2 = {3,4,5,6,7}
s3 = s.difference(s2) #取差集
print(s3)
s4 = s - s2 #取差集,效果与上面一样
print(s4)
#输出:
#{1, 2}
#{1, 2}
7、对称差集
s = {1,2,3,4,5}
s2 = {3,4,5,6,7}
s3 = s.symmetric_difference(s2) #取对称差集(将相同的元素去掉再并集)
print(s3)
s4 = s ^ s2 #取对称差集,效果与上面相同
print(s4)
#输出:
#{1, 2, 6, 7}
#{1, 2, 6, 7}
8、长度
s = {1,2,3,4,5}
print(len(s))
#输出:5
9、判断是否为子集或父集
s = {1,2,3,4,5}
s2 = {1,2,3,4,5,6}
print(s.issubset(s2)) #判断s是否为s2的子集
print(s.issuperset(s2)) #判断s是否为s2的父集
#输出:
#True
#False
10、浅复制
s = {1,2,3,4,5}
s.copy( )
六、文件操作
文件操作的流程:
(1)打开文件,得到一个文件句柄并赋值给一个变量。
(2)通过句柄对文件进行操作。
(3)关闭文件。
打开文件的模式有:
(1)r,只读模式(默认)。
(2)w,只写模式。【不可读;不存在则创建;存在则删除内容;】
(3)a,追加模式。【可读; 不存在则创建;存在则只追加内容;】
(4)"+" 表示可以同时读写某个文件
(5)r+,可读写文件。【可读;可写;可追加】
(6)w+,写读 。【存在则删除内容】
(7)a+,同a
"U"表示在读取时,可以将 \r \n \r\n自动转换成 \n (与 r 或 r+ 模式同使用)
(1)rU
(2)r+U
"b"表示处理二进制文件(如:网络传输(Python3.0网络传输只能用二进制)FTP发送上传ISO镜像文件,linux可忽略,windows处理二进制文件时需标注)
(1)rb
(2)wb
(3)ab
1、打开文件
open(“test”,”r+”,encoding = “utf-8”) #第一个参数为文件名,第二个参数为打开文件格式,第三个参数为编码(若不指定默认使用系统的GBK编码打开)
2、读取文件内容
f = open(“test”,”r+”,encoding = “utf-8”) #不能把open语句放在try块里,因为当打开文件出现异常时,文件对象file_object无法执行close()方法。
f.read( ) #读所有内容
f.read(1024) #读固定字节
f.readline() #读一行
f.readlines() #读所有行,放在一个列表里,每行作为一个元素
若想读取一个文件所有内容,如果文件过大,用read( )方法或readlines( )方法会一次性将内存占满,导致速度变慢。所以采用以下方法:
for line in f: #内存中只有一行的数据,f被变为一个迭代器
print(line)
3、文件句柄
f.seek( )方法 #设置文件句柄
f.tell( )方法 #返回当前文件句柄位置

每次读取文件的时候,句柄位置都会发生变化,所以要想重复读取,需要使用seek( )方法设置文件句柄。
4、修改文件
想要对一个文件进行修改,就是将文件想要修改的部分替换掉,然后后面的部分向后挤。
在内存中可以这样做,但在硬盘中无法这样做。
对文件修改有两种方法:
(1)将文件全部读入内存中,这样可以在内存中修改文件。但是这样做会给内存带来很大的负担,假若内存不够大,便会卡顿。
(2)用只读方法打开原文件,用写方法写一个新文件。每读取一行,便写入新文件中,假如遇到要修改的,就将修改后的数据写入新文件中。
字符串替换 .replace(“被替换的文字”,”替换文字”)
.encoding( ) #打印文件编码
.truncate( ) #清空文件。参数为保留的字节数,不写的话全部清空。
.flush( ) #将文件从缓冲区刷到硬盘,可用于做进度条。
with语句
为了避免打开文件后忘记关闭,可以通过管理上下文,即:
with open('log','r') as f:
...
如此方式,当with代码块执行完毕时,内部会自动关闭并释放文件资源。
在Python 2.7 后,with又支持同时对多个文件的上下文进行管理,即:
with open('log1') as obj1, open('log2') as obj2:
pass
虽然Python垃圾回收机制在最后会关闭文件,但假如你不关闭文件的话,这个文件对象就会一直存在内存中。
七、字符的编码与转码
http://www.cnblogs.com/yuanchenqi/articles/5956943.html
http://www.diveintopython3.net/strings.html
- Python2默认的编码时ASCLL,Python3默认unicode。(改文件头(# -*- coding:utf-8 -*-)告诉解释这个代码的程序,以什么编码格式,把这段代码读入到内存,因为到了内存里,这段代码其实是以bytes二进制格式存的。)
- unicode 分为 utf-32(占4个字节),utf-16(占两个字节),utf-8(占1-4个字节), so utf-16就是现在最常用的unicode版本, 不过在文件里存的还是utf-8,因为utf8省空间。
- 在py3中encode,在转码的同时还会把string 变成bytes类型,decode在解码的同时还会把bytes变回string

encode( )都是转为byte类型
在Python3中要想转为其他格式的编码:
msg = “我爱你” msg_gbk = msg.encode(“gbk”) #因为python3默认使用了Unicode编码,所以不用decode为Unicode。在Python2中需要先转为utf-8 msg_gbk_to_gb2312 = msg.decode(“gbk”).encode(“gb2312”) #先将使用gbk规则将bytes编码,再用gb2312解码。
要想输出中文,那字符串在编码的时候就要使用与会话编码相同的编码规则。
注:(1)Python建议,一行代码别超过80行。
(2)字符串前面加U代表是Unicode编码
浙公网安备 33010602011771号