python collections.namedtuple,什么是namedtuple

  python collections.namedtuple,什么是namedtuple

  本文介绍了命名元组在python中的重要用法。深入介绍命名元组的概念。通过理解为什么以及如何使用它们,代码会变得更加简洁。学完这本指南,你一定会喜欢的。

  在本教程结束时,学习目标应该是:

  了解将常规元组和字典转换为命名元组的原因,以及使用此选项字段将命名元组转换为字典或常规元组并对命名元组列表进行排序的原因。理解NamedTuples和DataClass之间的区别。

  如果大家在学习中遇到困难,想找一个python学习交流环境,可以加入我们的python裙,裙号930900780,领取python学习资料,会节约很多时间,减少很多遇到的难题。

  为什么使用namedtuple?Namedtuple是一个非常有趣(被低估)的数据结构。你可以很容易地找到Python代码,它严重依赖于普通的元组和字典来存储数据。我不是说不好,只是有时候他们会被虐待。慢慢听我说。

  假设有一个将字符串转换成颜色的函数。颜色必须在四维空间RGBA中表达。

  def convert _ string _ to _ color(desc:str,阿尔法:float=0.0):如果desc== green :返回50、205、50

  复制R,G,B,A=convert _ string _ to _ color(desc=蓝色,alpha=1.0)代码也没关系。但是这里有几个问题。首先,不能保证返回值的顺序。也就是说,没有什么可以阻止其他开发者这样叫它。

  Convert_string_to_color:g,b,r,a=convert _ string _ to _ color(desc= blue ,alpha=1.0))。此外,您还可以复制代码。

  复制R,G,B=convert _ string _ to _ color(desc= blue ,alpha=1.0)代码时,返回值不够,所以会抛出并调用ValueError错误

  确实如此。但是,你可能会想,为什么不用字典呢?

  Python字典是一种非常常见的数据结构。这些是存储多个值的简单方法。然而,词典并非没有缺点。由于词典的灵活性,它很容易被滥用。请在使用词典后看例句。

  def convert _ string _ to _ color(desc:str,Alpha:float=0.0):if desc== green 3:return( r 3: Alpha :Alpha elifdesc= blue 3333660 Alpha 360 Alpha } g :0, b: 0, Alpha 我们现在可以这样使用。我希望只返回一个值:

  color=convert _ string _ to _ color(desc= blue ,alpha=1.0)复制代码不需要记住顺序,但是至少有两个缺点。首先,我们必须追踪密钥的名称。将此更改为{r: 0、" g ":" b ";和" alpha ":" green ";和" blue ":

  字典的第二个问题是它们不能被散列。这意味着它不能保存在set或其他词典中。假设您想要跟踪特定图像的颜色数量。使用集合。计数器进行计数以获取类型错误:unhashabletype :"dict "。

  此外,字典是可变的,因此您可以根据需要添加任意多的新键。相信我,这是难以发现的儒家心链的错误。

  是的,就这些。那现在怎么办?你能用什么来代替它?

  namedtuple!对,就是这样!

  将我们的函数转换为使用namedtuple。

  fromcollectionsimportnamedtuple。color=命名元组( color , r g b alpha )。defconvert_string_to_color)

   reen :返回颜色(r=50,g=205,b=50,alpha=alpha) elif desc==blue :返回颜色(r=50,g=0,b=255,alpha=alpha) else:返回颜色(r=50,g=0,B=0,alpha=alpha)复制代码。和dict的情况一样,我们可以给单个变量赋值,并根据需要使用它们。不需要记住顺序。而且,如果使用的是PyCharm、VSCode等ide,可以自动提示完成。

  color=convert _ string _ to _ color(desc=蓝色,alpha=1.0).has _ alpha=color.alpha 0.0.is _ black=color . r==0 and color . g==0 and color . b==0。复制代码最重要的一点是namedtuple是不可变的。如果团队中的另一个开发人员认为在运行时添加一个新字段是个好主意,程序将会报告一个错误。

  blue=Color(r=0,g=0,b=255,alpha=1.0)blue . e=0-attribute error trace back(最近一次调用last)Iphon-input-13-8 c 7 f 9 b 29 c 633 in module-1 blue . e=0属性错误: Color 对象没有属性 e 复制代码。不仅如此,现在我们可以使用它的计数器来跟踪一组中有多少种颜色。

  Counter ([blue,blue]) counter ({color (r=0,g=0,b=255,alpha=1.0): 2}) Copy code如何将正则元组或字典转换为命名元组现在我们知道了为什么要使用命名元组,是时候学习如何将正则元组和字典转换为命名元组了。假设出于某种原因,您有包含彩色RGBA值的字典实例。如果你想把它转换成彩色命名的双重,你可以按照下列步骤:

  C={r: 50, g: 205, b: 50, alpha :alpha } color(* * c)color(r=50,g=205,b=50,alpha=0)复制代码我们可以用这个* *结构来解压包dict。

  如果我想从dict创建一个namedtupe,我该怎么做呢?

  没问题,你可以这样做:

  C={r: 50, g: 205, b: 50, alpha :alpha } color=named tuple( Color ,c) color (* * c) color (r=50,g=205,b=50,)然后,Color像上面的例子一样解压缩dictionary C,并创建一个新的实例。

  如何将namedtuple转换为dictionary或Regular Tuple我们刚刚学习了如何将namedtuple转换为Dict。反过来呢?我们如何将它转换成字典实例?

  实验表明,namedtuple有一个名为。_asdict()。因此,转换它就像调用一个方法一样简单。

  蓝色=颜色(r=0,g=0,b=255,alpha=1.0)蓝色。_ asdict () {r: 0, g: 0, b: 255, alpha: 1.0}复制代码你可能会奇怪这个方法为什么以_开头,这是一个不符合Python通用规范的地方。通常,_表示私有方法或属性。但是,namedtuple将它们添加到公共方法中,以避免命名冲突。除了_asdict,还有_replace、_fields和_field_defaults。这些你都可以在这里找到。

  要将namedtupe转换成常规tuple,只需将其传递给tuple构造函数即可。

  Tuple (color (r=50,g=205,b=50,alpha=0.1)) (50,205,50,0.1)复制代码如何对命名元组列表进行排序另一个常见的用例是在列表中存储多个命名元组实例,并根据一定的条件对它们进行排序。例如,假设我们有一个颜色列表,我们需要按照alpha强度对它进行排序。

  幸运的是,Python允许一种非常类似Python的方式来实现这一点。我们可以使用operator.attrgetter运算符。根据文档,attrgetter“返回一个从其操作数中获取attr的可调用对象”。简单地说,我们可以使用这个操作符来获取传递给sorted函数的排序字段。示例:

  从操作员导入attrgetter.colors=[颜色(r=50,g=205,b=50,alpha=0.1),颜色(r=50,g=205,b=50,alpha=0.5),颜色(r=50,g=0,b=0,Alpha=0.3)].sorted (colors,key=attr getter( alpha ))[color (r=50,g=205,b=50,alpha=0.1),color(r=50,g=0,b=0,alpha=0)

  如何将命名元组序列化为JSON有时您可能需要将存储的命名元组转换为JSON。Python的字典可以通过json模块转换成JSON。然后我们可以用_asdict方法把元组转换成字典,然后就和字典一样了。例如:

  Blue=color (r=0,g=0,b=255,alpha=1.0)导入json.dumps (blue。_ asdict ()) {r: 0, g: 0, b: 255, alpha: 1.0}。

  在Python中,我们可以使用纯字符串来记录方法、类和模块。这个字符串可以用作名为__doc__的特殊属性。也就是说,我们如何将docstring添加到我们的Color namedtuple中?

  我们可以通过两种方式做到这一点。第一个(比较麻烦)是使用包装器扩展元组。这样,我们便可以帮助文本在此包装器中定义。例如,请考虑以下代码片段:

  _Color=namedtuple(Color , r g b alpha)class Color(_Color): 表示颜色的名为duple .它有四个字段:r -红色g -绿色b -蓝色阿尔法-阿尔法通道打印(彩色. doc__)表示颜色的命名元组。它有四个字段:r -红色g -绿色b -蓝色阿尔法-阿尔法通道帮助(颜色)模块__main__中有关类颜色的帮助:类颜色(颜色)颜色(r,g,b,alpha) 表示颜色的命名元组。它有四个字段: r-红色 g-绿色 b-蓝色 alpha-alpha通道 方法解析顺序: Color Color 内建。元组内置。对象 此处定义的数据描述符: _ _词典__ 实例变量字典(如果已定义)复制代码如上,通过继承_颜色元组,我们为命名图添加了一个__doc__属性。

  添加的第二种方法,直接设置__doc__属性。这种方法不需要扩展元组。

  颜色. doc__= 表示颜色的命名元组。它有四个字段:r -红色g -绿色b -蓝色阿尔法-阿尔法通道复制代码注意,这些方法仅适用于Python 3。

  限于篇幅,先到这下篇继续。

  最后多说一句,小编是一名python开发工程师,这里有我自己整理的一套最新的python系统学习教程。想要这些资料的可以进q裙930900780领取。

  本文章素材来源于网络,如有侵权请联系删除。

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: