首页 > 解决方案 > 调用类方法的方法... 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() 时不起作用aa.pop()

关于如何在 python 中做到这一点的任何线索,如果是这样,它将被称为什么以供将来参考?我能找到的最接近的东西是 * 运算符将 list() 转换为单独的参数

我不想做这样的事情(忽略边缘情况):

tmp=a.pop()
for _ in range(n-1):
    tmp=tmp.pop()

标签: pythonpython-3.xmethodsrepeat

解决方案


这个很有趣,但我不建议你做我在下面写的,因为它不可读。

首先,您不想显式创建函数。您希望有一个类似表达式的列表理解来执行此操作。这是规则。

那么我该如何做嵌套函数呢?在数学中,它被称为函数组合(即,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)=af(a)=a.pop()
  • 整个事情返回的是一个可调用的对象。所以我们用参数调用它a来执行它
  • 本质上,这相当于运行a.pop().pop().pop().pop().pop()通过a身份 lambda 函数访问的lambda x: x

是的,复杂且难以阅读。但它可以在 Python 中完成。


推荐阅读