Как Pythonical вывести все значения из списка? - PullRequest
41 голосов
/ 23 марта 2010

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

Вот что я имею в виду. Благодаря некоторым не ленивым вычислениям я вычислил список ['a', 'b', 'c', 'd'], но мой код в проекте использует ленивые вычисления, поэтому я хотел бы получить значения из моей функции вместо того, чтобы возвращать весь список.

Я сейчас написал это следующим образом:

my_list = ['a', 'b', 'c', 'd']
for item in my_list:
    yield item

Но это не кажется мне пифоническим.

Ответы [ 4 ]

52 голосов
/ 04 сентября 2013

Поскольку этот вопрос не уточняется;Я предоставлю ответ, который применим в 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 и одним оператором yield в теле.

В качестве альтернативы;вы можете обернуть генераторы в обычную функцию и вернуть результат chain ed: это также имеет преимущество работы в 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())
28 голосов
/ 23 марта 2010

Используйте iter для создания итератора списка, например,

return iter(List)

, хотя, если у вас уже есть список, вы можете просто вернуть его, что будет более эффективным.

2 голосов
/ 23 марта 2010

Вы можете построить генератор, сказав

(x for x in List)
0 голосов
/ 18 августа 2017

Лучший Pythonically способ сделать это задание -

In [1]: my_list = ['a', 'b', 'c', 'd']

In [2]: (x for x in my_list)
Out[2]: <generator object <genexpr> at 0x7fd9e4fdc230>
...