Collection学习之tuple及namedetuple,总结输出:
一、tuple
1.1特点
- 是元组,元素个数具有不可变性,不能对其中元素值进行修改,但如果元素是可变的list除外,但通常不建议这么使用;
- 可迭代iterable,即可以一一遍历其中的元素;
- 可拆包,即可位置提取其中的元素使用;
- 例: user_tuple=("zhangsan",30,180)
- •#拆包用法1。
- name,age,height=user_tuple
- print(name,age,height)
- 结果:zhangsan,30,180
- •#拆包用法2
- name,*other=user_tuple
- print(name,*other)
- 结果:zhangsan,[30,180]
1.2比list的优势
- 是不可变对象即immutable,可得来:性能优化-编译时tuple值确定下来,可提升速度。
- 线程安全-不被修改,所以是安全的
- 可作为dict的key
- 例:user_info_dict={}
- user_info_dict[user_tuple]="lisi"
- print(user_info_dict)
- 结果:lisi,30,180
- 可拆包
理解类比:tuple类比C语言中的struct,list类比C语言中的array。
1.3扩充知识:可哈希,魔法函数,python变量实质
- 可哈希
- hash,又称“散列”,直译为“哈希”,是把任意长度的输入,通过散列算法,变成固定长度的输出,该输出为散列值。这种转换是一种压缩映射,即,散列值得空间通常远小于输入的空间,不同的输入可能散列成相同的输出,所以,不能从散列值来唯一确定输入值。
- hash主要用于信息安全领域中的加密算法,把一些不同长度的信息转化成杂乱的128位的编码里,叫hash值,也即hash就是找到一种数据内容和数据存放地址之间的映射关系。著名的hash 算法有MD5,SHA1目前应用最广泛,都是以MD4为基础设计的。
- 可哈希,一个对象在其生命周期内,如果保持不变,就是hashable。python中,list,set,dict都是可变的,如:list.append(),set.remove(),dict['key']=value,所以,都不可哈希。而tuple,string,objects不可变,只能复制或切片,所以是可哈希的。
2. python变量实质:
- 通俗理解,可理解为便利贴(指针),数据存储在那里,发生赋值语句,就是把便利贴往数据存储地方贴,如:b=[3,4,5],计算机为[3,4,5]这个数据开辟存储地址,然后赋值给变量b,把b这张便利贴往存储地址贴,a=b,就是把a这张便利贴往b所在地方贴,所以a和b贴的都是同一地方,即a和b指向同一内存地址(同一个数据)
3. 魔法函数
- 魔法函数即是pyton内置的以双下划线开头并以双下划线结尾的函数(不能自己定义),如:__init__(),__str__(),__getitem__()等,用于实现并定制很多特性,非常灵活,且是隐式调用。
- 魔法函数的使用目的:相当于JAVA或C++中的函数重载,即对类中的内置方法进行重载,按自己要求实现。
二、namedtuple
是tuple的增强,可用来定义tuple类对象,其中含有很多方法,其中最常用和重要的是_make和_asdict方法。
namedtuple好处:可以节省空间,使用tuple的用法,可以对类对象进行拆包,在数据处理过程中,namedtuple会使用的特别多。
使用举例:
用法1:
类名=namedtuple(类名,属性) #用法说明
1.User=namedtuple(“User”,["name",“age”,“height”,“edu”])
2.user=User(name=“zhangsan”,age=30,height=180,edu=“bachelor”)
print(user.name,user.height,user.age)
另外,初始化,可以用tuple进行初始化:
3.user_tuple=("zhangsan",30,180)
4.user=User(*user_tuple,“bacherlor”)//*user_tuple即*args,**kwargs函数参数形式,其中*args为tuple格式,**kwargs为dict格式。
print(user.name,user.height,user.age)
用法2:#使用_make方法
即在初始化时,使用_make方法:
5.user_tuple=("zhangsan",30,180,"bachelor")
6.user=User._make(user_tuple)#注意:make的参数必须是iterable对象,即除了tuple,也可以是list和dict;但使用_make方法参数个数一定要一致!!!
print(user.age,user.name,user.edu)
用法3:#使用_asdict方法
方法作用:可以将tuple对象转换成dict,其中dict的参数顺序是按参数名的字母从小到大排序。
在第6句基础上,
user_info_dict=user._asdict()
用法4:进行拆包
在第6句基础上,
name,age,*other=user
print(name,age,*other)#结果:zhangsan,30,[180,"bachelor"]