列表和元组
列表是什么, 元组是什么
编程中, 经常需要使用变量, 来保存/表示数据.
如果代码中需要表示的数据个数比较少, 我们直接创建多个变量即可.
num1 = 10
num2 = 20
num3 = 30
......
但是有的时候, 代码中需要表示的数据特别多, 甚至也不知道要表示多少个数据. 这个时候, 就需要用到列表.
列表是一种让程序猿在代码中批量表示/保存数据的方式(就类似于其他编程语言中的“数组")
就像我们去超市买辣条, 如果就只是买一两根辣条, 那咱们直接拿着辣条就走了.
但是如果一次买个十根八根的, 这个时候用手拿就不好拿, 超市老板就会给我们个袋子.
这个袋子, 就相当于 列表
元组和列表相比, 是非常相似的, 只是列表中放哪些元素可以修改调整, 元组中放的元素是创建元组的时候就设定好的, 不能修改调整
==列表是可变的:创建好了之后,随时能改
元组是不可变的:创建好了之后,改不了.要想改,只能丢弃旧的,搞个新的==
列表就是买散装辣条, 装好了袋子之后, 随时可以把袋子打开, 再往里多加辣条或者拿出去一些辣条.
元组就是买包装辣条, 厂家生产好了辣条之后, 一包就是固定的这么多, 不能变动了.
C++/Java里面要求一个数组里只能存相同类型的变量
Python里的列表则无限制,放啥类型都可以!!
列表
创建列表
创建列表主要有两种方式. [ ] 表示一个空的列表
访问下标
可以通过下标访问操作符 [ ] 来获取到列表中的任意元素.
我们把 [ ] 中填写的数字, 称为 下标 或者 索引 .
切片操作
通过下标操作是一次取出里面第一个元素.
通过切片, 则是一次取出一组连续的元素, 相当于得到一个子列表
使用 [ : ] 的方式进行切片操作.
切片操作中可以省略前后边界
切片操作还可以指定 "步长" , 也就是 "每访问一个元素后, 下标自增几步"
如果切片中填写的数字越界了, 不会有负面效果. 只会尽可能的把满足条件的元素过去到.
遍历列表元素
新增元素
使用 append 方法, 向列表末尾插入一个元素(尾插).
使用 insert 方法, 向任意位置插入一个元素
insert 第一个参数表示要插入元素的下标.
查找元素
使用 in 操作符, 判定元素是否在列表中存在. 返回值是布尔类型.
alist = [1, 2, 3, 4]
print(2 in alist)
print(10 in alist)
使用 index 方法, 查找元素在列表中的下标. 返回值是一个整数. 如果元素不存在, 则会抛出异常.
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.....它们内部可以再包含其他元素了(容器/集合类)