python基础3
数据类型
列表
list(列表)是python中使用最频繁的数据类型,在其他语言中通常就做数组;列表是写在方括号([])之间、用逗号分隔开的元素列表;它可以完成大多数集合类的数据结构实现。它支持字符,数字,字符串甚至可以包含列表(所谓嵌套),总结列表的特点如下:
- 使用中括号括起来
- 使用逗号分隔每一个元素
- 列表中的元素可以是数字、字符串、列表,左右的都能放进去,嵌套任何类型
- 列表在内存创建后可以修改
- 与字符串一样,支持索引;支持切片;支持循环;
- 列表的删除和修改支持索引和切片
- list(‘字符串’) 将字符串转化为列表
- 列表是有序的,元素可以被修改
- 列表式一种可变数据类型
下列方法都可以创建一个list,可以使用type方法查看是否是一个列表类型。
# 直接定义
l1 = ['this', 'is', 'a', 'list']
l2 = [1, 2, 3, 4, 5, 6]
# 使用range构造一个列表
l3 = range(6)
# 使用list方法转换为列表
l4 = list('list')
# 使用推导公式创建列表
l5 = [i for i in range(6)]
# 嵌套
l6 = [1, 'ss', [2,3,4],{'key':'value'},('tuple',)]
列表的值访问和更新
使用下标索引来访问列表中的值,也可以使用切片的形式获取多个值,列表同其他语言一样,索引下标是从0开始的。
# 单下标索引
>>> list1 = ['this', 'is', 'a', 'list']
>>> print(list1[1])
is
# 切片,注意切片索引的时候,可以取到左下标不能取到右下标,如下[1:3],不能取3,只能获得下标1、2的值
>>> print(list1[1:3])
['is', 'a']
# 支持负索引,-1表示列表的最末段的元素,依次类推
>>> print(list1[-2])
a
列表是一种可变类型,可以动态地改变列表的长度和现有列表每个索引下的内容
# 修改某个索引下的值
>>> list2 = [1, 2,'a', 'b']
>>> list2[1] = 66
>>> print(list2)
[1, 66, 'a', 'b']
# append 添加元素,在现有列表的尾部添加
>>> list2.append(3)
>>> print(list2)
[1, 66, 'a', 'b', 3]
# extend 使用appen是添加某一个元素,要是另一个列表中的所有元素,可以使用extend
>>> list3 = [1,2,3]
>>> list2.extend(list3)
>>> print(list2)
[1, 2, 'a', 'b', 1, 2, 3]
# insert(i, value) 添加元素,在下标为i的地方插入value
>>> list2.insert(2, 'c')
>>> print(list2)
[1, 66, 'c', 'a', 'b', 3]
# pop删除元素,默认删除最有一个元素,并返回删除的值,还可指定下标删除,要是超出索引范围,则会抛出异常
>>> list2.pop()
3
>>> print(list2)
[1, 66, 'c', 'a', 'b']
>>> list2.pop(2)
'c'
>>> print(list2)
[1, 66, 'a', 'b']
# 使用remove移除列表中第一次出现的元素
>>> list2.remove('a')
>>> print(list2)
[1, 66, 'b']
# del 删除列表中的元素,无返回值
>>> del list2[0]
>>> print(list2)
[66, 'b']
列表脚本操作符:’+’ 和 ’ * ’ ,其中 '+‘用于组合列表,’ * '用于重复列表
# '+'拼接列表
>>> list3 = [1,2,3]
>>> list4 = [4,5,6]
>>> l = list3+list4
>>> print(l)
[1, 2, 3, 4, 5, 6]
# '*'重复列表中的元素
>>> l = list4 * 3
>>> print(l)
[4, 5, 6, 4, 5, 6, 4, 5, 6]
# in 判断元素是不是在列表中
>>> 6 in l
True
# 迭代, 遍历每一个元素
for i in list4:
print(i, end='')
>>> 456
列表中常用的函数
>>> list5 = [1,2,3,6,7,8]
# len 获取列表的长度
>>> print(len(list5))
6
# max 获取最大值,字符也适用,如果是一个字符串,从第一个开始比较
>>> print(max(list5))
8
# min获取最小值
>>> print(min(list5))
1
# list,可以把元组、字符串转换为列表
>>> list6 = list(s)
>>> print(list6)
['s', 't', 'r']
>>> num = (1,2,3)
>>> type(num)
<class 'tuple'>
>>> list7 = list(num)
>>> type(list7)
<class 'list'>
列表中的方法
前面说了append、extend、insert、pop、remove
常用的还有count、index、sort、reverse、clear、copy
# count 统计列表中某个元素出现的次数
>>> list8 = [1,1,2,6,6,8,9]
>>> list8.count(1)
2
# index 获取某一个元素在列表中第一次出现的下标
>>> list8 = [1,1,2,6,6,8,9]
>>> list8.index(6)
3
# sort 对原列表进行排序,默认是升序排列,可以通过reverse选择升序或者降序
>>> list8.sort()
>>> list8
[1, 1, 2, 6, 6, 8, 9]
>>> list8.sort(reverse=True)
>>> list8
[9, 8, 6, 6, 2, 1, 1]
# clear 清空列表中的元素
>>> list8.clear()
>>> list8
[]
>>> print(len(list8))
0
还有一个copy方法,在这里就需要注意了,注意了,注意了,坑来了
先看一个例子
>>> a = [1,2,3]
>>> b = a
>>> b[0] = 66
>>> print(a)
[66, 2, 3]
>>> print(id(a))
1993459824968
>>> print(id(b))
1993459824968
这个例子中,把a的值赋值给了b,我们修改b的第一个元素,理论上a不应该改变,结果a也变了;通过查看这两个变量的id可以知道,他们在同一个地址,只是名字不一样,这是什么原因?
在python中,我们定义了 a = [1,2,3]
,在内存管理中先给 [1,2,3]
分配内存地址,然后在这个地址上打上标签 a,所以可以说a是 [1,2,3]
这个一块内存的别名,然后我们操作 b=a
只是把名字换了一下,他们两个还是指向同样的地址,所以b改变a同意改变;下面在来个图说明一下:
更专业的说,python分为浅拷贝和深拷贝,直接放一张我画的图
# python中的拷贝
# 浅拷贝
a = [1, 2, 3, [4,5,6]]
b = a.copy()
c = a[:]
>>> b[0] = 66
>>> c[0] = 666
>>> print(a)
[1, 2, 3, [4, 5, 6]]
>>> print(b)
[66, 2, 3, [4, 5, 6]]
>>> print(c)
[666, 2, 3, [4, 5, 6]]
>>> c[3][1] = 555
>>> a
[1, 2, 3, [4, 555, 6]]
>>> b
[66, 2, 3, [4, 555, 6]]
>>> c
[666, 2, 3, [4, 555, 6]]
>>>
通过上面的源码可以知道,可以通过copy方法进行浅copy,也可以使用切片的方法进行copy,但是这样的操作整个复制表层的元素,深层的依然不能完全copy
import copy
>>> d = copy.deepcopy(a)
>>> d[1] = 0
>>> d[3][0] = 'xxx'
>>> priint(a)
>>> print(a)
[1, 2, 3, [4, 5, 6]]
>>> print(d)
[1, 0, 3, ['xxx', 5, 6]]
浅copy,也可以使用切片的方法进行copy,但是这样的操作整个复制表层的元素,深层的依然不能完全copy
import copy
>>> d = copy.deepcopy(a)
>>> d[1] = 0
>>> d[3][0] = 'xxx'
>>> priint(a)
>>> print(a)
[1, 2, 3, [4, 5, 6]]
>>> print(d)
[1, 0, 3, ['xxx', 5, 6]]
通过导入 copy包,使用deepcopy方法就可以实现深拷贝
欢迎大家关注我的个人公众号,同样的也是和该博客账号一样,专注分享技术问题,我们一起学习进步