Python中类似Javascript的数组方法链?

时间:2018-12-10 17:08:37

标签: python

我从javascript背景进入python。在JS中,我们可以进行数组方法链接,而且很棒(特别是使用箭头功能):

someArray
.filter(x => x.count > 10)
.sort((a, b) => a.count - b.count)
.map(x => x.name)

在python中是否可以进行类似数组方法的链接,如果不能,那么为什么呢?

4 个答案:

答案 0 :(得分:4)

在Python中,您可以这样做:

protected void btnEditQuantity_Click(object sender, EventArgs e)
{
    int productID = Convert.ToInt32((sender as Button).CommandArgument); // get productID from EditButton
    Book book = (Book)Session["BookID"]; // object instance to use in edit query

    TextBox textBox = GVBookDetails.FindControl("tbQuantityEdit") as TextBox;

    textBox.Enabled = true;
    int quantity = Convert.ToInt32(textBox.Text);
}

语法略有不同,但基本上应该相同。这能回答您的问题吗?

修改

如果您确实想要更“类似于链”的语法,可以看看toolz。来自他们的docs

from operator import attrgetter
map(lambda x: x.name, 
    sorted(filter(lambda x: x.count > 10, someArray), 
           key=attrgetter("count"))

编辑2

感谢@mpium建议使用>>> from toolz.curried import pipe, map, filter, get >>> pipe(accounts, filter(lambda acc: acc[2] > 150), ... map(get([1, 2])), ... list) ,它的语法似乎更酷:

PyFunctional

答案 1 :(得分:1)

在python中,您可以执行类似这样的数据管道操作(与方法链接相反):

a1 = (item for item in someArray if item.count > 10)
a2 = sorted(a1, key=lambda x: x.count)
a3 = [item.name for item in a2]

请注意,a1是生成器表达式(而不是list);它不存储元素,而是动态生成它们。

您当然可以将它们串在一起(按照我的口味,这不太可读):

[item.name for item in sorted(
 (item for item in someArray if item.count > 10), key=lambda x: x.count)]

请注意,在python中,更改实例(例如list.sort())以返回None的方法是惯例。因此简单的方法链接不适用于list

如果您使用的库为这些函数返回self,则方法链接将起作用。

答案 2 :(得分:1)

您可以进行方法链接,但是内置的list类型不支持您要求的方法操作(例如map是内置的)。就执行示例中给出的操作而言,@ Felix的出色答案对我而言似乎是正确的。如果要链接方法,则所需要做的就是每个方法返回一个实现下一个方法的对象。

简单的例子:

list("234").copy( # Copy once
  ).copy( # Twice
    ).append("Dog" # Returns None, so we can't continue chaining
      ).copy( # AttributeError because None has no method "copy"
        )

答案 3 :(得分:0)

是的,它确实有效。

方法链接可使用多种语言。通常,您将返回this或self或方法中的当前对象。

class Foo(object):
    def bar(self):
        print "Foo.bar called"
        return self
    def baz(self):
        print "Foo.baz called"
        return self

foo = Foo()
foo2 = foo.bar().baz()

许多内置的python列表方法会就地修改列表,因此很难在它们之上进行链接。但是,如果需要功能,可以围绕它们创建包装器类