Как правильно определить и использовать генераторы Python - PullRequest
1 голос
/ 07 апреля 2010

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

a = ["Hello", "world", "!"]
b = (x for x in a)
c = next(b, None)
while c != None:
    print c,
    c = next(b, None)

Есть ли что-то не так или неуместное с подходом while здесь? Есть ли способ избежать назначения 'c' перед циклом?

Спасибо!

Ответы [ 2 ]

7 голосов
/ 07 апреля 2010

Зачем вам использовать цикл while? В Python for циклы абсолютно предназначены для этого:

a = ["Hello", "world", "!"]
b = (x for x in a)
for c in b:
    print c,

Если по какой-либо причине вы застряли на реализации while, ваша текущая реализация, вероятно, лучшее, что вы можете сделать, но она немного неуклюжа, не правда ли?

3 голосов
/ 07 апреля 2010

Уточнение: вы имели в виду генератор выражений не генераторы - последнее является определением функции, которое содержит хотя бы один yield оператор / выражение.

согласен с предыдущим постером ... вы должны использовать петли for почти для всего. я редко использую циклы while, которые относятся к простым счетчикам или серверам, работающим с бесконечными циклами. : -)

вы также можете поместить genexp в ту же строку, что и цикл for ...

a = ["Hello", "world", "!"]
for c in (x for x in a):
    print c,

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

for c in ["Hello", "world", "!"]:
    print c,

вы уже использовали память, чтобы составить список; зачем создавать genexp, если это не nec?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...