Python: исключение StopIteration и понимания списка

Связанный с, но не явно упомянутый здесь, точно, когда __all__ используется. Это - список строкового определения, какие символы в модуле будут экспортироваться, когда from import * будет использоваться на модуле.

, Например, следующий код в foo.py явно экспорт символы bar и baz:

__all__ = ['bar', 'baz']

waz = 5
bar = 10
def baz(): return 'baz'

Эти символы могут тогда быть импортированы как так:

from foo import *

print(bar)
print(baz)

# The following will trigger an exception, as "waz" is not exported by the module
print(waz)

, Если __all__ выше комментируется, этот код тогда выполнится к завершению, поскольку поведение по умолчанию import * состоит в том, чтобы импортировать все символы, которые не начинаются с подчеркивания от данного пространства имен.

Ссылка: https://ПРИМЕЧАНИЕ docs.python.org/tutorial/modules.html#importing-from-a-package

: __all__ влияние from import * поведение только. Участники, которые не упоминаются в [1 111], все еще доступны снаружи модуля и могут быть импортированы с [1 112].

10
задан twasbrillig 23 November 2014 в 10:32
поделиться

3 ответа

Вы можете использовать itertools.islice . Это итераторная версия нарезки списка. Если итератор имеет менее 20 элементов, он вернет все элементы.

import itertools
rows = list(itertools.islice(csvreader, 20))
13
ответ дан 4 December 2019 в 00:26
поделиться

Если по какой-либо причине вам также необходимо отслеживать номер строки, я бы порекомендовал вам:

rows = zip(xrange(20), csvreader)

Если нет, вы можете вырезать его после или ... ну, вы Лучше сначала попробовать другой вариант, более оптимальный: -)

-1
ответ дан 4 December 2019 в 00:26
поделиться

itertools.izip ( 2 ) предоставляет способ легко заставить работать понимание списков, но islice , похоже, подходит в данном случае.

from itertools import izip
[row for (row,i) in izip(csvreader, range(20))]
0
ответ дан 4 December 2019 в 00:26
поделиться
Другие вопросы по тегам:

Похожие вопросы: