说来惭愧,我用python这么久了,还是第一次发现namedtuple这么好的东西。第一段代码:fromcollectionsimportnamedtuplePoint=namedtuple('Point',['x','y'])pt1=Point(1.0,5.0)pt2=Point(2.5,1.5)frommathimportsqrtline_length=sqrt((pt1Is't.x-pt2.x)**2+(pt1.y-pt2.y)**2)有趣吗?Point就像一个定义了x和y属性的类,可以直接创建实例,所有的实例都可以以.x,.y的形式访问它们的属性,这比直接定义类简单多了:classPoint:def__init__(self,x:float,y:float):self.x=xself.y=ypt1=Point(1.0,5.0)pt2=Point(2.5,1.5)frommathimportsqrtline_length=sqrt((pt1.x-pt2.x)**2+(pt1.y-pt2.y)**2)显然,它也比使用原始元组更具可读性:pt1=(1.0,5.0)pt2=(2.5,1.5)frommathimportsqrt#使用索引referencingline_length=sqrt((pt1[0]-pt2[0])**2+(pt1[1]-pt2[1])**2)#使用元组解包x1,y1=pt1这只是两个各位,再多一点,各种数字都能让人头晕目眩。所以namedtuple是一种基于元组创建数据类的捷径,可以让我们快速方便的定义数据结构。当然,它也有一个明显的缺点:由于底层是用tuple实现的,不可能改变(immutable),所以像pt1.x=7这样的语句显然会报错。如果你想要一个可变的快捷数据类,你可以使用pyrecord:frompyrecordimportRecordPoint=Record.create_type('Point','x','y')pt1=Point(1.0,5.0)pt2=Point(2.5,1.5)frommathimportsqrtline_length=sqrt((pt1.x-pt2.x)**2+(pt1.y-pt2.y)**2)pt1.x=3.6new_length=sqrt((pt1.x-pt2.x)**2+(pt1.y-pt2.y)**2)
