Python中的序列
- 序列的概念: 有序存储,并能通过下标偏移进行访问。
- 序列对象:str,list , tuple
- 初始化 (列表list用[]、元组tuple用()、字符串string用"")
- 标准操作:
成员操作
连接与重复 (同类型对象间使用)
访问(索引与切片) - 其它操作
BIF:
□ len , reversed , zip(序列拼接) ,sorted , enumerate(枚举)
□ max, min, sum
□ all(判断是否都为空), any(判断是否含有空元素)
序列类型转换
□ list() , str() , tuple()
列表List
- 初始化
- 列表属性
- 列表操作
□ 访问
□ 成员操作
□ +与*
□ 比较,排序
□ 其它操作
#列表内部操作
l1[3]='Caffe'#赋值
l1.append(l2)#添加到未尾,如果元素是列表,也是按照列表添加进来,只添加一个元素
l1.extend(['Torch'])#扩展,如果是扩展元素是列表,是只添加列表内的元素,可以一次性添加多个元素
l1.insert(0,'sklearn')#插入元素,按索引
l1.index('sklearn')#获得指定元素的索引位置,如果存在相同元素,返回的是从右到左第一个的索引位置
l1.count('AI')#统计元素出现的次数
l1.pop()#返回并弹出最后一个元素(即元素会被删除)
l1.pop(3)#返回并弹出指定索引位置的元素
del l1[-1] #删除列表元素,按索引位置删除
l1.remove('AI')#指定元素进行删除,如果存在相同元素,则删除从左至右第一个元素
#列表操作
reversed(l1) #对列表进行反转,返回一个reversed对象,要list化才会显示
sorted(l1)
l2<l3 #列表比较,逐元素进行对比
列表推导式 list comprehension
- 定义:
□ 列表推导式也叫列表解析式(list comprehension),是利用现有列表创建新列表。
□ 这种可以非常简洁的方式来快速生成满足特定需求的列表,代码可读性强
□ Python的内部实现对列表推导式做了大量优化,可以保证很快的运行速度。 - 语法:
□ [表达式 for 变量 in 列表]
□ [表达式 for 变量 in 列表 if 条件]
元组Tuple
- 元组tuple是只读有序序列。方法较list少。
(tuple是不可修改的,即元组里的元素是不可修改,除了列表和字典) - 可以认为tuple是只读列表,它有许多操作和list很接近,除了对其进行修改。
(元组只能和元组之间进行运算,否则报错。(1,2)+4是错的,(1,2)+(4,)=(1,2,4))
集合Set
- 集合set:一组key的无序排列集合,因此无法用索引及切片访问
- 主要作用:用于去重及集合间操作
- 集合内部操作:
a.add('f') #添加key
a.remove('AI') #删除key - 集合间操作:
□ 交集
□ 并集
□ 差集
□ 集合与元组
#集合间操作
a=set('abcde')
b=set('cdefg')
# &交集
a&b
# 结果:{'c', 'd', 'e'}
# |并集
a|b
# 结果:{'a', 'b', 'c', 'd', 'e', 'f', 'g'}
# -差集
a-b
# 结果:{'a', 'b'}
#合并
a.update(b)#集合合并
字典Dictionary
记住:字典和集合都不是序列,因此无法用切片和索引
- 定义:字典这种数据结构,是把一个元素映射到另一个元素上,可以简单理解为k:v对应。
- 常见操作:
□ 初始化 (可以用{},或者dict())
□ 成员判断 (只针对key)
□ 访问
□ 字典推导式 - Key值的选取:Key值必须是可被哈希的,也就是说key只能是数字,字符串或元组
#新增成员
d1['address']='beijing'
#访问:按key访问value:
d1['name']
d1.get('name',-1)
#访问所有key
d1.keys()
#访问所有value
d1.values()
#访问所有元素
d1.items()
#删除成员
d1.pop('address')#返回指定key的值。并弹出元素
d1.popitem()#r返回整个元素。并弹出
#清空
d1.clear()
#Key值的选取,能被hash的值都可以做为key,即不可变类型可以做为key值。
hash('a')
Python内存管理
□ 变量与对象之间关系:引用
□ 查看一个对象被引用总数
#在Python中,每个对象都有存有指向该对象的引用总数,即引用计数(reference count)。
#我们可以使用sys包中的getrefcount(),来查看某个对象的引用计数。
#需要注意的是,当使用某个引用作为参数,传递给getrefcount()时,参数实际上创建了一个临时的引用。
#因此,getrefcount()所得到的结果,会比期望的多1。
>>from sys import getrefcount
>>a = [1, 2, 3]
>>print(getrefcount(a))
2
>>b = a
>>print(getrefcount(b))
3
可变与不可变对象
- 核心思想:引用与对象分离
□ 引用可以随时指向一个新的对象
□ 一个对象可以被多个引用指向 - 可变数据对象
□ 通过引用其元素,改变对象自身 - 不可变数据对象
□ 不能改变对象本身,只能改变引用的指向
>>a=b=c=5#创建了三个变量,均指向一个int类型的对象5,一个对象可以被多个引用指向
>>del c#删除c这个变量对5的引用
>>a=[1,2,3]#把a这个变量的指向,重新指向了一个列表对象,引用可以随时指向一个新的对象
>>print(b)#b依旧指向5,5没有被改变
5
#什么是可变对象?
>>a=b=c=[1,2,3]
>>print(a,b,c)
[1, 2, 3] [1, 2, 3] [1, 2, 3]
>>a.append(4)#通过a能真正改变列表[1,2,3],
>>print(a,b,c)#通过引用其元素,改变对象自身
[1, 2, 3, 4] [1, 2, 3, 4] [1, 2, 3, 4]
#什么是不可变对象?
>>a=b=c='beijing'
>>a='shanghai'
#打印a,b,c,d指向对象的id,看看是否是一个家伙
>>print('id(a):',id(a),'id(b):',id(b),'id(c):',id(c))
id(a): 2246883863600 id(b): 2246883876232 id(c): 2246883876232
#看似是把a变量指向的字符串从beijing,改为shanghai,但其它并没有改变beijing,只是a的指向被改变了
>>print(a,b,c)#不能改变对象本身,只能改变引用的指向
shanghai beijing beijing
网友评论