tuple
- 不可变, iterable
name_tuple = ('bob', 'sam')
for name in name_list:
print(name)
name_tuple[0] = 'Tim' # error
- 拆包
user_tuple = ("bobby", 29, 175)
name, age, height = user_tuple
else:
name = user_tuple[0]
age = user_tuple[1]
height = user_tuple[2]
user_tuple = ("bobby", 29, 165, "beijing")
name, *others = user_tuple
print(name, others)
ohters is a list
- tuple的不可变不是绝对的
name_tuple = ("bobby", [29, 175])
name_tuple[1].append(22)
print(name_tuple)
tuple内的不可hash对象是可变的 4. tuple比list多的功能
- immutable的重要性
性能优化
指出元素全部为immutabble的tuple会作为常量在编译时确定,因此产生了显著的速度差异线程安全
可以作为dict的key
··· name_tuple = ('bobby',29) user_info_dict = {} user_info_dict[user_tuple] = "bobby" ···拆包特性
- 如果拿C语言类比,tuple是struct, list是array
namedtuple
- usage
from collections import namedtuple
User = namedtuple("User", ["name", "age", "height"])
user = User(name="bobby", age=29, height=175)
print(user.age, user.name, user.height)
class User:
def __init__(self, name, age, height):
pass
# why not define a class
# namedtuple是tuple的一个子类,使用起来比较简单
# 省空间, 不必创建不需要的类属性
···
2. 可由tuple初始化namedtuple
···
from collections import namedtuple
User = namedtuple("User", ["name", "age", "height"])
user_tuple = ("bobby", 29, 175)
user = User(*user_tuple)
User2 = namedtuple("User", ["name", "age", "height", "edu"])
user2 = User2(*user_tuple, "master")
···
3. _make()的用法
def _make(cls, iterable, ...)
User = namedtuple("User", ['name', 'age', 'height', 'edu']) user_list = ['bobby', 28, 175, 'master'] user_tuple = ('bobby', 28, 175, 'master') user_dict = { "name": "bobby", "age": 29, "height": 175, "edu": "master"} user = User._make(user_list) user2 = User._make(user_tuple) user3 = User._make(user_dict)
4. asdict()的用法 tuple -> dict
def _asdict(self)
User = namedtuple("User", ["name", "age", "height"]) user_tuple = ("bobby", 29, 175) user = User(*user_tuple) user_info_dict = user._asdict()
defaultdict
- dict usage: setup a dict
users = ['bobby1', 'bobby2', 'bobby3', 'bobby1', 'bobby2', 'bobby1']
duer_dict = {}
for user in users:
if user not in user_dict:
user_dict[user] = 1
else:
user_dict[user] += 1
print(user_dict)
- setdefault usage
users = ['bobby1', 'bobby2', 'bobby3', 'bobby1', 'bobby2', 'bobby1']
duer_dict = {}
for user in users:
user_dict.setdefault(user, 0)
user_dict[user] += 1
print(user_dict)
- defaultdict usage
from collections import defaultdict
default_dict = defaultdict(list) # callable object
default_dict['bobby']
users = ['bobby1', 'bobby2', 'bobby3', 'bobby1', 'bobby2', 'bobby1']
default_dict2 = defaultdict(int)
for user in users:
default_dict2[user] = 1
- defaultdict and dict
def gen_default():
return {
"name": "test",
"nums": 0
}
default_dict = defaultdict(gen_default)
default_dict['group1']
# deque
1. usage
from collections import deque example = deque() user_deque = deque(['bobby1', 'bobby2']) user_deque.append('bobby3') user_deque.appendleft('bobby0') user_deque2 = user_deque.copy() # shallow copy print(id(user_deque), di(user_deque2)) import copy user_deque3 = copy.deepcopy(user_deque)
2. deque thread safe/ list is not thread safe
deque GIL
3. reverse
# Counter