[:] 运算符在 Python 中的元组中究竟是如何工作的?[复制]

How exactly [:] operator works in tuples in Python? [duplicate]

提问人:MaximusPrima 提问时间:8/28/2023 最后编辑:opeonikuteMaximusPrima 更新时间:8/29/2023 访问量:50

问:

当我使用 Colorgram Library 时,我遇到了一个我不理解的运算符。[:]

print(extraction[0])prints 然后打印.[<colorgram.py Color: Rgb(r=245, g=243, b=238), 64.68350168350169%>extraction[0].rgbRgb(r=245, g=243, b=238)

这是最令人困惑的部分:

当我输入时,它会打印 .操作员在这里究竟是如何工作的?print(extraction[0].rgb[:])(245, 243, 238)[:]

import colorgram
 
extraction = colorgram.extract('img.jpg', 30)
colors = []
 
for c in extraction:
    colors.append(c.rgb[:])
 
print(colors)
Python 运算符 切片

评论

0赞 SaptakD625 8/28/2023
Rgb是使用 Python 库的命名元组。有关更多详细信息,请参阅我的回答。collections

答:

0赞 X-_-FARZA_ D-_-X 8/28/2023 #1

为了完全掌握这个概念,您需要了解 Python 的 2 个机制

operator 重载

切片

首先,我们将看一下切片,因为它比操作员重载要容易得多

请看下面的代码:

my_list = [1, 2, 3, 4, 5]

print(my_list[0])
print(my_list[1:3])
print(my_list[:2])
print(my_list[:])
print(my_list[2:4][::-1])
print(my_list[::-1])

当我们对列表/元组或任何其他可索引类型进行切片时,我们倾向于要求其数据的某些部分带有开始和结束索引

我会将其解释为 [x, y, z],其中 x 是切片的起始索引,y 是结束索引,z 是 1 或 -1 表示切片的方向

所以上面代码的输出是:

1
[2, 3]
[1, 2]
[1, 2, 3, 4, 5]
[]
[5, 4, 3, 2, 1]

以我们需要考虑类和运算符重载概念的方式获得切片部分

class MyClass:

    def __init__(self, red, green, blue):
        self.red = red
        self.green = green
        self.blue = blue


    def __str__(self):
        return f"Rgb(r={self.red}, g={self.green}, b={self.blue})"


    def __getitem__(self, key):
        return (self.red, self.green, self.blue)[key]
    

my_instance = MyClass(100, 152, 180)
print(my_instance)
print(my_instance[:])

在 Python 类中,每个以 2 个下划线开头并以其他 2 个下划线结尾的方法都是称为 dunder 方法(双下划线方法)的保留方法

当你写“c.rgb”时,你会访问一些对象,比如我的示例中的MyClass 当您打印它时,它会类 str 方法并生成 object 的字符串表示形式

当您使用 [] 运算符(方括号算作运算符,如 -、+、*、/、% 等)时,它会调用 getItem 方法,该方法可能以我的方式实现,导致您看到该输出

因此,混淆不在于切片运算符,而在于实现 RGB 类

运行我的代码示例 2 的输出:

Rgb(r=100, g=152, b=180)
(100, 152, 180)
0赞 SaptakD625 8/28/2023 #2

根据 PyPi Colorgram 文档

色图。颜色 从图像中提取的颜色。其特性是:

Color.rgb - 表示为 RGB 的命名元组的颜色,从 0 到 255,例如(r=255,g=151,b=210)。

什么是命名元组?

  1. 命名元组是常规元组的子类,由 集合模块。它允许您定义一个新的元组类型 命名字段(如对象的属性)及其 相应的指数。
  2. 命名元组也是不可变的,就像 常规元组。
  3. 命名元组的优点是可读性更强 和自记录代码,因为您可以按名称访问字段 而不是整数索引。
  4. 命名元组具有用于 转换为字典和字符串表示形式,可以是 有用。

在示例中,名为 tuple 的 Color 定义如下:

>>> from collections import namedtuple  
>>> Color = namedtuple('Rgb', ['r', 'g', 'b'])
>>> my_color = Color(245, 243, 238)

如果您尝试打印:my_color

>>> my_color
Rgb(r=245, g=243, b=238)
>>> type(my_color)
<class '__main__.Rgb'>

现在,如果你尝试打印,你会注意到切片命名元组的类型不再是类型,而是普通的 Python 。mycolor[:]Rgbtuple

>>> print(my_color[:])
(245, 243, 238)
>>> type(my_color[:])
<class 'tuple'>

如果 colorgram 为您提供了命名元组,您当然可以像使用任何元组一样使用索引,但您也可以按名称访问属性。例如,如果我想访问元组的参数,我可以执行以下任何操作。gRgb

>>> my_color[1]
243
>>> my_color.g
243
>>> getattr(my_color, 'g')