组合数据类型
5种内置的序列类型:bytearray,bytes,list,str,tuple
元组
元组:固定,有序,索引从0开始,分片,步距语法支持
不能替换或者删除其中的任意数据项,使用list()元组可以转换为list,之后就可以修改了
tuple在不指定参数时返回一个空元组
可以使用()创建空元组
在元组作为参数传递时必须加()避免歧义
元组提方法
t.count(x)返回x在元组中出现的次数;
t.index(x)返回x在元组t中出现的最左边位置,如果元组中不包含x,那么抛出ValueError异常
元组使用的操作符
+,*,[],in ,not in ,+=,*=,(实际上创建了新元组)
<,<=,==,!=,>=,> 逐项进行比较
序列拆分
左边是元组,右边是序列,称为右边拆分,拆分用于交换值
>>> a,b=(1,2)
>>> a
1
>>> b
2
>>> a,b
(1, 2)
>>> a,b=(b,a)
>>> a,b
(2, 1)
for ...in...
>>> for x,y in ((1,2),(2,3),(3,4)):
print(x,y) 1 2
2 3
3 4
命名的元组
和普通元组一样,可以根据名称来引用元组中的项
collections.namedtuple(n,s)函数,该函数用于创建自定义的元组数据类型
第一个参数是想要创建的字符串元组名称
第二个参数是字符串,其中包含使用空格分隔的名称,每个名称代表该元组数据类型中的一项
列表
列表是包含0个或多个对象引用的有序序列,支持分片,步距
列表是可变的,可以进行删除,替换,插入
list()不带参数调用时返回一个空列表,带一个list参数时,返回该参数的浅拷贝,对任意多个参数,则尝试将给定的对象转换为列表。
列表可以使用[]创建
列表中所有数据项实际上都是对象引用,因此和元组一样。列表也可以存放任意类型的数据项。
列表可以使用比较操作符<,<=,==,!=,>=,> 逐项处理
列表方法
l.append(x) 将数据项x追加到列表l的尾部
l.count(x) 数据项x在列表中出现的次数
l.extend(x),l+=x 将迭代x追加到l尾部
l.index(x,start,end) 返回数据项x在列表中最左边出现的索引位置
l.insert(i,x)在索引位置int i处将数据项 x插入列表l
l.pop()返回并移除l中索引位置int i处的数据项
l.pop(i)返回并移除l中索引位置i处的数据项
l.remove(x)从list中移除最左边的数据项x,如果找不到x,产生ValueError异常
l.sort()对列表l进行排序,与内置的sorted()函数一样,这个方法可以接受可选的key与reverse
序列拆分
用于赋值操作符左边有两个或者多个变量时,其中的一个使用*进行引导,数据项赋值给该变量,而所有剩下的数据项赋值给带*的变量
>>> first,*second=[1,2,3,4,5]
>>> first
1
>>> second
[2, 3, 4, 5]
函数调用使用带*的参数
>>> def getadd(a,b,c):
return a+b+c >>> getadd(1,2,3)
6
>>> L=[1,2,3]
>>> getadd(*L)
6
del操作
del的作用是取消变量的引用
>>> a=1
>>> del a
*操作符是用作复制操作符还是拆分操作符并不会产生二义性,
当*出现在赋值操作的左边是,用作拆分操作符,若用作单值操作符,则代表拆分操作符,若用作二进制操作符,则代表复制操作
列表内涵
小列表通常使用列表字面值直接创建,但长一些的列表,对一系列系数我们可以使用 list(range(10)),或者如果只需要一个整数迭代,使用range()足够完成任务,但对更复杂一些的列表使用for...in...循环创建是一种常见的做法。
列表内涵是一个表达式,也是一个循环,该循环有一个可选的,包含在方括号中的条件,作用是为列表生成数据项,
并且可以使用条件过滤不需要的数据项
[item for item in iterable]
可以使用表达式,可以附加条件
[expression for item in iterable]
[expression for item in iterable if condition]
range(n)
>>> a=list(range(10))
>>> a
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> leaps=[y for y in range(1900,1940) if y%4==0]
>>> leaps
[1900, 1904, 1908, 1912, 1916, 1920, 1924, 1928, 1932, 1936]
集合类型
set也是一种组合数据类型
支持成员关系操作符in,对象大小计算操作符len(),支持比较,支持逻辑操作
set分两种:可变的set,固定的frozenset
只有可哈希运算的对象可以增加到集合中,可哈希运算的对象包含一个__hash__()方法,返回值在某个对象的声明周期中都是相同的
并且可以使用__eq__()方法进行相等性比较
所有内置的固定数据类型都是可hash运算的(float,fozenset,int,str,tuple)
内置可变的数据类型都是不可hash运算的(dict,list,set)
集合是0个或多个对象引用的无序组合,集合是可变的,没有索引位置的概念,也不能分片或按步距分片
set() 不带参数进行调用返回一个空的set,带一个set参数时返回该对象的浅拷贝,对任意其他数据类型尝试进行转换
空集合必须使用set()创建
集合中包含的数据项都是独一无二的,增加重复的数据项固定不会引发问题,但是毫无意义
>>> s=set("apple")
>>> s1=set("aple")
>>> s==s1
True
集合常用语删除重复项
>>> x=list(set("apple"))
>>> x
['p', 'a', 'e', 'l']
集合支持 len(),也支持in,not in
s.add(x) 将数据项x增加到集合s中,若果s中尚未包含x
s.clear() 移除集合s中的所有项
s.copy() 返回集合s的浅拷贝
s.difference(t)s-t 返回一个新集合,其中包含在s中但不在集合t中的所有数据项
s.differecnce_update(t)s-=t 移除每一个在集合t但不在集合s中的项
s.discard(x)如果数据项x存在于集合s中,就移除该数据项
s.intersection(t)s&t返回一个新集合,其中包含所有同时包含在集合t与s中的数据项
s.intersection_update(t)s&=t使得集合s包含自身与集合t的交集
s.isdisjoint(t)如果s与t没有相同项,返回true
s.issubset(t)s<=t如果集合s与集合t相同,或者是t的自己,就返回true,使用s<t可以测试 s是否是t的真子集
s.issuperset(t)s>=t如果集合s与集合t相同,或者是t的超集,返回true,使用s>t可以测试t是否是s的真子集
s.pop()返回并移除集合s中一个随即项,如果s为空集,就产生KeyError异常
s.remove(x) 从集合s中移除数据项x,如果s中不包含x就产生KeyError异常
s.symmetric_difference(t)s^t返回一个新集合,其中包含s与t中的每一个数据项,但不包含相同项
s.symmetric_difference_update(t)s^=t使得集合s只包含其自身与集合t的对称差
s.union(t) s|t返回一个新集合,其中包含集合s中的所有数据项一级在t中而不在s中的数据项
s.update(t) s|=t 将集合t中每个s中不包含的数据项都增加到集合s中
集合类型的一个常用场景是进行快速的成员关系测试。
>>> x={"192.168.1.1","192.168.1.2"}
>>> x
{'192.168.1.1', '192.168.1.2'}
>>> '192.168.1.1' in x
True
>>> s=sorted(set("apple"))
>>> s
['a', 'e', 'l', 'p']
集合的内涵
除调用set()创建集合,或使用集合字面值创建集合外,我们可以使用集合内涵来创建集合。
集合内涵是一个表达式,也是一个带有条件的循环,与列表内涵类似
{expression for item in iterable}
{expression for item in iterable if condition}
我们可以使用上面的语法来过滤
html={x for x in files if x.lower().endswith((".html",".htm"))}
固定集合
固定集合是指一旦创建就不能改变的集合,固定集合智能使用frozenset()数据类型函数进行创建
不带参数创建换一个空的固定集合,带一个forzenset参数,返回参数的浅拷贝,对任意其他数据项都尝试将给定的数据项转换为一个frozenset.该函数智能接受一个参数
由于固定集合是固定不变的,因此其支持的方法与操作符所产生的结果都不能影响固定集合本身
frozenset.copy(),frozenset.difference(),forzenset.intersection(),frozenset.union()
frozenset.symmetric_difference()
如果将二元运算符应用于集合与固定集合,那么产生结果的数据类型与左边操作数的数据类型一直。
由于固定集合的固定不变性,使得其满足集合项的可哈希运算的标准,因此,集合与固定集合都可以包含固定集合
映射类型
映射是键值数据项的组合,并且提供了存取数据项及其键,值的方法。进行迭代时,映射类型以任意顺序提供其数据项。
两种无序的映射:内置的dict类型,collections.defaultdict,collections.OrderedDict(有序字典)
只有可hash的对象可用做字典的键(float,frozenset,int,str,tuple)都可以用作字典的键
字典
dict是一种无序的组合数据类型,包含0或多个键值对。
键可hash,值可任意类型
字典是可变的
字典是无序的
空的{会创建空字典}
>>> d=dict({"name":"hiuyeung","age":18})
>>> d={"name":"hiuyeung","age":18}
>>> d=dict(name="hiuyeung",age=18)
>>> d=dict([("name","hiuyeung"),("age",18)]) >>> d=dict(zip(("name","age"),("hiuyeung",18)))
del
>>> del d['age']
>>> d
{'name': 'hiuyeung'}
d.clear()从dict d中移除所有项
d.copy()返回dict d的浅拷贝
d.fromkeys(s,v),返回一个dict该字典的键为序列s中的项,值为None或者v
d.get(k)返回键k相关联的值,如果k不在dict d中就返回None
d.get(k,v)返回k相关联的值,如果k不在dict d中就返回v
d.items()返回dict d中所有(key,value)对的视图
d.keys()返回d中所有键的视图
d.pop(k) 返回k关联的值,并移除键为k的项,如果k不包含在d中就产生keyError异常
d.pop(k,v)返回k关联的值,并移除键为k的项,如果k不包含在d中就返回v
d.pop(item)返回并移除dict d中一个任意的(key,value),如果d为空就产生keyError异常
d.setdefault(k,v)与dict.get()方法一样,不同在于,如果k没有包含在dict d中就插入一个键为k的新乡,其值为v或None
d.update(a)将a中每个尚未包含在dict d中的key,value对增加到d,对同事包含在d与a中的每个键,使用a中对应的值d中对应的值,a可以是字典,可以是(key,value)对的一个iterable
d.values() 返回dict d中所有的值视图
字典的内涵
字典的内涵是一个表达式,同时也是一个循环,该循环带有一个可选的条件,与集合内涵非常类似。
{keyexpression:valueexpression for key,value in iterable}
{keyexpression:valueexpression for key,value in iterable if condition}
有序字典
collections.OrderedDict 有序字典以数据项插入的顺序进行存储
创建有序字典时使用了无序字典,那么有序字典的顺序是任意的