list-comprehension - 在 manim ReplacementTransform 动画中使用 *args
问题描述
我有一个关于这段代码的问题,它转换了 TexMobject 的元素(例如,元素 2 被转换为 8,3 被转换为 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()
我看到有一个用于生成索引对的列表理解,但我不明白为什么在方括号之前有一个 args 星号(*)self.play()
?如果列表理解没有它,那么在这种情况下使用 *args 表示法的目的是什么?
解决方案
您必须先了解几个概念:
- 列表理解仅适用于列表、元组、字典和集合。
self.play()
指Scene.play()
,因为我们知道self
指的是被定义的类。- 所有方法都具有以下形式:
class.method(*args,**kwargs)
, 或
class.method(*args_1, *args_2, *args_3, ..., *args_n,**kwargs_1, **kwargs_2, ..., **kwargs_m)
args
LIST/TUPLA 和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 解释器将无法理解给出的参数,记住这不是使用方法的方式。
该运算符*
称为“扩展运算符”,它的作用是“取出”列表中的所有元素。更多信息在这里。
推荐阅读
- math - 如何在不丢弃的情况下在八面体中生成随机点?
- powerapps - Powerapps - 当我打开 screen1 时,我需要 radio1 选项来不选择任何一个单选按钮
- java - 在 Java 中生成随机股票代码的最有效方法是什么?
- python - google colab,无法腌制我的默认字典 - 递归错误
- ansible - 使用 ansible-galaxy 管理冲突的依赖项
- wso2 - 将 multipart/form-data 从 ESB 发送到 APIM
- python - 安装了枕头,但得到“没有名为枕头的模块”
- reactjs - [TypeError: undefined is not an object (evalating 'dataMoviesGenres.results[randomIndex]')]
- javascript - javascript中输出JSON的递归函数
- python - python ecdsa 获取私钥和公钥