2011-11-05 101 views
7

我有相關的Python代碼的認識問題:Python的轉換瘋狂

def convex_hull(pts): 
    """Returns the points on the convex hull of pts in CCW order.""" 
    for m in (2 ** (2 ** t) for t in xrange(len(pts))): 
     hulls = [_graham_scan(pts[i:i + m]) for i in xrange(0, len(pts), m)] 
//more code 

我無法弄清楚如何這兩個「爲」應該工作。

令人遺憾的是,命令參考沒有顯示這樣的用法示例,我真的不知道它是否意味着其中一個是另一個的左側分配?

此外,底部分配可能意味着什麼? 'for'語句是否返回一個值?!?!

感謝和抱歉的初學者問題。

+0

這個函數的第一行是一個非常可怕的編碼風格。對於xrange(len(pts))中的t:m = 2 ** 2 ** t'更快,更短並且更容易閱讀。 –

回答

11

要了解此代碼,您首先需要了解list comprehensionsgenerator expressions。下面是一個簡單的列表理解的例子:

>>> [str(i) for i in range(5)] 
['0', '1', '2', '3', '4'] 

正如你可以看到,這一行做下面的正for迴路的等效:

lst = [] 
for i in range(5): 
    lst.append(str(i)) 

基本上,它是一個速記創建列表。生成器表達式是類似的,除了不是返回一個列表而是返回一個生成器,它將產生與列表理解相同的值,而不需要實際創建完整列表。當您要循環訪問這些值時,這會更有效。

現在背景是閃開,這裏是你如何能使用常規for循環展開代碼:

def convex_hull(pts): 
    """Returns the points on the convex hull of pts in CCW order.""" 
    for t in xrange(len(pts)): 
     m = 2 ** (2 ** t) 
     hulls = [] 
     for i in xrange(0, len(pts), m): 
      hulls.append(_graham_scan(pts[i:i + m])) 
    # more code 

至於你的評論,pts[i:i + m]走的是列表的片段從指數i高達指數i + m,你基本上可以讀片是這樣的:

[first index to include : first index to exclude : step] 

This answer與一些例子很能說明問題。

+0

哈,太棒了!它開始有意義。最後一件事:你能說出pts [i:i + m]是什麼意思嗎?這是我猜的子陣列嗎? – roamcel

+0

@roamcel - 查看我的編輯,該語法被稱爲切片,並且它的確如你所想的那樣:) –

+0

真棒,謝謝! – roamcel