2018-10-21 022 元组进阶 B
2018-10-21 本文已影响2人
杜若飞er
嵌套元组拆包
元组不仅可以作为列表的元素出现,也可以作为另一个元组的其中一个元素出现,此时也可以嵌套拆包——换言之,只要拆包嵌套结构和类型本身的结构相符合,都是可以做出反应的,举了例子,我们在处理解析几何问题时经常会接触到很多变量,这些变量本身包括变量名和横纵坐标信息,其本身可以用微博记录法记录下来,而坐标信息可以构成一个子元组:
List_Math = [
('A', (2, 5)),
('B', (-3,6)),
('C', (-7, -5))
]
Tuple_Point = ('D', (9, -4))
List_Math.append(Tuple_Point)
print(List_Math)
for (name, (c, r)) in List_Math:
if(c < 0) and (r < 0):
print('this point is ', name)
#结果如下:
[('A', (2, 5)), ('B', (-3, 6)), ('C', (-7, -5)), ('D', (9, -4))]
this point is C
在这段程序中,我们就通过记录元组的最后一个信息拆包的结果放在变量的元组里,实现了嵌套拆包,并获取来每个值的坐标,通过筛选选出了位于第三象限的点并把名字输出一下;
具名元组
从某种意义上来说,元组作为我们称之为微博记录法的记录条目已经足够强大并且相对安全(在如果我们对这些记录的相对顺序还有要求的话,狭义的微博记录法,即List-Tuple记录法就不那么安全了),但元组还是缺少一个很重要的功能:给记录中的某个字段进行命名,当有这种需求时,我们可以使用namedtuple函数进行实现:
from collections import namedtuple
Point = namedtuple('Point', 'Name Locate')
#第一个参数是类名,第二个参数是用空格隔开的若干字段
A = Point("A", (6, 7))
print(A)
#结果如下:
Point(Name='A', Locate=(6, 7))
namedtuple函数实际上是一个工厂函数,在构建一个元组的同时创建一个带名字的类,可能有的读者会怀疑,既然创建了新的数据类型,那么会不会导致储存效率的下降?毕竟我们不选择那种直观而古老的一一对应法就是因为太多重复信息的录入,实际上,这个函数所构建的类所创建的实例所占内存和元组是一样的,比普通的类创建的对象实例要小得多,因为Python不用 dict 储存实例属性。
因为和类说不清道不明的联系,所以这个记录法很多操作和类有相似之处,举个例子:
print( A.Name )
这样的解决办法还可以和自己已经知道的一些方法相互拓展,比如说具名元组的拆包之类的,大家应该差不多都知道应该怎么办了。
多说两句
我感觉那本难读的大部头,让我一个人去啃,未必能坚持到第一章结束,但是抱着写博客的心理去看,自认为还是颇有些收获的,学习别的,大概也如此;