В подавляющем большинстве случаев все, что вас волнует, - это итерация - то, что вы можете использовать в цикле for
.
Список уже итерируем по своим элементам.Вы можете сделать for elem in lst:
точно так же, как и for elem in generate(lst):
, и на самом деле это будет немного более эффективно.
Иногда вам особенно нужен итератор - итератор, который отслеживает еготекущая позиция, чтобы вы могли позвонить next
по ней.Например, если вы хотите сгруппировать итерируемое в кортежи по 2 значениям, самый простой способ сделать это - использовать итератор над итерируемым.
Но встроенная функция iter
уже делает это - вы можете использовать iter(lst)
так же, как и generate(lst)
, и снова, это будет немного более эффективно.
Редко вам нужен генератор - итератор, который предоставляет несколько дополнительных методов.Я не уверен, почему вам когда-нибудь понадобится тот, который просто перебирает список, потому что у него нет ничего полезного для do с этими дополнительными методами, но, возможно, кто-то написал какую-то глупую функцию, которая проверяет isinstance(g, types.GeneratorType)
и отказывается работать со списком или итератором списка, и вы не можете изменить эту функцию.
Но даже в этом случае вы можете просто написать выражение генератора, (i for i in lst)
вместо generate(lst)
.
Наконец, вам может понадобиться не просто генератор, а функция, которая возвращает генератор.Может быть, вам нужно передать его как обратный вызов, который будет вызван позже;Я не знаю.
В таком случае то, что вы написали, имеет смысл.Однако, если вы не используете Python 2.7 или 3.2 или более раннюю версию, вы, вероятно, все еще хотите использовать yield from
:
def generate(lst):
yield from lst
Затем я хочу создать новый список, которыйсписок отсортирован только с уникальными элементами с использованием той же созданной функции генератора.
Нет смысла использовать функцию генератора здесь, когда все, что вам нужно, это итерация, но если вам требуется чтобы использовать его для какого-то задания, нет причин, по которым вы не можете.На самом деле, это ничем не отличается от использования списка.
Если вы хотите отсортировать уникальные значения в списке, вы можете выполнить uniquify и отсортировать:
sorted_uniques = sorted(set(lst))
…или сортируйте и унифицируйте (например, используя рецепт unique_justseen
в itertools
документах):
sorted_uniques = list(unique_justseen(sorted(lst)))
Как вы делаете то же самое с вашим генератором?Просто передайте генератор вместо списка:
sorted_uniques = sorted(set(generate(lst)))