一、Python的封装
封装就是把多个值用‘,’号隔开,然后组合成1个元组,其实,封装的本质就是定义一个元组省略了‘()’而已。
#等式右边就是一个封装,返回一个元组 >>>tuple1 = 3,5,'abc' >>>type(tuple1) tuple >>>tuple1 (3, 5, 'abc')
二、Python的解构
解构就是解开一个数据结构(线性和非线性都可以),然后把里面的元素顺序的赋给其他变量。解开后的元素个数要和变量的个数一致。也不是什么情况下都会解构,只有当一个数据结构需要赋值给多个变量的时候,才会触发解构。
1、几种常见的解构方式
线性结构(str,list,tuple)的解构
#解线性结构 >>>a,b = '12' >>>a,b = (1,2) >>>a,b = [1,2] >>>print(a,b) 1 2
非线性结构(set,dict)的解构
#解非线性结构:set >>>a,b = {1,2} >>>print(a,b) 1 2 #解非线性结构:dict,字典的解构其实是key拿出来了 >>>a,b = {2:'a',3:'b'} >>>print(a,b) 2 3
元素和变量个数不一致的解构
>>>a,b = {10,20,30} ValueError: too many values to unpack (expected 2)
左右两边都发生的解构
>>>[a,b] = (1,2) >>>print(a,b) 1 2
2、使用‘*变量名’接收多个元素
前面说到,如果有多少个元素,就得多少个变量去对应接收,我们还可以使用‘*变量名’的方式,一次性接收解构后的多个元素,但是*变量不能单独使用,*变量也不能出现多次,最后被*变量名接收的变量会组成一个列表。
#元素的第一个和最后一个给了head和tail,剩下都给了min并且组成了列表 >>>list1 = range(1,5) >>>head,*min,tail = list1 >>>print(head,tail,min) 1 4 [2, 3] #元素的第一个给了head,其余都给了other并且组成了列表 >>>head,*other = list1 >>>print(head,other) 1 [2, 3, 4] #*变量单独出现 >>>*name = list1 SyntaxError: starred assignment target must be in a list or tuple #*变量出现了多次,它怎么知道元素该给哪个,所以直接报错 >>>head,*min1,*min2,tail = list1 SyntaxError: two starred expressions in assignment
3、使用丢弃变量接收元素
一个下划线‘_’作为丢弃变量:所谓丢弃变量,意如其名,这个变量不会被使用,它只是作为接收一些无用数据暂时使用,当然这个只是一个约定俗称,并非强制性的标准,你要拿来使用也没有问题,但是既然用了‘_’这个没有参考意义的名称作为变量名,就是希望不被使用的。
#我这里不关心第一个和第三个元素,可以使用丢弃变量‘_’接收 >>>list3 = 'www.xjimmy.com'.split('.') >>>_,domain,_ = list3 >>>domain 'xjimmy'
4、解构的应用
① 实现交换变量:这里先使用了封装,再解构
>>>a = 5 >>>b = 10 #先把b,a封装成元组(b,a),然后再解构,解构后将元素按顺序赋给a,b,最终实现交换 >>>a,b = b,a >>>a 10 >>>b 5
② 提取元素:这里先右边解构list,然后再左边解构元组
#我们要提取元素3 >>>list4 = [1,(2,3,4),5] >>>_,(a,b,c),_ = list4 >>>b 3
5、解构的总结
① 前面介绍的5种基础数据结构都可以解构。
② 解构不分左边右边,两边都可以解构。
③ 解构之后的元素还是一个数据结构,还可以继续解构。
④ 解构之后的元素个数要和普通变量个数保证一致。
⑤ 使用‘*变量名’接收数据的原则是,在保证普通变量能接收到元素的情况下,‘*变量名’尽可能的接收多个元素。
⑥ 如果解构后的元素不需要用的话,可以使用‘_’丢弃变量接收。