t / = d是什么意思? Python并获得错误

时间:2013-03-20 22:14:12

标签: javascript python

// t: current time, b: begInnIng value, c: change In value, d: duration

def: 'easeOutQuad',
swing: function (x, t, b, c, d) {
    //alert(jQuery.easing.default);
    return jQuery.easing[jQuery.easing.def](x, t, b, c, d);
},
easeInQuad: function (x, t, b, c, d) {
    return c*(t/=d)*t + b;
},
easeOutQuad: function (x, t, b, c, d) {
    return -c *(t/=d)*(t-2) + b;
},

我正在尝试将Robert Penner的Easing Functions转换为python并卡住! 任何帮助或其他任何人之前做过这个?

https://github.com/danro/jquery-easing/blob/master/jquery.easing.js

5 个答案:

答案 0 :(得分:6)

在JavaScript和Python中,/=是一个“扩充赋值”运算符,具有几乎相同的含义。

在JS中:

var i = 10;
i /= 2;

......相当于:

var i = 10;
i = i / 2;

而且,在Python中:

i = 10
i /= 2

...同样等同于(不完全相同,但足够接近数字):

i = 10
i = i / 2

但是,有一个很大的区别。

在JavaScript中,赋值是一个表达式 - 它有一个值,该值是赋给变量的值。所以:

var i = 10;
var j = i /= 2;

...大致相当于:

var i = 10;
i /= 2;
var j = i;

在Python中,赋值是一种陈述。它没有任何价值,不能在表达式中使用。所以:

i = 10
j = i /= 2

...提出SyntaxError


在表达式中间移植使用赋值(扩充或其他)的代码通常需要将该表达式分解为多行和/或找到重写表达式以不需要任何赋值的方法。 (但通常情况下,这不是一件坏事,因为无论如何原始表达都不是很可读......)

例如,假设JS从左到右评估操作数(我不确定是否可以保证?):

def easeInQuad(x, t, b, c, d):
    t /= d
    return c*t*t+b

更一般地说,你这样做:

old_t = t
t /= d

然后使用t替换t/=d之前old_t的所有实例,并将所有实例保留在t/=d之后。幸运的是,在这种情况下,没有先前的实例,因此我们不需要old_t个东西。

如果您考虑一下,您可以轻松地获得相同的效果,而无需在一行中更改t,更可读的是,通过以下任何方式:

return c * (t/d) * (t/d) + b
return c * (t/d)**2 + b
return c * t*t / d*d + b

在C中思考的人会立即抱怨这些都“太慢”了。毕竟,第一个进行额外的除法,第二个进行取幂而不是乘法,第三个进行两次乘法而不是一次乘法。恐怖!

当然,您总是可以使用临时变量:

t_over_d = t/d
return c * t_over_d * t_over_d + b

...但是对于C程序员来说,这意味着你正在使用一个有价值的寄存器。当然,在1985年之后编写的每个编译器都会在t出现时检测到t_over_d已经死亡并重复使用相同的寄存器,但为什么不强制它重用如果我们可以注册,特别是如果它也节省了一些击键?

在JS或Python中,乘法的成本只是调用函数和解释字节码的成本的一小部分,依此类推,你甚至都没有注意到它。同时,重新绑定局部变量(特别是在V8风格或PyPy风格的JIT解释器中)的成本可能远远高于传递未命名的临时结果的成本。

因此,这是误导“优化”的范例,使代码更难理解,同时可能减慢速度而不是加速,并且在一个不可能成为值得优化的瓶颈的领域。


由于gnibbler提出了JavaScript是否确实确保此评估顺序的问题......

首先,JavaScript被有效地定义为“Firefox所做的”(以及“Spidermonkey做什么”,但这应该是相同的 - 如果不是,那么JavaScript会做两件事,所以这就是两倍的好,对吗?)。但ECMAScript 由标准定义的,并且每个JS实现(尽管名称)都支付口碑服务,并且我们可以假装ECMAScript 5.1是所有实现符合的标准(这是只要“所有实现”都意味着“Opera”),则为true。你可以找到它here

因此,在ES 5.1中: 11.5乘法运算符保证在(t/=d)之前评估t的结果,并且 11.13.2复合赋值 strong>保证评估t/=d将在t完成之前设置值。 (你必须阅读“评估”的含义以及GetValueSetValue的含义,但我确信这确实是有保障的。)

答案 1 :(得分:1)

/=是一个增强的赋值运算符。 t /= dt = t / d相同。 +=-=*=也存在,等等......

答案 2 :(得分:1)

它是一个像+=一样的短手操作符,但不是添加它而是分开。这是长篇

t = t / d

答案 3 :(得分:1)

c*(t/=d)*t + b;

相当于

t /= d            # or t = t / d
c * t * t + b

因为Python无法分配内部表达式

请注意,如果td都是int / long,那么这将是Python2中的截断分割

同样easeOutQuad将是

def easeOutQuad (x, t, b, c, d):
    t /= d
    return -c * t * (t - 2) + b

答案 4 :(得分:0)

分割和分配。

>>> p = 6
>>> p /= 2
>>> p
3