0

我有这样的功能:

def ease_bounce_out(t, bounces=None):
    if bounces is None:
        bounces = [4 / 11, 6 / 11, 8 / 11, 3 / 4, 9 / 11, 10 / 11, 15 / 16, 21 / 22, 63 / 64]

    bounces.insert(0, 1 / bounces[0] / bounces[0])
    if t < bounces[1]:
        return bounces[0] * t * t
    else:
        for i in range(3, len(bounces) - 2, 3):
            if t < bounces[i]:
                t -= bounces[i - 1]
                return bounces[0] * t * t + bounces[i + 1]

    t -= bounces[len(bounces) - 2]
    return bounces[0] * t * t + bounces[len(bounces) - 1]

我想把它全部压缩成 1 个字符串,这样我就可以使用该eval()函数来获取任何值的输出t。我有一个更简单的功能示例:

def ease_poly(t, power=2):
    t *= 2
    if t < 1:
        return t ** power
    else:
        return 2 - ((2 - t) ** power)

会成为:

def ease_poly(power=2):
    return f"(t * 2) ** {power} if (t * 2) < 1 else 2 - ((2 - (t * 2)) ** {power})"

这样,我可以使用这个字符串并t通过简单地执行以下操作来评估函数的任何值:

ease = ease_poly(power=3)
t = 0.4  # 0 <= t <= 1
print(eval(ease)) 

现在开始我的问题,它实际上不必是 1 行,这就是我一直在想的:

def ease_bounce_out(bounces=None):
    if bounces is None:
        bounces = [4 / 11, 6 / 11, 8 / 11, 3 / 4, 9 / 11, 10 / 11, 15 / 16, 21 / 22, 63 / 64]

    return # some code here that compiles the rest into a string
4

1 回答 1

1

一个小提示,

  1. 反弹[ -1 ] = 最后一项

    反弹[ -2 ] = 最后第二个项目

    不要使用反弹[ len(bounces) - 1 ]

答案:你不能用 eval 得到那个字符串答案。因为您的功能正在根据 t 做出决策。你必须通过 t。

如果评估所有 t 是您的主要关注点,那么其他方式可能会有所帮助。忘记评估。不要传递 t 但在函数中使用 t 然后它将在全局范围内查找并在该范围内使用 t 。

例子:

此函数需要传递 t。

def mathuer(t, b = 23 ):
    x = t
    if b > t:
        x = t
    return x

此函数使用全局 t。

def mathuer(b = 23 ):
    x = t
    if b > t:
        x = t
    return x

这就是它的工作原理,

t = 34
obj = mathuer() // Uses t defined above
于 2020-07-06T12:25:21.647 回答