我从javascript背景进入python。在JS中,我们可以进行数组方法链接,而且很棒(特别是使用箭头功能):
someArray
.filter(x => x.count > 10)
.sort((a, b) => a.count - b.count)
.map(x => x.name)
在python中是否可以进行类似数组方法的链接,如果不能,那么为什么呢?
答案 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列表方法会就地修改列表,因此很难在它们之上进行链接。但是,如果需要功能,可以围绕它们创建包装器类