Вопрос-Ответ

List comprehension without [ ] in Python

Понимание списка без [ ] в Python

Присоединение к списку:

>>> ''.join([ str(_) for _ in xrange(10) ])
'0123456789'

join должно принимать итеративное значение.

По-видимому, joinаргументом является [ str(_) for _ in xrange(10) ], и это понимание списка.

Посмотрите на это:

>>>''.join( str(_) for _ in xrange(10) )
'0123456789'

Теперь, joinаргумент просто str(_) for _ in xrange(10), нет [], но результат тот же.

Почему? str(_) for _ in xrange(10) Также создает список или итерируемый объект?

Переведено автоматически
Ответ 1

Другие респонденты были правы, ответив, что вы обнаружили выражение-генератор (которое имеет обозначение, аналогичное пониманию списка, но без квадратных скобок).

В целом, genexps (как их ласково называют) более эффективны с точки зрения памяти и быстрее, чем понимание списка.

ОДНАКО, в случае ''.join(), понимание списка выполняется быстрее и эффективнее с точки зрения использования памяти. Причина в том, что join необходимо выполнить два прохода над данными, поэтому ему действительно нужен реальный список. Если вы дадите ему один, он может начать свою работу немедленно. Если вы дадите ему вместо этого genexp , он не сможет начать работу, пока не создаст новый список в памяти, запустив genexp до исчерпания:

~ $ python -m timeit '"".join(str(n) for n in xrange(1000))'
1000 loops, best of 3: 335 usec per loop
~ $ python -m timeit '"".join([str(n) for n in xrange(1000)])'
1000 loops, best of 3: 288 usec per loop

Тот же результат сохраняется при сравнении itertools.imap с картой:

~ $ python -m timeit -s'from itertools import imap' '"".join(imap(str, xrange(1000)))'
1000 loops, best of 3: 220 usec per loop
~ $ python -m timeit '"".join(map(str, xrange(1000)))'
1000 loops, best of 3: 212 usec per loop
Ответ 2
>>>''.join( str(_) for _ in xrange(10) )

Это называется выражением генератора и объясняется в PEP 289.

Основное различие между выражениями генератора и пониманием списка заключается в том, что первые не создают список в памяти.

Обратите внимание, что есть третий способ написать выражение:

''.join(map(str, xrange(10)))
Ответ 3

Во втором примере используется выражение генератора, а не понимание списка. Разница в том, что при понимании списка список полностью создается и передается .join(). С помощью выражения generator элементы генерируются один за другим и используются .join() . Последнее использует меньше памяти и, как правило, быстрее.

Как это происходит, конструктор списка с радостью использует любую итерацию, включая выражение генератора. Итак:

[str(n) for n in xrange(10)]

это просто "синтаксический сахар" для:

list(str(n) for n in xrange(10))

Другими словами, понимание списка - это просто выражение генератора, которое преобразуется в список.

Ответ 4

Как уже упоминалось, это выражение генератора.

Из документации:


Круглые скобки можно опускать при вызовах только с одним аргументом. Подробности см. в разделе Вызовы.


python