2011-11-05 3 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 

を私が動作するようになっ「の」これらの2つです方法を見つけ出すことはできません。

悲しいことに、コマンドリファレンスでそのような使用例が表示されない場合は、実際にはそれが正しいかどうかはわかりません。

さらに、ボトムの割り当ては、おそらく何を意味するのでしょうか? 'for'ステートメントは値を返しますか?!?!

初心者の方にはおかげさまで申し訳ありません。

+0

この関数の最初の行は、本当に恐ろしいコーディングスタイルです。 'xの範囲(len(pts)):m = 2 ** 2 ** t 'は、より速く、短く、はるかに読みやすくなります。 –

答えて

11

このコードを理解するには、まずlist comprehensionsgenerator expressionsを理解する必要があります。ここでは、簡単なリスト内包の例である:

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

あなたが見ることができるように、この1行は、次の正規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