提问人:MaximusPrima 提问时间:8/28/2023 最后编辑:opeonikuteMaximusPrima 更新时间:8/29/2023 访问量:50
[:] 运算符在 Python 中的元组中究竟是如何工作的?[复制]
How exactly [:] operator works in tuples in Python? [duplicate]
问:
当我使用 Colorgram Library 时,我遇到了一个我不理解的运算符。[:]
print(extraction[0])
prints 然后打印.[<colorgram.py Color: Rgb(r=245, g=243, b=238), 64.68350168350169%>
extraction[0].rgb
Rgb(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 的 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)
色图。颜色 从图像中提取的颜色。其特性是:
Color.rgb - 表示为 RGB 的命名元组的颜色,从 0 到 255,例如(r=255,g=151,b=210)。
什么是命名元组?
- 命名元组是常规元组的子类,由 集合模块。它允许您定义一个新的元组类型 命名字段(如对象的属性)及其 相应的指数。
- 命名元组也是不可变的,就像 常规元组。
- 命名元组的优点是可读性更强 和自记录代码,因为您可以按名称访问字段 而不是整数索引。
- 命名元组具有用于 转换为字典和字符串表示形式,可以是 有用。
在示例中,名为 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[:]
Rgb
tuple
>>> print(my_color[:])
(245, 243, 238)
>>> type(my_color[:])
<class 'tuple'>
如果 colorgram 为您提供了命名元组,您当然可以像使用任何元组一样使用索引,但您也可以按名称访问属性。例如,如果我想访问元组的参数,我可以执行以下任何操作。g
Rgb
>>> my_color[1]
243
>>> my_color.g
243
>>> getattr(my_color, 'g')
评论
Rgb
是使用 Python 库的命名元组。有关更多详细信息,请参阅我的回答。collections