python - 调用类方法的方法... n 层深
问题描述
我正在尝试做一些相当于
a=[[[[[1,2,3,4,5]]]]]
res = a.pop().pop().pop()
这将返回[[1, 2, 3, 4, 5]]
,但我希望能够执行弹出序列n
时间,所以像
它在对象而不是对象a.pop() for _ in range(n)
上调用 pop() 时不起作用a
a.pop()
关于如何在 python 中做到这一点的任何线索,如果是这样,它将被称为什么以供将来参考?我能找到的最接近的东西是 * 运算符将 list() 转换为单独的参数
我不想做这样的事情(忽略边缘情况):
tmp=a.pop()
for _ in range(n-1):
tmp=tmp.pop()
解决方案
这个很有趣,但我不建议你做我在下面写的,因为它不可读。
首先,您不想显式创建函数。您希望有一个类似表达式的列表理解来执行此操作。这是规则。
那么我该如何做嵌套函数呢?在数学中,它被称为函数组合(即,f(g(h(x))
对于函数f(x)
, g(x)
, h(x)
)。在 Python 中,我唯一能想到的与此足够接近的是reduce
. 您可以将函数列表缩减为单个“缩减”函数。我的解决方案是这样的:
import functools
a=[[[[[1,2,3,4,5]]]]]
five = functools.reduce(
lambda f,g: lambda x: f(g(x)),
[lambda x: x.pop() for _ in range(5)],
lambda x:x
)(a)
你会得到five == 5
上面。从最里面的列表中弹出最后一个元素。
让我稍微解释一下上面的内容:
functools.reduce()
是创建一个f(f(f(f(f(a)))))
定义f(x)
为的函数x.pop()
。它嵌套了五次,所以我range(5)
在第二个参数中使用functools.reduce()
- 第一个参数是做嵌套
- 第三个参数是创建一个返回自身的函数。这个想法是最里面的
f(a)
,我们需要将它表示为一个嵌套函数。所以它是f(g(a))
哪个g(a)=a
和f(a)=a.pop()
- 整个事情返回的是一个可调用的对象。所以我们用参数调用它
a
来执行它 - 本质上,这相当于运行
a.pop().pop().pop().pop().pop()
通过a
身份 lambda 函数访问的lambda x: x
是的,复杂且难以阅读。但它可以在 Python 中完成。
推荐阅读
- javascript - 获取在 JS for of 循环中看到的上一个项目?
- mule - 如何使用给定的数组动态获取属性
- c# - Visual Studio 如何设置依赖于程序集版本的输出路径
- tensorflow - tensorflow keras 中 model.trainable=False 的预期行为和目的是什么
- python - partitionBy 使用 Pyspark 在 S3 上保存数据集时花费的时间太长
- css - 如何使用 scss 修复 div 宽度(带有反应)
- google-calendar-api - 与服务帐号共享日历
- c# - Visual Studio 连接到 MS Access
- typescript - 递归函数中的基本情况不会停止递归打字稿
- routing - UI5 - navTo 未在尚未显示的页面上启动 onInit 事件