在 manim 中使用 *args 进行 ReplacementTransform 动画。

9 浏览
0 Comments

在 manim 中使用 *args 进行 ReplacementTransform 动画。

我有一个关于这段代码的问题,它可以将 TexMobject 中的元素进行转换(例如,将第二个元素转换为 8,第三个元素转换为 9 等):

changes = [
          [(2,4,3), (8,11,9)],
          [(0,0), (7,10)]
          ]    
for pre_ind, post_ind in changes:
        self.play(
            *[
                ReplacementTransform(formula[i].copy(), formula[j])
                for i,j in zip(pre_ind, post_ind)
            ]
        )
        self.wait()
    self.wait()

我看到使用了列表推导式生成索引对,但我不明白为什么在 self.play() 的方括号前要加上一个参数星号(*)?在这种情况下使用 *args 标记的目的是什么,如果列表推导式没有它也能正常工作?

admin 更改状态以发布 2023年5月22日
0
0 Comments

在此之前,您需要了解几个概念:

  1. 列表推导仅适用于列表、元组、字典和集合。
  2. self.play() 是指 Scene.play(),因为我们知道 self 是正在定义的类。
  3. 所有方法都有以下形式:class.method(*args,**kwargs)

class.method(*args_1, *args_2, *args_3, ..., *args_n,**kwargs_1, **kwargs_2, ..., **kwargs_m)

其中args是一个LIST/TUPLE,kwargs是一个字典。在这种情况下,Scene.play 是这样使用的:

Scene.play(Animation1(...), Animation2(...), ..., **kwargs)
# Example:
Scene.play(Write(mob1), Write(mob2), run_time=4)
# But, this is the same as:
Scene.play(*[Write(mob1), Write(mob2)], run_time=4)
# Or better:
Scene.play(*[Write(mobs) for mobs in [mob1,mob2]], run_time=4)

我想(您没有很清楚地表达),您是在说为什么无法像下面这样做:

Scene.play([ReplacementTransform(...) for _ in ...])

或者

Scene.play(ReplacementTransform(...) for _ in ...)

我们可以直观地理解这是一个语法错误,因为Python解释器无法理解所给出的参数,记住这不是使用方法的方式。

运算符*称为“展开运算符”,它的作用是“取出”列表中所有的元素。更多信息请参考这里

0