列表和元组
列表是什么, 元组是什么
编程中, 经常需要使用变量, 来保存/表示数据.
如果代码中需要表示的数据个数比较少, 我们直接创建多个变量即可.
python
num1 = 10
num2 = 20
num3 = 30
......
但是有的时候, 代码中需要表示的数据特别多, 甚至也不知道要表示多少个数据. 这个时候, 就需要用到列表.
列表是一种让程序猿在代码中批量表示/保存数据的方式(就类似于其他编程语言中的"数组")
就像我们去超市买辣条, 如果就只是买一两根辣条, 那咱们直接拿着辣条就走了.
但是如果一次买个十根八根的, 这个时候用手拿就不好拿, 超市老板就会给我们个袋子.
这个袋子, 就相当于 列表
元组和列表相比, 是非常相似的, 只是列表中放哪些元素可以修改调整, 元组中放的元素是创建元组的时候就设定好的, 不能修改调整
列表是可变的:创建好了之后,随时能改
元组是不可变的:创建好了之后,改不了.要想改,只能丢弃旧的,搞个新的
列表就是买散装辣条, 装好了袋子之后, 随时可以把袋子打开, 再往里多加辣条或者拿出去一些辣条.
元组就是买包装辣条, 厂家生产好了辣条之后, 一包就是固定的这么多, 不能变动了.
C++/Java里面要求一个数组里只能存相同类型的变量
Python里的列表则无限制,放啥类型都可以!!
列表
创建列表
创建列表主要有两种方式. [ ] 表示一个空的列表
访问下标
可以通过下标访问操作符 [ ] 来获取到列表中的任意元素.
我们把 [ ] 中填写的数字, 称为 下标 或者 索引 .
切片操作
通过下标操作是一次取出里面第一个元素.
通过切片, 则是一次取出一组连续的元素, 相当于得到一个子列表
使用 [ : ] 的方式进行切片操作.
切片操作中可以省略前后边界
切片操作还可以指定 "步长" , 也就是 "每访问一个元素后, 下标自增几步"
如果切片中填写的数字越界了, 不会有负面效果. 只会尽可能的把满足条件的元素过去到.
遍历列表元素
新增元素
使用 append 方法, 向列表末尾插入一个元素(尾插).
使用 insert 方法, 向任意位置插入一个元素
insert 第一个参数表示要插入元素的下标.
查找元素
使用 in 操作符, 判定元素是否在列表中存在. 返回值是布尔类型.
python
alist = [1, 2, 3, 4]
print(2 in alist)
print(10 in alist)
使用 index 方法, 查找元素在列表中的下标. 返回值是一个整数. 如果元素不存在, 则会抛出异常.
python
alist = [1, 2, 3, 4]
print(alist.index(2))
print(alist.index(10))
删除元素
使用 pop 方法删除最末尾元素
pop 也能按照下标来删除元素
使用 remove 方法, 按照值删除元素.
连接列表
使用 + 能够把两个列表拼接在一起.
此处的 + 结果会生成一个新的列表. 而不会影响到旧列表的内容.
使用 extend 方法, 相当于把一个列表拼接到另一个列表的后面.
a.extend(b) , 是把 b 中的内容拼接到 a 的末尾. 不会修改 b, 但是会修改 a.
None非常类似于C里面的NULL,或者Java里的 null
元组
元组的功能和列表相比, 基本是一致的.
元组使用 ( ) 来表示.
元组不能修改里面的元素, 列表则可以修改里面的元素
另外, 元组在 Python 中很多时候是默认的集合类型. 例如, 当一个函数返回多个值的时候.
此处的 result 的类型, 其实是元组.
问题来了, 既然已经有了列表, 为啥还需要有元组?
- 元组相比于列表来说, 优势有两方面:
协同开发的时候,一个程序猿A实现一些功能,提供给程序猿B来使用
A写好一些函数,让B去调用(函数肯定要传参)
B传完参数后,A的函数里面是否会将参数的内容进行修改呢?
如果使用的元组作为参数,就可以避免这样的纠结- 后面学习的字典, 是一个键值对结构.
要求字典的键必须是 "可hash对象" (字典本质上也是一个hash表).
而一个可hash对象的前提就是不可变. 因此元组可以作为字典的键, 但是列表不行.
小结
列表和元组都是日常开发最常用到的类型. 最核心的操作就是根据 [ ] 来按下标操作.
在需要表示一个 "序列" 的场景下, 就可以考虑使用列表和元组.
如果元素不需要改变, 则优先考虑元组.
如果元素需要改变, 则优先考虑列表.
字典
字典是什么
字典是一种存储 键值对 的结构.
那么什么是键值对呢? --- 这是计算机/生活中一个非常广泛使用的概念.
将 键(key) 和 值(value) 进行一个一对一的映射, 然后就可以根据键, 快速找到值.
举个栗子, 学校的每个同学, 都会有一个唯一的学号.
知道了学号, 就能确定这个同学.
此处 "学号" 就是 "键", 这个 "同学" 就是 "值"
在Python的字典中,可以同时包含很多个键值对.同时要求这些键,不能重复!
创建字典
创建一个空的字典. 使用 { } 表示字典.
可以在创建的同时指定初始值
键值对之间使用 , 分割 , 键和值之间使用 : 分割 . (冒号后面推荐加一个空格).
使用 print 来打印字典内容
查找 key
使用 in 可以判定 key 是否在 字典 中存在. 返回布尔值.
使用 [ ] 通过类似于取下标的方式, 获取到元素的值 . 只不过此处的 "下标" 是 key. (可能是整数, 也可能是字符串等其他类型).
新增/修改元素
删除元素
使用 pop 方法根据 key 删除对应的键值对.
遍历字典元素
遍历指的就是能够把一个可迭代对象,将其中包含的元素依次取出,并进行一些操作(整个过程要求不重不漏)
字典被设计出来的初衷,不是为了实现遍历,而是为了增删改查.
字典是哈希表 ,进行增删改查操作,效率都非常高
而字典的遍历则效率就要差一些.
哈希表这个结构 设计的非常巧妙
能够以"常数级"时间复杂度来完成增删改查
(如果学了一场数据结构,还不知道哈希表,只能说明数据结构并没有掌握)
数据结构中最最重要的就是哈希表,没有之一 (工作中最常用到的数据结构,也是面试中非常高频的问题)
无论字典中有多少元素 新增,修改,查找,删除操作都是固定时间,不会因为元素过多,操作速度下降(都是常数级)
字典中的key要求不能重复
取出所有 key 和 value
在C++或者Java中,哈希表里面的键值对存储的顺序,是无序的
但是在Python 中不一样 Python 中做了特殊处理能够保证遍历出来的顺序,就是和插入的顺序一致的Python中的字典并不是单纯的哈希表
合法的 key 类型
不是所有的类型都可以作为字典的 key.
字典本质上是一个 哈希表, 哈希表的 key 要求是 "可哈希的", 也就是可以计算出一个哈希值.
可以使用 hash 函数计算某个对象的哈希值.
但凡能够计算出哈希值的类型, 都可以作为字典的 key.
不可变的对象,一般就是可哈希的.
可变的对象,一般就是不可哈希的
小结
字典也是一个常用的结构. 字典的所有操作都是围绕 key 来展开的.
需要表示 "键值对映射" 这种场景时就可以考虑使用字典.
字典,列表,元组Python 中非常常用的内置类型 相比于int, str, float...它们内部可以再包含其他元素了(容器/集合类)