有一件事我可能會在你的示例代碼改變:如果你打算使用一些長的名稱,如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