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'}

 

 

2pop( )

 

print(info.pop("stu002"))

print(info)

#输出:
#Tom
#{'stu001': '1liangxi', 'stu003': 'Jerry'}

 

 

3popitem() 随机删除一对键值对

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)关闭文件。

 

 

打开文件的模式有:

  

1r,只读模式(默认)。

2w,只写模式。【不可读;不存在则创建;存在则删除内容;】

3a,追加模式。【可读;   不存在则创建;存在则只追加内容;】

4"+" 表示可以同时读写某个文件  

5r+,可读写文件。【可读;可写;可追加】

6w+,写读 。【存在则删除内容】

7a+,同a

 

"U"表示在读取时,可以将 \r \n \r\n自动转换成 \n (与 r r+ 模式同使用)  

1rU

2r+U

 

"b"表示处理二进制文件(如:网络传输(Python3.0网络传输只能用二进制)FTP发送上传ISO镜像文件,linux可忽略,windows处理二进制文件时需标注)  

1rb

2wb

3ab

 

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

 

  1. Python2默认的编码时ASCLLPython3默认unicode。(改文件头(# -*- coding:utf-8 -*-)告诉解释这个代码的程序,以什么编码格式,把这段代码读入到内存,因为到了内存里,这段代码其实是以bytes二进制格式存的。)
  2. unicode 分为 utf-32(4个字节),utf-16(占两个字节)utf-8(1-4个字节)so utf-16就是现在最常用的unicode版本, 不过在文件里存的还是utf-8,因为utf8省空间。
  3. py3encode,在转码的同时还会把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解码。

 

 

要想输出中文,那字符串在编码的时候就要使用与会话编码相同的编码规则。

 

注:(1Python建议,一行代码别超过80行。

2)字符串前面加U代表是Unicode编码

posted @ 2017-10-19 00:58  1liangxi  阅读(157)  评论(0)    收藏  举报