2014-03-13 23 views
1

我有3个数学运算函数,我需要使用point3的值。我想知道是否有人能够以一种更清晰,更简洁的方式更好地书写这些功能。Python的凝结函数+ - *

谢谢。

ptA = [10.0, 20.0, 30] 
ptB = [50, 50 ,50] 
percent = .50 


def addPoint3(ptA,ptB): 

    idA = ptA[0] + ptB[0] 
    idB = ptA[1] + ptB[1] 
    idC = ptA[2] + ptB[2] 

    return [idA,idB,idC] 

def subtractPoint3(ptA,ptB): 

    idA = ptA[0] - ptB[0] 
    idB = ptA[1] - ptB[1] 
    idC = ptA[2] - ptB[2] 

    return [idA,idB,idC] 

def percentagePoint3(ptA,percentage): 

    idA = ptA[0] * percentage 
    idB = ptA[1] * percentage 
    idC = ptA[2] * percentage 

    return [idA,idB,idC] 



add = addPoint3(ptA,ptB) 
sub = subtractPoint3(ptA,ptB) 
per = percentagePoint3(ptA,percent) 
print add,sub,per 
+1

我觉得这个问题可能更适合[Code Review](http://codereview.stackexchange.com/),另一个Stack Exchange站点。 – 2014-03-13 23:12:29

回答

4

你可以写一个Point类,并实现算术运算符。一个简单的例子是:

class Point(object): 
    def __init__(self, *args): 
     self.coords = args 

    def __add__(self, other): 
     return Point(*[(x + y) for (x, y) in zip(self.coords, other.coords)]) 

    def __repr__(self): 
     coord = ', '.join("{}".format(x) for x in self.coords) 
     return "<Point ({})>".format(coord) 

,你可以使用这样的:

ptA = Point(10.0, 20.0, 30) 
ptB = Point(50, 50, 50) 
>>> print ptA + ptB 
<Point (60.0, 70.0, 80)> 

你可以扩展它使用__sub____mul__,并使其多一点健壮,因为现在实施假定许多事情:

  • 你总是添加点(如果你添加一个整数,这将打破,例如)
  • 这两个点都是相同的尺寸

所有这些东西都可以测试,然后泛化的方法。

+0

+1类实现。喜欢便携和清洁! – Signus

+0

实际上,'zip'将截断为具有较少维数的那个。 – jonrsharpe

+0

它会的,但也许这些不是他寻找的语义:-) –

5

您可以使用ziplist comprehensions简化这些。例如:

def addPoint3(ptA, ptB): 
    return [a+b for a, b in zip(ptA, ptB)] 

def percentagePoint3(ptA, percentage): 
    return [pt * percentage for pt in ptA] 

你也可以考虑实施一类,而不是列表,这样你就可以定义这些为实例方法(对于这样的一个例子,看到里卡多Cárdenes'回答)。

0

尝试:

[ptA + ptB for ptA,ptB in zip(ptA, ptB)] 

和更改运营商substractions等

0

如果速度有问题,那么python中最快的矢量化操作不是来自列表,而是来自numpy。例如:

import numpy as np 

ptA = np.array([10.0,20.0,30]) 
ptB = np.ones(3)*50 

pt3 = ptA + ptB #done with c/blas libraries under the hood.