元组
1. 定义:
有序的集合对象,不可变的序列
- ()中包含任意对象的有序集合、通过偏移读取、不可变长度、异构、支持嵌套
- 例如:() 、(1,)、(1, ‘2’, 3)、 (1,[2,3],'4')
2. 索引:
取出元组指定偏移量的单个对象
- 与列表、字符串索引类似
- 不能对元组内的对象直接赋值(不可变性)
t = ('jzy', 23, True, '中国')
print(t[0])
# 重新给元组赋值
# t[0] = 'wd' # 输出:TypeError
输出:
jzy
3. 分片:
- 与列表、字符串索引类似
print(t[:2])
输出:
('jzy', 23)
4. 内置运算符
- 列表使用方法相同
- +(合并,生成新元组)、
- *(重复,生成新元组)、
- len(获取长度)、
- tuple(元组转换)、
- in测试
# 列表与元组相互转换
fruits_list = ['apple', 'banana', 'orange']
fruits_tuple = tuple(fruits_list)
print(fruits_tuple)
输出:
('apple', 'banana', 'orange')
集合
Python中的集合跟数学上的集合是一致的,不允许有重复元素,而且可以进行交集、并集、差集等运算。
- set() 转换为集合
- 集合可以将列表去重
- 增加集合元素方法
- set.add() # 单个元素
- set.update(list) # 必须是可迭代的对象
- 删除集合
- set.discard()
- set.remove()
- 交集、并集、差集等运算
- (set1 & set2) # 交集
- (set1 | set2) # 并集
- (set1 - set2) # 差集
- (set1 ^ set2) # 对称差集
# 集合可以去重
>>> set1 = {1, 2, 3, 3, 3, 2}
>>> print(set1)
{1, 2, 3}
# 获取集合长度
>>> print('Length =', len(set1))
Length = 3
# 创建数字1-9的集合
>>> set2 = set(range(1, 10))
>>> print(set2)
{1, 2, 3, 4, 5, 6, 7, 8, 9}
# 增加集合元素方法
>>> set1.add(4)
>>> set1.add(5)
>>> set2.update([11, 12])
>>> print(set1)
{1, 2, 3, 4, 5}
>>> print(set2)
{1, 2, 3, 4, 5, 6, 7, 8, 9, 11, 12}
# 移除集合元素
>>> set2.discard(5)
>>> set2.remove(4)
>>> print(set2) # 如果不存在会引发KeyError
{1, 2, 3, 6, 7, 8, 9, 11}
# 将元组转换成集合
>>> set3 = set((1, 2, 3, 3, 2, 1))
>>> print(set3.pop())
1
>>> print(set3)
{2, 3}
# 集合的交集、并集、差集、对称差运算
set1={1, 2, 3, 4, 5}
set2={1, 2, 3, 6, 7, 8, 9, 11, 12}
>>> print(set1 & set2) # 交集
# print(set1.intersection(set2))
{1, 2, 3}
>>> print(set1 | set2) # 并集
# print(set1.union(set2))
{1, 2, 3, 4, 5, 6, 7, 8, 9, 11, 12}
>>> print(set1 - set2) # 差集
# print(set1.difference(set2))
{4, 5}
>>> print(set1 ^ set2) # 对称差集
# print(set1.symmetric_difference(set2))
{4, 5, 6, 7, 8, 9, 11, 12}
# 判断子集和超集
>>> print(set2 <= set1)
# print(set2.issubset(set1))
False
>>> print(set3 <= set1)
# print(set3.issubset(set1))
True
>>> print(set1 >= set2)
# print(set1.issuperset(set2))
False
>>> print(set1 >= set3)
# print(set1.issuperset(set3))
True
元组总结:
Python 的元组与列表类似,它和列表一样可以保存多条数据,不同之处在于元组的元素不能修改
这里有一个非常值得探讨的问题,我们已经有了列表这种数据结构,为什么还需要元组这样的类型呢?
- 2.1 元组中的元素是无法修改的,事实上我们在项目中尤其是多线程环境中可能更喜欢使用的是那些不变对象
(一方面因为对象状态不能修改,所以可以避免由此引起的不必要的程序错误,简单的说就是一个不变的对象要比可变的对象更加容易维护;另一方面因为没有任何一个线程能够修改不变对象的内部状态,一个不变对象自动就是线程安全的,这样就可以省掉处理同步化的开销。一个不变对象可以方便的被共享访问)。
所以结论就是:如果不需要对元素进行添加、删除、修改的时候,可以考虑使用元组,当然如果一个方法要返回多个值,使用元组也是不错的选择。 - 2.2 元组在创建时间和占用的空间上面都优于列表。我们可以使用sys模块的getsizeof函数来检查存储同样的元素的元组和列表各自占用了多少内存空间,这个很容易做到。我们也可以在ipython中使用魔法指令%timeit来分析创建同样内容的元组和列表所花费的时间
集合总结:
- 平时使用比较少,但是需要掌握交集、并集、差集等运算。