如何使用python list comprehensions替换“for”stmt里面的函数调用?

时间:2010-10-19 07:42:23

标签: python list-comprehension

抱歉,我刚刚找到了

id = [conn.cursor()for x in range(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] col,我不想使用

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

出于某种原因,你认为我可以使用列表理解来获得我想要的东西吗? 还有类似的问题,如果我想调用一个函数100次。

def foo():
    pass

for x in range(100):
    foo()

是否可以将“for”重写为列表推导风格?

谢谢!

3 个答案:

答案 0 :(得分:1)

1

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

2

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

答案 1 :(得分: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]
>>> 

答案 2 :(得分:1)

您不必在列表迭代中使用要迭代的变量。这样可以正常工作:

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