元组
列表
字典
集合
结构体
序列类型: 支持 in len() 分片.
bytearray bytes list str tuple collections.namedtuple(命名元组)
----------------------------------------------------------------------------------------------------------------------
队列: collections.deque
deque([iterable[, maxlen]]) --> deque object 类似于 list
----------------------------------------------------------------------------------------------------------------------
元组: tuple
元组为固定的, 一般用()限定, 如果要修改,先用 list() 转化为列表再行修改.
tuple() 产生空元组 ()
一个或多个元素的元组一定要用 逗号 分隔. 一个元素的元组定义 (4,)即一个元素的元组也要用到逗号.
通过 t.count(x) 来确定对象 x 在元组 t 中出现的次数
t.index(x) 代表 x 在元组 t 中的最左边的位置, 找不到是抛出 ValueError异常,需要异常捕获处理.
元组可以用 +(连接) *(有多少个副本) += *=运算,但是实际上为创建了新元组. +操作是如果为一个元素,那么操作数使用
格式 (元素,) 是很有必要的
元组的差分 a,b = (1,2) 则 a=1 b=2, 一般用于for x,y in ((1,2),(3,4), (5,6)): 的格式中.
----------------------------------------------------------------------------------------------------------------------
命名元组 collections模块的 namedtuple()函数.
示例:
Sale = collections.namedtuple("Sale", "productID personID data price")
返回一个自定义类, 用于创建命名元组
"Sale"参数为 自定义元组数据类型的名称, 等同于类名, 在 type(x)时被显示
参数二 为字符串,空格分隔, 每一个名称代表元组元素的一个类型.
创建一个命名元组 item = Sale(1, 1001, '2018-01-01', 34?) #按照列的个数
访问 item.
personID ==> 1001 # 按照对应的列名直接取值.
item._asdict() 返回内部键值对映射, 通过 **
item._asdict() 转化为命名参数用于str.format
----------------------------------------------------------------------------------------------------------------------
列表 list.
l.pop() 和 l.pop(i) 为返回并移除某个(最右边)的那个元素.
序列拆分符: * 即 赋值操作左边如果有 *var 时即为对应的位置上的对象被应用完毕后, 其与剩余的元素均赋值给var对应的引用.
如: *dir,exe="/usr/bin/ls".split('\') => dir=['','usr','local','bin'] exe=[ls]
a,*b,c =[1,2,3,4] ==> a=1 b=[2,3] c=4
*列表进行拆解的一种应用在于 例如 计算体积的公式
-
计算体积的公式
-
def calc(a,b,c):
-
return a*b*c
-
-
L=[2,3,5]
-
calc(9,*L[1:]) # 此处把 L[1:] 代表的 列表[3,5]进行拆解得到 3,5 两个数,带入到公式calc中.
对列表内的元素(数据项)迭代的方式
1. for item in L: 2. for i in range(len(L)): 然后通过 L[i] 代表某个数据项.
对列表内的数据项进行删除
1. pop 2.remove 3.对应的分片赋值为[] 4. 通过 del 列表的分片.
列表内涵
产生一个列表的方法. 节省很多代码
方式一 [expression for item in iterable]
方式二 [expression for item in iteable if condition]
负责的情况例如:
-
codes = [ s+z+c for s in "MF" for z in "SMLX" for c in "BGW"
-
if not (s=="F" and Z=="X")]
----------------------------------------------------------------------------------------------------------------------
集合 {} 可变的集合set 固定集合frozenset
只有可哈希运算的对象可以添加到集合中, 即包括有__hash__方法的类型.
所有内置的固定数据类型. float/int/str/tuple/frozenset都可以添加到集合中, 而可变的dict/list/set不能进行哈希运算,因为他们经常变,哈希值也随之变.
集合中的数据项是无序的, 没有索引的概念, 不能分片和步距处理. 空集合一定要通过set() 创建.
集合一般用户删除重复的数据项, 因为集合包含的内容是唯一的, 即 set("hello") ==> {'h','e','l','o'} 重复的 l 字符会被过滤掉. 支持len() 和 in 操作.
集合之间可以进行子集/超集等运算.
集合内涵 {expression for item in iterable if condition}
----------------------------------------------------------------------------------------------------------------------
映射类型 - 字典 dict
内置 dict
标准库 collections.defaultdict
有序的 collections.OrderedDict
{} 创建空字典.
{k1:v, k2:v,....}
dict()也可以创建字典.
-
d1 = dict({"id":1948, "name":"ray"})
-
d2 = dict(id=1948,name="ray")
-
d3 = dict([("id",1948),("name","ray")])
-
d4 = dict(zip(("id","name"),(1948,"ray")))
-
d5 = {"id":1948, "name":"ray"}
使用 [] 来访问字典数据项 如 d5["id"], 字典添加直接赋值d["new"]=4, 删除可以用 del d5["new"], 也可以用 pop()方法
数据项迭代 可用
1. for item in d.items(): # d.items()返回所有KV组合, 然后item[0]为key, item[1]位vale
2. for k,v in d.items() : # 直接使用 k,v的方式.
3. d.keys 和 d.values 可以单独代表所有的 key 和 values 的视图. 视图是只读的
字典也存在集合运算, 超集子集等. & | - ^等运算.
字典内涵 {key_expr:val_expr for key,value in iterable if condition}
----------------------------------------------------------------------------------------------------------------------
迭代
iter() 函数. 任何包含__iter__()方法和任意序列(包含__getitem()__方法,0为下标顺序的对象)都是一个iterable, 并提供迭代子.
使用next()
获取下个迭代子, 如果没有下个迭代子,则触发 StopIteration异常.
-
i = iter([1,2,3,4])
-
while True:
-
try:
-
print(next(i)) # 分别打印 2 3 4
-
except StopIteration:
-
break
enumerate()函数已迭代子为参数, 返回一个迭代子, 为一个二元组, 第一项为迭代次数(默认0开始), 第二项为迭代子的下一项.
sys.exit() 可以实现立即干净的退出.
os.path.getsize(name) 返回文件大小
os.listdir(".") 返回目录中文件和目录列表(不包含. / ..)
os.path.isfile(name) 判断是否是文件
open() 函数已文本模式打开时, 以文件对象为迭代子, 每次迭代返回文件的一行.
range() 函数一般用于整数列表或元组, 提供 for 循环中的循环计数.
random.choice() 会从序列中随机选取一个
random.sample() 把制定的iterable生成制定的项数, 并返回其中一个迭代子.
zip() 函数以一个或多个iterable为参数, 产生序列, 迭代子为元组, 元组的第一数据项来自于第一个iterable的数据,
元组的第二数据项来自第二个iterable的数据, ... 类推.
sorted()函数. sorted(iterable, key=None, reverse=False) 例如 key=abs key=str.lower 也可以是自定义函数, 函数的输入为 iterable的迭代子, 返回也是迭代子. 注意的是
排序只适合所有数据项能相互比较的组合类型
----------------------------------------------------------------------------------------------------------------------
组合类型的复制 (
浅拷贝, 复制的是对象引用. 即如果iterable里边不是固定数据类型,而是内嵌可变的list/set等, 还是复制的对象引用.)
数据分片总是产生一个新的副本.
对于不能分片的字典dict和集合set, 可以使用 dict.copy() set.copy() 或者使用 copy.copy()完成一个新副本.
使用对应的 类型名(对象引用)也可以产生一个新副本, 例如 new_dict = dict(d)
如果确实想要使用深拷贝, 那么需要使用copy.deepcopy()