数据结构
集set
- 可变的、无序的、不重复的元素的集合
- set() → new empty set object
- set(iterable) → new set object
- set的元素必须可以hash
- 元素不可迭代,set可迭代
set和线性结构
- 线性结构时间复杂度为O(n)
- set、dict等结构,内部使用hash值作为key,时间复杂度为O(1)
- 可hash(不可变类型)
- set的元素必须可hash
字典dict
-
d = dict()
或d = {}
-
key-value键值对的数据的集合
-
可变的、无序的、key不重复
-
dicr(**kwargs) # name = value
-
*args
:(可以理解为只有一列的表格,长度不固定)将实参中按照位置传值,多出来的值都给args,且以元组的方式呈现 -
**kwargs
:(可以理解为字典,长度不固定)将形参中按照关键字把多余的传值以字典的方式呈现 -
顺序必须是
位置参数
、*args
、**kwargs
,否则报错 -
顺序必须是
位置参数
、默认参数
、**kwargs
,否则报错 -
例:
a = dict([('c', 100), ['d',200]], a = 1, b = 2)
-
dict(iterable,**kwarg) # 可迭代对象和name = value构造,可迭代对象的元素须是二元结构
-
dict(mapping,**kwarg) # 字典构造另一个字典
-
d = {'a':10,'b':20,'c':None,'d':[1,2,3]}
字典的key
- key的要求和set的元素要求一致
- set的元素可看作是key,set可看作是dict的简化版
- key必须可hash,可用hash()测试
defaultdict
dict = defaultdict(factory_fuction)
- factory_fuction可以是list、set、str…作用是当key不存在时,返回工厂函数生成key对应的value的缺省值,如
list
对应[]
,str
对应空字符串''
,set
对应set()
,int对应0
OrderedDict
collection.OrderedDict([items])
- key并不是按照加入的顺序排列,可用OrderedDict记录顺序
from collection import OrderedDict
- 有序字典可记录元素插入的顺序,打印时也按照此顺序打印
例题
解析式 & 生成器
列表解析式List Comprehension
- 构造返回新列表
- 语法
- [返回值 for 元素 in 可迭代对象 if条件]
- 使用中括号[],内部是for循环,if条件语句可选
[exp for i in iterable1 for j in iterable2]
等价于
lst = []
for i in iterable1:
for j in iterable2:
lst.append(exp)
例题
选择排序
- 简单选择排序
- 两两比较大小,找出极值放置在固定的某一端
- 排序结果分升序、降序
- 降序
- n个数从左至右,索引从0到n-1,两两比较,记录大值的索引,比较此轮所有数
- 将大值和索引0数交换,若大值就是索引1则不交换
- 第二轮从1开始比较找到最大值,将其与索引1交换,若其在索引1位置则不交换
- 以此类推,每次左侧都会固定一个大值
- 升序
- 与降序相反
- 无法得知当前轮是否已经完成排序,但可知极值是否在目标索引位置上
- 遍历次数
n(n-1)/2
- 时间复杂度
O(n²)
- 减少交换次数提高效率,性能略高于冒泡法
例题
内建函数
类型
- 标识
id
- 返回对象的唯一标识,CPython返回内存地址
- 哈希
hash()
- 返回一个对象的哈希值
- 类型
type()
- 返回对象的类型
- 类型转换
float()
int()
bin()
hex()
oct()
bool()
list()
tuple()
dict()
set()
complex()
bytes()
bytearray()
- 输入
input([prompt])
- 接收输入,返回一个字符串
- 打印
print(*object,sep='',end='\n',file=sys.stdout,flush=False)
- 打印输出,默认使用空格分隔、换行结尾。输出至控制台
- 长度
len(s)
- 返回一个集合类型的元素个数
isinstance(obj,class_or_tuple)
- 判断obj是否属于某种类型或元组中列出的某个类型
issubclass(cls,class_or_tuple)
- 判断类型cls是否是某种类型的子类或元组中列出的某个类型的子类
abs()
# 绝对值max()
,min()
# 极值round()
"四舍六入五取偶"
pow(x,y)
==x ** y
range(start,stop[,step])
[起始位置,结束位置),步长
divmod(x,y)
==tuple(x//y,x%y)
sum(iterable[,start])
- 对可迭代对象的所有数值元素求和
chr(i)
- 给一个一定范围的整数返回对应的字符
ord(c)
- 返回字符对应的整数
sorted(iterable[,key][,reverse])
- 返回新列表,默认升序排序
- reverse为反转
reversed(seq)
- 返回一个反转元素的迭代器
enumerate(seq,start=0)
# 枚举- 迭代一个序列,返回索引数字和元素构成的二元组
- start表示起始索引,默认为0
iter(iterable)
、next(iterator[,default])
# 迭代器和取元素- iter将可迭代对象封装成迭代器
- next对迭代器取
下一个元素,不可逆序
。若全部取过,再次next则返回StopIteration
异常 zip(*iterables)
# 拉链函数- 将多个可迭代对象合并,返回一个迭代器
- 将每次从不同对象中取到的元素合并成一个元组
可迭代对象
- 可以通过迭代一次次返回不同元素的对象
- 相同与否指元素在容器中是否为同一个。#
['a','a']
虽然值相同,但是元素不同 - 可以迭代,未必有序,未必可索引
- 容器:元素的集合,可被迭代:
list
、tuple
、string
、bytes
、bytearray
、range
、set
、dict
、生成器...
- 成员操作符:
in
、not in
# in实质是遍历
迭代器
必须是可迭代对象
- 通过iter方法将一个可迭代对象封装成迭代器
- 通过next方法迭代迭代器对象
生成器对象就是迭代器对象,生成器是一种特殊的迭代器