2010-10-19 31 views
0

對不起,我只是發現了如何使用python list comprehensions替換函數內部的「for」stmt?

ID = [conn.cursor()對於x範圍內(100)]

也工作,所以我的關注會不會有問題了。 謝謝你的回答,你們都很快。


所有,

id = [(conn.cursor(),x) for x in range(100) ] 
>>> id 
[(<sqlite3.Cursor object at 0x01D14DA0>, 0), (<sqlite3.Cursor object at 0x01D14DD0>, 1), (<sqlite3.Cursor object at 0x01D14E00>, 2), (<sqlite3.Cursor object at 0x01D14E30>, 3), (<sqlite3.Cursor object at 0x01D14EC0>, 4), (<sqlite3.Cursor object at 0x01D14EF0>, 5),  <omitted> 

,但我不需要ID [1]山口實際上,我不想使用

for x in range(100): 
    id.append(conn.cursor()) 

出於某種原因,你認爲我可以使用列表理解來得到我想要的? 也是類似的問題,如果我想調用一個函數100次。

def foo(): 
    pass 

for x in range(100): 
    foo() 

可以將「for」改寫爲list理解樣式嗎?

謝謝!

+2

您可能想避免名稱'id',因爲它是[內置函數](http://docs.python.org/library/functions.html#id )。 – kennytm 2010-10-19 07:52:43

+0

感謝您指出這一點 – user478514 2010-10-19 08:01:26

回答

1

對於第二個問題

列表解析用於生成另一列表爲優於其他列表或多個列表迭代的輸出。因爲你想運行foo數次,所以它更加優雅,並且在範圍(..)循環中使用..的困惑更少。

如果您有興趣整理foo的返回值,那麼您應該使用list comprehension else for循環是很好的。至少我會這樣寫。

見下面的例子:

>>> [x for x in range(10)] 
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9] 
>>> def foo(): print 'foo' 
... 
>>> 
>>> [foo() for x in range(10)] 
foo 
foo 
foo 
foo 
foo 
foo 
foo 
foo 
foo 
foo 
[None, None, None, None, None, None, None, None, None, None] 
>>> 

[編輯:按請求]

,是由eumiro提供的ITER版本。

>>> results = (foo() for _ in xrange(10)) 
>>> results 
<generator object <genexpr> at 0x10041f960> 
>>> list(results) 
foo 
foo 
foo 
foo 
foo 
foo 
foo 
foo 
foo 
foo 
[None, None, None, None, None, None, None, None, None, None] 
>>> 
+0

我記得有一個iter版本的結果集合,你可以在這裏標記嗎? – user478514 2010-10-19 08:07:01

+0

@ user478514:我提供了這個例子。 – pyfunc 2010-10-19 08:11:39

+0

謝謝,只是想多瞭解一些,爲什麼(x代表範圍(10)中的x)返回一個發生器?如何編碼,我的意思是如何知道()應該返回一個生成器而不是元組? – user478514 2010-10-19 08:16:49

1

1.

cursors = [ conn.cursor() for _ in xrange(100) ] 

2.

results = [ foo() for _ in xrange(100) ] 
1

您不必在列表迭代中使用正在迭代的變量。這將工作得很好:

id = [conn.cursor() for _ in range(100)]