有一件事我可能会在你的示例代码改变:如果你打算使用一些长的名称,如self.memberlist
以上再一次,它通常更容易读取别名(“分配”)到更短的名字。因此,例如,而不是长期的,难以阅读:
self.memberlist[someindexA], self.memberlist[someindexB] = self.memberlist[someindexB], self.memberlist[someindexA]
你可以代码:
L = self.memberlist
L[someindexA], L[someindexB] = L[someindexB], L[someindexA]
记住,Python的工作原理是引用所以L指完全相同的对象为self.memberlist
,不是副本(同样,无论列表多长时间,分配速度都非常快,因为它不会被复制 - 它只是一个参考)。
我不认为任何进一步的复杂化是必要的,但当然一些奇特的人可能很容易被设想,诸如(A,B“正常”指数>=0
):
def slicer(a, b):
return slice(a, b+cmp(b,a), b-a), slice(b, a+cmp(a,b), a-b)
back, forth = slicer(someindexA, someindexB)
self.memberlist[back] = self.memberlist[forth]
我想搞清楚出于这些“高级”用途是一个不错的自负,有益的心理练习和好玩 - 我建议感兴趣的读者,一旦总体思路清晰,重点关注那些+cmp
的角色以及他们如何使三种可能性(a> b,a < b,a == b)[[不是负指数,但是 - 为什么不,以及切片机如何改变以解决这个问题]]。但是,在生产代码中使用这样一种奇特的方法通常会是过分的和毫无道理的,使得事情比简单和直接的方法更加混乱和难以维护。
请记住,simple is better than complex!
你不喜欢什么?它出什么问题了?你想要什么可能会更短?你能否提供你认为会更好的伪代码? – 2009-07-19 13:46:52
这是一个可怕的方式来编写交换,不得不重复每一个表达式,但它是最好的Python可以做的。 C++的交换(a,b)是干净的,不重复的交换方式,但是Python不支持这种间接级别,所以它不能这样做。只是为了生活;每种语言都有其局限性,这是一个小问题。 – 2009-07-19 17:29:45