2016-12-08 20 views
2

Toby SegaranによるプログラミングのCollective Intelligenceによるこのコード部分は、私を少し混乱させました。 python2で書かれているsqliteのselect文は、forループで(urlid、)とそれ以降(リンカ)に取得するイテレータを返します。なぜこの構文を使用するのか分かりません。目的は何ですか?どうもありがとう。Forループのタプルと反復子Python

for i in range(iterations): 
    print "Iteration %d" % (i) 
    for (urlid,) in self.con.execute('select rowid from urllist'): 
    pr=0.15 
    # Loop through all the pages that link to this one 
    for (linker,) in self.con.execute(
    'select distinct fromid from link where toid=%d' % urlid): 
     # Get the PageRank of the linker 
     linkingpr=self.con.execute(
     'select score from pagerank where urlid=%d' % linker).fetchone()[0] 

答えて

2

self.con.execute('select rowid from urllist')各繰り返しで1要素のリスト(タプル)を返します。

この構文は:

for (urlid,) in self.con.execute('select rowid from urllist'): 

は1種の元素を含む着信タプル/リストからアンパックスカラー値urlidに簡単な方法です。

最後の余分なカンマは、オペレータの優先順位から保護するために使用される単純なカッコからタプル構文を区別するために使用されます。

その構文がなければ、私たちがしなければならないでしょう:

listに開梱
for urlid_list in self.con.execute('select rowid from urllist'): 
    urlid = urlid_list[0] 

はまた、その場合にカンマは必要に動作しないだろう:

for [urlid] in self.con.execute('select rowid from urllist'): 
+0

単一要素のタプルを扱う、それはカンマを覚えておくことが重要です。それがなければ '(urlid)'があります。これは '(urlid、)'が単一要素のタプルである間に 'urlid'だけを残す式をラップするために括弧を使用しています。 –

+0

ええ、私の記事の最後の文です。 –

1

これは非常に珍しい構文で、それは有効です。

理解するべきことは、ここではその結果に1つの列しかない場合でも、SQL実行文は常に行ごとにタプルを返すことです。結果は次のようになります。

単一項目タプルのリストです。

何のコードがurlidlinker両方が各タプル内の単一の要素を参照するように、各タプルを開梱されてやっています。

0

self.con.executeは、1要素のタプルの繰り返し可能性を返します。この例のforループは各タプルを通過し、1つの要素タプルを1つの変数に展開します。

for (urlid,) in self.con.executefor urlid in self.con.executeおよびprint (type (urlid))に置き換えてください。これはtupleを与えなければなりません。オリジナルではその内部の要素のタイプが出力されます。

また、何が起こっているかを示して支援するために、これを試すことができます。

letters = [('a',), ('b',), ('c',)] 

for (letter,) in letters: 
    print(letter) 

for letter_tuple in letters: 
    print(letter_tuple) 
関連する問題