通过Toby Segaran编写集体智慧编程,这部分代码让我有些困惑。用python2编写,sqlite select语句返回一个迭代器,然后他在for循环中检索到(urlid,)和稍后(链接器)我不明白为什么他使用这种语法,是一个元组?目的是什么?非常感谢。
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]
答案 0 :(得分:2)
self.con.execute('select rowid from urllist')
在每次迭代时返回1个元素的列表(或元组)。
此语法:
for (urlid,) in self.con.execute('select rowid from urllist'):
是一种从包含一个元素的传入元组/列表解包标量值urlid
的快捷方法。
最后的额外逗号用于区分元组语法和用于保护运算符优先级的简单括号。
如果没有这种语法,我们必须这样做:
for urlid_list in self.con.execute('select rowid from urllist'):
urlid = urlid_list[0]
在list
中解压也行,在这种情况下不需要逗号:
for [urlid] in self.con.execute('select rowid from urllist'):
答案 1 :(得分:1)
这是非常不寻常的语法,但它是有效的。
要理解的是,SQL执行语句将始终返回每行的元组,即使 - 如此处 - 该结果中只有一列。所以结果看起来像这样:
[(1,), (2,), (3,), (4,)]
这是单项元组的列表。
代码正在执行的操作是解压每个元组,以便urlid
和linker
都引用每个元组中的单个元素
答案 2 :(得分:0)
似乎self.con.execute
返回一个带有一个元素的可迭代元组。示例中的for循环遍历每个元组,并将单个元素元组解压缩为一个变量。
尝试在下一行中使用for (urlid,) in self.con.execute
和for 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)