Ответ 1
Используйте iter
для создания итератора списка, например.
return iter(List)
хотя если у вас уже есть список, вы можете просто вернуть его, что будет более эффективным.
Предположим, у меня есть список, который я не хочу возвращать, но чтобы получить значения из. Каков самый питонический способ сделать это?
Вот что я имею в виду. Благодаря некоторому нелазному вычислению я вычислил список ['a', 'b', 'c', 'd']
, но мой код через проект использует ленивое вычисление, поэтому я хотел бы давать значения из моей функции, а не возвращать весь список.
В настоящее время я написал это как:
my_list = ['a', 'b', 'c', 'd']
for item in my_list:
yield item
Но это не кажется мне питоническим.
Используйте iter
для создания итератора списка, например.
return iter(List)
хотя если у вас уже есть список, вы можете просто вернуть его, что будет более эффективным.
Поскольку этот вопрос не уточняет; Я дам ответ, который применяется в Python >= 3.3
Если вам нужно только вернуть этот список, сделайте как Anurag предлагает, но если по какой-то причине рассматриваемая функция действительно должна быть генератором, вы можете делегировать к другому генератору; предположим, что вы хотите суффикс списка результатов, но только если список сначала исчерпан.
def foo():
list_ = ['a', 'b', 'c', 'd']
yield from list_
if something:
yield this
yield that
yield something_else
В версиях python до 3.3 вы не можете использовать этот синтаксис; вам придется использовать код, как в вопросе, с выражением for и single yield в теле.
В качестве альтернативы; вы можете обернуть генераторы в регулярную функцию и вернуть результат chain
: у этого также есть преимущество работы в python 2 и 3
from itertools import chain
def foo():
list_ = ['a', 'b', 'c', 'd']
def _foo_suffix():
if something:
yield this
yield that
yield something_else
return chain(list_, _foo_suffix())
Вы можете построить генератор, сказав
(x for x in List)
Лучший питонный способ выполнения этой задачи -
In [1]: my_list = ['a', 'b', 'c', 'd']
In [2]: (x for x in my_list)
Out[2]: <generator object <genexpr> at 0x7fd9e4fdc230>