Как использовать списки Python, чтобы заменить функцию вызывать внутри "для" STMT? - PullRequest
0 голосов
/ 19 октября 2010

Извините, я только что нашел

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] col, и я не хочу использовать

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

по какой-то причине, вы думаете, я могу использовать понимание списка, чтобы получить то, что я хочу? Также похожий вопрос, хочу ли я вызывать одну функцию 100 раз.

def foo():
    pass

for x in range(100):
    foo()

Может ли это "for" быть переписано в стиль понимания списка?

Спасибо!

Ответы [ 3 ]

1 голос
/ 19 октября 2010

На второй вопрос

Понимания списка используются для создания другого списка в качестве вывода итерации по другому списку или спискам. Поскольку вы хотите запустить foo несколько раз, его более элегантно и менее запутанно использовать для цикла .. in range (..).

Если вы заинтересованы в сопоставлении возвращаемого значения foo, тогда вам следует использовать понимание списка, иначе для цикла это хорошо. По крайней мере, я бы так написал.

См. Пример ниже:

>>> [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]
>>> 

[Редактировать: согласно запросу]

Версия iter, предоставленная eumiro.

>>> 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]
>>> 
1 голос
/ 19 октября 2010

Вам не нужно использовать переменную, которую вы перебираете в своей итерации списка. Это будет отлично работать:

id = [conn.cursor() for _ in range(100)]
1 голос
/ 19 октября 2010

1.

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

2.

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