3

函数定义为:

def addVectors((angle1, length1), (angle2, length2)):
    x  = math.sin(angle1) * length1 + math.sin(angle2) * length2
    y  = math.cos(angle1) * length1 + math.cos(angle2) * length2

    angle = 0.5 * math.pi - math.atan2(y, x)
    length  = math.hypot(x, y)

    return (angle, length)

它是这样使用的:

def collide(p1, p2):
    dx = p1.x - p2.x
    dy = p1.y - p2.y

    dist = math.hypot(dx, dy)
    if dist < p1.size + p2.size:
        angle = math.atan2(dy, dx) + 0.5 * math.pi
        total_mass = p1.mass + p2.mass

        (p1.angle, p1.speed) = addVectors((p1.angle, p1.speed*(p1.mass-p2.mass)/total_mass), (angle, 2*p2.speed*p2.mass/total_mass))
        (p2.angle, p2.speed) = addVectors((p2.angle, p2.speed*(p2.mass- p1.mass)/total_mass), (angle+math.pi, 2*p1.speed*p1.mass/total_mass))
    p1.speed *= elasticity
    p2.speed *= elasticity

我的问题是python 3只会让我给一个函数赋值一组括号,但是这里的例子使用了两个,结果和获取方式都是本课程的结果。我不确定是否有办法解决这个问题,或者我是否必须重组公式,我真的不确定我能做到。有什么建议吗?另外,我从 Peter Collingridges 关于球物理的教程中获取了这段代码,其余的都在他的网站http://www.petercollingridge.co.uk上。先谢谢了

4

2 回答 2

0

Python 3删除了在函数签名中解包元组的能力,这就是你的 python 2 函数中发生的事情。

如果您仍想将参数作为元组传递,则无需更改任何调用站点;您只需为每个元组命名(angleAndLength1?)并使用angleAndLength1[0] 和angleAndLength1[1] 来获取参数。在这种情况下,最好只删除括号并传递四个参数,因为无论如何您都必须在调用者中构建一个元组。

您可以这样做来复制旧的行为,因为元组解包外部函数签名仍然有效:

def addVectors(angleAndLength1: tuple, angleAndLength2: tuple):
  angle1, length1 = angleAndLength1
  angle2, length2 = angleAndLength2
  # the rest of your code
于 2013-09-06T23:43:02.173 回答
0

您可以将两个元组分别替换为单个变量,例如:

def addVectors(r1, r2):
    x  = math.sin(r1[0]) * r1[1] + math.sin(r2[0]) * r2[1]
    y  = math.cos(r1[0]) * r1[1] + math.cos(r2[0]) * r2[1]

    angle = 0.5 * math.pi - math.atan2(y, x)
    length  = math.hypot(x, y)

    return (angle, length)

然后你可以使用addVectors((0,10),(30,50)).

于 2013-09-06T23:49:45.350 回答