在Ruby中,可以将方法链接在一起:
a = [2,3,1]
b = a.sort.reverse
将变量b
的值设置为[3,2,1]
,同时使a
保持不变。
我想在Python中执行类似的操作。到目前为止,我找到的最短的方法是:
import copy
a = [2,3,1]
b = copy.copy(a)
b.sort()
b.reverse()
也就是说,用5行代码而不是2行。真的没有更简单的方法吗?
答案 0 :(得分:4)
澄清:原始答案如下。如评论所述,问题在于链接一般,而不是在任何特定情况下。在这个答案的最后可以找到对此的澄清。
你可以直接写下来。
a = [2,3,1]
b = sorted(a, reverse=True)
即使你只想使用方法,你也可以这样做:
a = [2,3,1]
b = a.copy() # a[:] in python2
b.sort(reverse=True)
Python倾向于对隐式克隆相当挑剔。复制引用很便宜,复制对象很昂贵。由于许多python类型是可变的,因此当事务被克隆(或不克隆)时,很容易引入细微的错误。因此,大多数接口都需要您明确地克隆东西。
python
中的链接方法是可行的。但是,链仅适用于先前方法(或函数)调用的返回对象。
基本上,链接方法调用就像链接函数。
foo = they.method.method.method()
foo = my_func(your_func(their_func()))
让我们考虑一下[2,3,1].sort().reverse()
。这实际上等同于以下内容:
a = [2,3,1]
b = a.sort()
c = b.reverse()
由于s.sort()
返回None
,第三行会调用None.reverse()
- 这是None
未定义的。
不可变类型通常在这里表现得更好。例如,无法在原地修改字符串 - 它们的方法返回新字符串。因此,
s = "ab:cd".upper().center(20).partition(':')
print(s)
给出(' AB', ':', 'CD ')
。
答案 1 :(得分:0)
为了链接方法,我可以建议如下。虽然可能不被认为是好的蟒蛇:-)。
a = [2,3,1]
[eval('a.'+f+'()') for f in ['sort', 'reverse']]
请注意,这与处理原始对象而不是副本的方法无关。