Python
大约 7 分钟
Python
目录
容器类型
可迭代对象泛操作
列表解析
也叫列表推导式
适用
- 使用:
[值 for i in L]
- 使用:
适用举例
[x^2 for x in range(10)]
【Python特有】等价于
list[map(lambda x: x**2, range(10))]
复杂点的举例:
[(x, y) for x in [1,2,3] for y in [3,1,4] if x != y]
嵌套的举例:
[[row[i] for row in matrix] for i in range(4)]
适用范围:列表/元组/集合/字典
- (对于字典,要写完整的键值,例如
{x: x**2 for x in (2, 4, 6)}
)
- (对于字典,要写完整的键值,例如
len
- 使用举例
len(dict)
,返回可迭代对象的长度
- 适用范围:列表/字典/元组/集合/字符串
[]
- 使用举例
list[i]
索引
- 适用范围:列表/字典/元组/集合/字符串
- (对于字典,中括号内容为键名,不可为序列)(本质是hash表)
- (对于列表,i 内容除了可以是序列,也可以是切片表达)
del
- 使用举例
del list[i]
,从列表删除元素、切片、全部del dict['key']
,从字典删除键值对、全部
- 适用范围:列表/字典/集合
- (对于可迭代对象,可以不加[]序列,删除整个对象)
- (对于字典,中括号内容为键名)
- (对于列表,i 内容除了可以是序列,也可以是切片表达)
- (对于字符串和元组,不可编辑元素)
循环
- 适用举例
for i in list:
- 适用范围:列表/字典/元组/集合/字符串
- 对于字典,根据遍历对象的不同有不同写法,默认是遍历键
- 遍历字典键:
for k in dict.keys():
,for k in dict:
- 遍历字典值:
for v in dict.values():
- 遍历字典键值对:
for k,v in dict.items():
- 遍历字典键:
- 对于可迭代对象,根据遍历对象的不同也有不同的写法
- 只遍历项:
for item in list: print(item)
- 遍历序列:
for i in range(len(list)): print(i, list[i])
- 遍历序列与值:
for i, v in enumerate(list): print(i, v)
- 只遍历项:
- 对于字典,根据遍历对象的不同有不同写法,默认是遍历键
顺序类(需要为线性序列对象)
list.sort()
,对列表中的元素就地进行永久性排序,额外参数[reverse=False]
list.sorted()
,对列表中的元素就地进行临时性排序,额外参数[reverse=False]
- 一般临时性排序可用于循环序列中倒叙输出
list.reverse()
,就地倒排序列表中的元素
对象类型 > 列表
简概
- 性质
- 可变:不像不可变的字符串,列表是可变的,它允许修改元素,故可以对索引或切片进行赋值
- 任意类型:列表的元素不必是同一类型
- 使用基础(背后原理)
- 略
使用
字面量方式
对象方法(类方法)
list.append(X)
,在列表的末尾添加新的元素,相当于a[len(a):] = [x]
,a.insert(len(a), x)
list.extend(L)
,将一个给定列表中的所有元素都添加到另一个列表中,相当于a[len(a):] = L
list.insert(i,x)
,在指定位置添加插入一个元素list.remove(x)
,删除列表中值为 x 的第一个元素。如果没有这样的元素,就会返回一个错误
list.pop([i=len])
,从列表的指定位置删除元素,并将其返回。如果没有指定索引,返回最后一个元素list.clear()
,从列表中删除所有元素。相当于del a[:]
list.index(x)
,返回列表中第一个值为 x 的元素的索引,相当于a[i]
,如果没有匹配的元素就会返回一个错误
list.count(x)
,返回 x 在列表中出现的次数list.copy()
,返回列表的一个浅拷贝。等同于a[:]
内置函数
len(list)
,返回列表长度del list[i]
,从列表删除元素、切片、甚至全部range(start,stop[,step])
,快速创建等差数字列表,相当于[i for i in range(start,stop[,step])]
技巧
- 当堆栈用:使用
append()
和pop()
方法可以当堆栈用 - 当队列用:效率不高,在头部插入和弹出很慢(因为,为了一个元素,要移动整个列表中的所有元素) 要实现队列,使用 collections.deque,它为在首尾两端快速插入和删除而设计
- 遍历列表:
for i in list:
- 拷贝:捋清楚:对象数据类型的赋值、浅拷贝和深拷贝三者的关系。具体详见其他笔记的编程术语一篇
- 当堆栈用:使用
原理
python的列表不仅不定长,而且还随意存储各种格式,存整型、浮点、字符串、甚至还可以嵌套list
等其他容器。 在C++中如果想要实现相同的效果,可能需要用 Boost::any
原理
参考:https://cloud.tencent.com/developer/article/1820193
python中的容器对象真的不多,平常我们会很心安理得的根据需求来使用对应的容器,不定长数据用list
,想去重用set
,想快速进行匹配用dict
,字符处理用str
简述
从细节上看,Python中的列表是由对其它对象的引用组成的连续数组。
这意味着,每次添加或删除一个元素时,由引用组成的数组需要该标大小(重新分配),当然,实际使用的是指数分配的方式。
对象类型 > 元组(元素不可变)
简概
- 性质
- 不可变性:就是相当于不可变的列表,其他和列表差不多 (存储元组的变量可变,元组元素不可变,为区别于常量其更贴切的说法是
元素不可变性
)
- 不可变性:就是相当于不可变的列表,其他和列表差不多 (存储元组的变量可变,元组元素不可变,为区别于常量其更贴切的说法是
使用
字面量方式
元组字面量:用圆括号(
()
)来表示元组,并用逗号分隔,也可以不加括号例如
tuple = 123, 456, 'hello'
创建包含零个或一个元素的元组:零个时不能省略圆括号,一个时可在后面加单个逗号
例如
empty_tuple = ()
,single_tuple = 'hello',
技巧
- 遍历元组:
for i in tuple:
- 遍历元组:
对象类型 > 字典
简概
- 性质
- 无序:用for遍历时顺序完全随机
使用
- 注意项
- 关键字可以为任意不可变类型,适用范围:字符串、数值、只包含字符串和数字的元组
- 字面量方式
- 字典字面量:
{k1:b1, k2:v2}
- 字典增加或修改:
dict[key]=value
- 字典字面量:
- 对象方法(类方法)
dict.items()
,返回键值对dict.keys()
,返回键dict.values()
,返回值
- 内置函数
len(dict)
,返回字典长度del dict['key']
,从字典删除键值对set(dict)
,返回不重复的集合
对象类型 > 集合
简概
- 性质
- 无序:用for遍历时顺序完全随机
- 不重复
使用
- 字面量方式
- 集合字面量:
{}
包裹,逗号隔开。也可以用set()方式创建- 但注意的是,如果创建空集合,只能用创建对象方式
set()
,例如a = set()
- (
set()
本质是对象构造函数,也是类型转换方法,即构造函数用作转换函数并重载)
- 但注意的是,如果创建空集合,只能用创建对象方式
- 集合字面量:
- 对象方法(类方法)
union
,联合intersection
,交difference
,差sysmmetric difference
,对称差集
- 符号方法
set_a - set_b
,差集set_a | set_b
,并集set_a & set_b
,交集set_a ^ set_b
,非交集(交集的补集)
- 补充
- 集合对象还支持 union(联合),intersection(交),difference(差)和 sysmmetric difference(对称差集)等数学运算
对象类型 > 对象数据类型的嵌套
嵌套:列表、元组、字典、集合均允许嵌套列表
嵌套技巧
- 列表列表:嵌套分组
- 列表字典:有多种个体,每个个体有不同属性
- 字典列表:对象有多个属性,每个属性有多个选项
- 字典字典:对象有多个属性,每个属性有多个子属性
内置函数
zip()
打包(一维打包成多维)
questions = ['name', 'quest', 'favorite color'] answers = ['lancelot', 'the holy grail', 'blue'] for q, a in zip(questions, answers): print('What is your {0}? It is {1}.'.format(q, a))
队列【外部类】
- 导入:
from collections import deque
- 字面量方式
- 定义:例如
queue = deque(["2", "3", "4"])
- 定义:例如
- 对象方法
queue.append(X)
,末尾增加queue.popleft()
,左侧弹出