如何根据要解压缩的变量数解压缩不同的值

时间:2019-03-05 23:46:14

标签: python iterable-unpacking

我正在摸索如何根据要解压缩为例如的变量的数量从类中有条件地解压缩变量。根据我在作业左侧设置的数字,我得到了一组不同的变量。

例如,让我们考虑同时具有x,y,z和纬度和经度位置的类:

class LatLonOrXYZ:
    def __init__(self, x, y, z, lat, lon):
        self.x, self.y, self.z = x, y, z
        self.lat, self.lon = lat, lon

    def __iter__(self):
        # not sure...
        return iter([self.x, self.y, self.z, self.lat, self.lon])

现在我想实现以下目标:

pos = LatLonOrXYZ(x=0, y=1, z=2, lat=3, lon=4)

x, y, z = *pos  # 0, 1, 2
lat, lon = *pos  # 3, 4

是否有任何深奥的python魔术可以完成这种事情?还是我最好只编写一些觉得不必要的方法?

与以往一样,任何帮助,见解或建议都将得到极大的帮助:-)

1 个答案:

答案 0 :(得分:1)

这是完全可行的,但在您的示例中,可能不是最佳的迭代方法。

基本上,像list一样,从迭代器中创建list([*pos]),然后根据需要像list([*pos])[0:3]一样对其进行切片。

这是运行此示例的示例代码:

class LatLonOrXYZ:
    def __init__(self, x, y, z, lat, lon):
        self.x, self.y, self.z = x, y, z
        self.lat, self.lon = lat, lon

    def __iter__(self):
        # not sure...
        return iter([self.x, self.y, self.z, self.lat, self.lon])

pos = LatLonOrXYZ(x=0, y=1, z=2, lat=3, lon=4)

x, y, z = list([*pos])[0:3]
lat, lon = list([*pos])[3:5]

print(x, y, z)
print(lat, lon)

输出:

0 1 2
3 4

请注意,在示例代码中,您正在调用实际的类对象,而不是pos实例。了解差异很重要。

而不是:

pos = LatLonOrXYZ(x=0, y=1, z=2, lat=3, lon=4)

x, y, z = *LatLonOrXYZ  # 0, 1, 2
lat, lon = *LatLonOrXYZ  # 3, 4

您想要做的是:

pos = LatLonOrXYZ(x=0, y=1, z=2, lat=3, lon=4)

x, y, z = *pos  # 0, 1, 2
lat, lon = *pos  # 3, 4

第一行基于类定义instance创建一个对象,或者使用将在代码中用作位置的class的结构和行为创建一个对象

请考虑以下内容:

pos_1 = LatLonOrXYZ(x=0, y=1, z=2, lat=3, lon=4)
pos_2 = LatLonOrXYZ(x=4, y=3, z=2, lat=1, lon=0)

这是两个具有各自特征的不同对象,它们都按照LatLonOrXYZ class的布局进行构造。根据相同的蓝图分离建筑物。

这是一个非常基本的描述,旨在指出事情的要旨。您可以在此处以技术形式阅读有关python classes的更多信息:

Python.org Classes Tutorial

或者,作为一个体面的解释者的例子,但到目前为止,这不是有关此内容的唯一出色的,可访问的讨论,您应该在这里进行谷歌搜索:),

OOP in Python - at Real Python