一、列表、元组、字典、集合如何区别?(可变与不可变、可重复与不可重复)
1、列表
列表是 Python 中的内置可变序列,将所有元素放在一对方括号中。
当列表增加或删除元素时,列表对象自动进行内存的扩展和收缩,从而保证元素之间没有缝隙。
同一个列表中的元素的类型可以不相同,可以包含整数、实数、字符串等基本类型和列表、元组、字典、集合以及其他自定义类型的对象。
使用 del 命令可以删除整个列表,也可以删除列表指定位置上的元素。
2、元组
元组属于不可变序列,将所有元素放在一对圆括号中。
元组一旦创建,用任何方法都不可以修改其元素的值,也无法为元组增加或删除元素。
如果创建只包含一个元素的元组,需要在元素后加一个逗号。
元组和列表的区别:
- 列表属于可变序列,可以随意地修改列表中的元素值以及增加和删除列表元素;而元组属于不可变序列,元组中的数据一旦定义就不允许通过任何方式修改。
- tuple() 函数可以看作是在冻结列表并使其不可变,而 list() 函数是在融化元组使其可变。
- 元组的访问和处理速度比列表快。
- 元组可以用作字典的键,而列表不能当作字典的键使用。
- 虽然元组属于不可变序列,其元素的值是不可改变的,但如果元组中包含可变序列,则可以更改其中可变序列的值。
3、字典
字典是“键 - 值对”的无序可变序列,每个元素的“键”和“值”用冒号分割,相邻元素之间用逗号分隔,所有元素放在一堆大括号中。
字典中的“键”可以是 Python 中任意不可变数据。“键”不允许重复,“值”可以重复。
字典的下标是字典的“键”,而列表和元组的下标必须为整数。
4、集合
集合是无序可变序列,与字典一样使用一对大括号作为界定符,同一个集合的元素之间不允许重复,集合中的每个元素都是唯一的。
集合支持交集(& 或 intersection())、并集(| 或 union())、差集(difference())等操作。
- 列表、字符串、元组属于有序序列,支持双向索引,支持负整数作为下标来访问其中元素。
- 字典和集合属于无序序列,集合不支持使用下标的方式来访问其中的元素,可以使用字典的“键”作为下标来访问字典中的“值”。
- 列表、字典、集合属于可变序列,元组、字符串属于不可变序列。
二、切片(3个参数写与不写)
切片适用于列表、元组、字符串、range 对象等类型。
切片使用 2 个冒号分隔的 3 个数字来完成:第一个数字表示切片开始位置(默认为 0),第二个数字表示切片截止(但不包含)位置(默认为列表长度),第三个数字表示切片的步长(默认为 1),当步长省略时可以顺便省略最后一个冒号。
切片操作不会因为下标越界而抛出异常,而是简单地在列表尾部截断或者返回一个空列表,代码具有更强的健壮性。
使用切片操作不会影响列表对象内存空间。切片返回的是列表元素的浅复制,与列表对象的直接赋值不一样。
三、range() 函数的用法、参数及其含义
range([start,] stop[, step])
start:表示起始值,默认为 0;stop:表示终止值(结果中不包括这个值);step:表示步长(默认为 1)。
返回一个 range 可迭代对象。
四、排序
1、列表对象自身提供的 sort() 方法进行原地排序:
该方法会修改原来的列表,不会返回新的列表。
函数原型:list.sort(key=None, reverse=False)
key 接受的是一个只有一个形参的函数,接受的函数返回值,表示此元素的权值,sort 将按照权值大小进行排序。
reverse 接受的是一个 bool 类型的值 (Ture or False),表示是否颠倒排列顺序,一般默认的是 False(升序)。
2、内置函数 sorted() :
该函数返回新列表,不会对源列表进行任何修改。
函数原型:sorted(iterable, key=None, reverse=False)
iterable,返回值是一个对 iterable 中元素进行排序后的列表。
reverse是一个 bool 类型的值,表示是否颠倒排列顺序,一般默认的是 False(升序)。
key 接受的是一个只有一个形参的函数,这个函数用于从每个元素中提取一个用于比较的关键字,默认为None。
五、* 与 ** 操作符的结果
1、在列表中的 * :
将列表与整数相乘,用于扩展列表对象,生成一个新列表,新列表时原列表的重复。使用 * 运算符将包含列表的列表进行重复并创建列表时,并不创建元素的复制,而是创建已有对象的引用,所以当修改其中一个值时,相应的引用也会被修改。
2、调用函数时的 * 和 ** :
序列解包:在一条赋值语句中将多个值的序列解开,然后放入到变量序列中。也就是将对应位置上的变量与值对应,然后一一赋值。
序列解包允许函数返回有一个以上的值并打包成元组,然后通过一条赋值语句进行访问。需要注意的是:捷豹序列中的元素数量必须和放置在“=”左边的数量完全一致,否则 Python 会在赋值时引发异常。
序列解包可用于:对多个变量同时赋值;列表;字典,默认是对字典“键”操作,如果需要对“键值对”进行操作使用 items() 方法说明,如果需要对“值”进行操作使用 values() 方法明确指定;函数调用。
在函数调用时,在实参前面加上一个 * 也可以进行序列解包,从而实现将序列中的元素值依次传递给相同数量的形参。
>>> demo(**{'a': 1, 'c': 3}, **{'b': 2, 'd': 4})
1 2 3 4
>>> {'x': 1, **{'y': 2}}
{'x': 1, 'y': 2}