元组tuple
元组是序列,具有不可变性,支持任意类型、任意嵌套(包括可变的对象)。(Python手册上讲,元组是不可变的序列。)它的不可变性是它存在的最大意义。
元组方法
没有列表辣么多
T = ("a",) #仅有一个元素的元组,如果没有逗号,则只是一个值而不是元组
T = tuple('ssddg')
T = (1, 2, 3, 4)
T = 1, 2, 3, 4 #括号可以省略
T.index(4) # 返回内容为4 的序号,此处返回3
T.count(4) # 返回内容为4 的出现次数
文件
没有特定的常量语法创建文件
# 写文件
f = open('data.txt', 'w') #创建、打开一个文件,并以写的方式处理,括号里有第三个参数,当为‘0’时代表无缓存写入
f.write('Hello\n') # 该语句会写入字符串(如果非字符串对象必须先进行转换),并返回写入字符数
f.close() #如果不写,Python会自动关闭文件,但写上是个好习惯
#读文件
f = open('data.txt') #默认为读
text = f.read() # 读出字符串,会含有转义符
t1 = f.readline()#读第一行
t2 = f.readline() #读第二行,当是空行是会返回一个含有新行符的字符串,当是文件底部时会返回一个空字符串
for line in open('data.txt'): #迭代器
print(line,end='')
dir(f) # 可以获取文件相关的更多操作
如今读取一个文件的最佳方式是根本不读它,文件提供了一个迭代器(iterator),它在for循环或其他环境中自动地一行一行地读取。——《Python学习手册》P110
pickle块
当向文件中写入时,使用open-write方法只能写入字符串,对于其他类型,必须提前转化为字符串才能写入。对文件读出亦是只能读出字符串,然后手动转化为其他格式。pickle块是简化以上步骤的高级工具(该过程被称为对象序列化)。其使用方法如下:
# 写文件
T=("a",1)
M=[1,3,4]
Q={'A':1, 'B':2, 'C':3}
F = open('test.txt', 'wb') # 注意此处必须是二进制的,文件后缀也可以写作.pkl
import pickle
pickle.dump(T, F)
pickle.dump(M, F)
pickle.dump(Q, F)
F.close()
# 读文件
F = open('test.txt', 'rb') # 注意此处必须是二进制的
import pickle
E1 = pickle.load(F) #('a', 1)
E2 = pickle.load(F) #[1, 3, 4]
E3 = pickle.load(F) #{'A': 1, 'B': 2, 'C': 3}
struct块
一个可以将普通对象打包成二进制字符串的模块。
集合set
是唯一的、不可变的对象的无序集合(其整体是不可变的,包含对象也是不可变的,即不可包含列表、字典,此外包含对象也不可以是set(但可以用frozenset创建一个集合嵌入在其他set中),若想要复合类型对象可以选择元组),像一个没有值的字典的键。
X = set('spam') #创建集合,此方法可以创建空集合
Y = {'h', 'a', 'm'} #另一种创建集合的方法,仅用于Python3
{x ** 2 for x in [1, 2, 3, 4]} #另一种创建集合的方法,仅用于Python3
#使用{}不能创建空集合,创建的是空字典
##集合支持一般的数学集合操作,而一般序列则不可以
X, Y
X & Y
X | Y #并集
X - Y
X ^ Y # XOR异或,即并集减交集
's' in X #判断是否在集合中
X < Y #判断X是否为Y的子集
X > Y
- 集合的常用方法:
#以下未写Z=的方法都是没有返回值的,但是X会改变(但这不代表集合是可变的)
Z = X.intersection(Y) # 等同于X&Y
Z = X.difference(Y) # 等同于X - Y
Z = X.union(Y) #等同于X|Y
Z = X.symmetric_difference(Y) #等同于X^Y
X.intersection_update(Y) #等同于X = X&Y
X.difference_update(Y) #等同于X = X - Y
X.update(Y) #等同于X = X - Y
X.symmetric_difference_update(Y) #等同于X = X^Y
X.add('spam') #对set添加内容,注意一次只能加一个元素,此时spam不再分开而是作为整个字符串添加为X的一个元素
Z = X.pop()#随机去掉一个元素,Z是那个元素,X比之前少了Z
X.remove('f')#除去某元素,如果该元素不在X中,则会报错
X.discard('f')# 除去某元素,如果该元素不在X中,则不进行操作
X.clear()
Z = X.copy()
#以下方法均返回布尔值
X.isdisjoint(Y)#如果XY无交集则返回Ture
X.issubset(Y) #等同于X<Y
X.issuperset(Y)#等同于X>Y
可以看到,集合的某些自带方法和用操作符操作的效果相似,但是二者并不是完完全全一样的:使用操作符对两个对象进行操作必须保证两个都是集合类型,否则会报错!而自带方法不要求括号中的对象一定是个集合,可以是列表、元组还有range(),这就是自带方法的优势所在!
- 此外,集合支持len、for循环和列表解析,不支持索引和分片。
其列表解析:
for item in set('abc') :print(item*3)
{x ** 2 for x in [1, 2, 3, 4]}#实际上就是把列表解析结果再转换为集合{1, 4, 9, 16}
{x for x in 'spam'} # {'a', 'm', 'p', 's'}
{c * 4 for c in 'spam'} # {'aaaa', 'mmmm', 'pppp', 'ssss'}
{c * 4 for c in 'spamam'} # {'aaaa', 'mmmm', 'pppp', 'ssss'}
- 由于集合的内容是不可重复的,因此它可以用来过滤其他collection的项:将可重复复合对象(如list)先转换为set,再转换回去,即可去重(但是顺序有可能被打乱)。
- 集合可以用来记录已经访问过的位置,便于遍历。
- 其交并补操作便于数据库查询结果的操作。