【问题标题】:python:How to use the correct data type?python:如何使用正确的数据类型?
【发布时间】:2015-06-09 13:24:42
【问题描述】:

我想在 python+matplotlib 中同时绘制数百个二维三角形(带标签),所以我要把这些三角形放在一个列表中:

三角形 =[ (label_1, A, B, C) , (label_2, D,E,F),...]

在 (label , A, B, C) 中,A,B,C 是三角形的三个顶点,所以它们就像 (x,y) 这样的实数对,而 label 可能是一个字符串(三角形的颜色或名称)

现在问题出现了:我如何告诉 python A=(x,y) 是平面中的一个点,而不仅仅是“两个元素的元组”? 由于我需要执行“A+0.2*B”操作,因此会导致错误:“不能将序列乘以非整数类型的 'float'

提前致谢!

【问题讨论】:

    标签: python python-2.7


    【解决方案1】:

    您可以创建一个自定义的Point 类,并定义加法和乘法的行为:

    class Point:
        def __init__(self, x, y):
            self.x = x
            self.y = y
        def __mul__(self, value):
            return Point(self.x*value, self.y*value)
        def __rmul__(self, value):
            return self.__mul__(value)
        def __add__(self, other):
            return Point(self.x+other.x, self.y+other.y)
        def __repr__(self):
            return "Point({}, {})".format(self.x, self.y)
    
    a = Point(1,2)
    b = Point(23, 42)
    x = a + 0.2 * b
    print x
    #result: Point(5.6, 10.4)
    

    【讨论】:

    • 太乏味了!我想我可以在初始化列表时告诉python你的点,比如 (label ,A ,B, C) =('red', complex ((0,0)),complex((0,1)),复杂的((1,1)))?
    • 你会做('red', Point(0,0), Point(0,1), Point(1,1))。不知道您所说的“乏味”是什么意思。
    • :我的意思是,python有自己对2D点操作的支持,我们不需要手动创建它们,我们只需要告诉python正确的数据类型。
    • 我会添加一个__slots__ = ['x', 'y'] 声明。
    【解决方案2】:

    为什么不使用 python 对复数的支持呢?您可以将复数视为平面(Argand 平面)中的一个点。

    演示复数乘法:

    >>> (3+4j) + 0.2*(5+7j) #Use "j" instead of "i" in python
    (4+5.4j)
    

    顺便说一句,你的三角形可能看起来像:

    triangles = [
         ("label1", 3+4j, 5+6j, 7+8j),
         ("label2", 1+2j, 2+3j, 4+5j),
         #...
    ]
    

    【讨论】:

    • :导入额外的模块来支持复数?
    • 不,没有额外的模块。
    猜你喜欢
    • 2015-05-28
    • 2015-12-17
    • 1970-01-01
    • 2019-08-12
    • 2015-09-19
    • 1970-01-01
    • 2021-09-25
    • 2016-11-20
    相关资源
    最近更新 更多