猿问

Python中的“命名元组”是什么?

Python中的“命名元组”是什么?

Python3.1中的更改我发现了一些东西.。意外:

sys.version_info元组现在是一个命名元组:

我以前从未听说过命名元组,我认为元素可以按数字(如元组和列表中的)或键(如DECTS)进行索引。我从没想过他们会被用两种方式编制索引。

因此,我的问题是:

  • 什么叫元组?
  • 如何使用?
  • 为什么/何时我应该使用命名元组而不是普通元组?
  • 为什么/何时我应该使用普通元组而不是命名元组?
  • 是否有任何类型的“命名列表”(命名元组的可变版本)?


慕丝7291255
浏览 800回答 3
3回答

元芳怎么了

命名元组基本上是容易创建的轻量级对象类型。可以使用类似对象的变量取消引用或标准元组语法引用命名元组实例。它们可以类似于struct或其他常见记录类型,除非它们是不可变的。它们是在Python2.6和Python3.0中添加的,尽管Python 2.4实现的配方.例如,将点表示为元组是常见的。(x, y)..这导致代码如下所示:pt1 = (1.0, 5.0)pt2 = (2.5, 1.5)from math import sqrt line_length = sqrt((pt1[0]-pt2[0])**2 + (pt1[1]-pt2[1])**2)通过使用命名元组,它变得更加可读性:from collections import namedtuplePoint = namedtuple('Point', 'x y')pt1 = Point(1.0, 5.0)pt2 = Point(2.5, 1.5)from math import sqrt line_length = sqrt((pt1.x-pt2.x)**2 + (pt1.y-pt2.y)**2)但是,命名元组仍然向后兼容正常元组,因此以下内容仍然有效:Point = namedtuple('Point', 'x y')pt1 = Point(1.0, 5.0)pt2 = Point(2.5, 1.5)from math import sqrt# use index referencingline_length = sqrt((pt1[0]-pt2[0])**2 + (pt1[1]-pt2[1])**2)  # use tuple unpackingx1, y1 = pt1因此,您应该在任何地方使用命名元组而不是元组,因为您认为对象符号会使您的代码更易读,更易读。..我个人已经开始使用它们来表示非常简单的值类型,特别是当将它们作为参数传递给函数时。它使函数更具可读性,而无需查看元组打包的上下文。此外,你也可以代替普通的不变没有函数的类只和他们一块地。您甚至可以将命名的元组类型用作基类:class Point(namedtuple('Point', 'x y')):     [...]但是,与元组一样,命名元组中的属性是不可变的:>>> Point = namedtuple('Point', 'x y')>>> pt1 = Point(1.0, 5.0)>>> pt1.x = 2.0AttributeError: can't set attribute如果您希望能够更改值,则需要另一种类型。有一个方便的食谱可变记录类型它允许您将新值设置为属性。>>> from rcdtype import *>>> Point = recordtype('Point', 'x y')>>> pt1 = Point(1.0, 5.0)>>> pt1 = Point(1.0, 5.0)>>> pt1.x = 2.0>>> print(pt1[0])     2.0但是,我不知道有任何形式的“命名列表”允许您添加新字段。在这种情况下,你可能只想用字典。命名元组可以使用pt1._asdict()返回{'x': 1.0, 'y': 5.0}并且可以用所有常用的字典函数来操作。

慕田峪4524236

名称是工厂功能做一个元组课程。使用该类,我们也可以创建可以通过名称调用的元组。import collections#Create a namedtuple class with names "a" "b" "c"Row = collections.namedtuple("Row", ["a", "b", "c"], verbose=False, rename=False)   row = Row(a=1,b=2,c=3) #Make a namedtuple from the Row class we createdprint row    #Prints: Row(a=1, b=2, c=3)print row.a  #Prints: 1print row[0] #Prints: 1row = Row._make([2, 3, 4]) #Make a namedtuple from a list of valuesprint row   #Prints: Row(a=2, b=3, c=4)
随时随地看视频慕课网APP

相关分类

Python
我要回答