Генераторы, дай, отправь питона - PullRequest
1 голос
/ 20 апреля 2019

Я получил этот домашний вопрос, после прохождения курса по удеме, я до сих пор не могу понять, как его решить. Речь идет о урожайности, следующий и отправить.

Вот что мне нужно сделать: Руководство:

  1. Используйте itertools.permutations для создания всех перестановок списка и сохраните их в список перестановок
  2. Сортировать список перестановок, используя list.sort()
  3. Используйте ключевое слово yield при переборе списка перестановок
  4. Проверьте, получен ли оператор yield список ввода, если да, очистите список перестановок и повторите шаг 2

Ниже приведен код, который я пробовал, он не поддерживает функцию отправки и продолжает работать со старым списком.

def permute(items):
    permu_list = [perm for perm in pr(items)]
    permu_list.sort()
    for x in permu_list:
        yield x

это пример результатов:

>>> g = permute(['b', 'a', 'c'])
>>> next(g)
('a', 'b', 'c')
>>> next(g)
('a', 'c', 'b')
>>> g.send(['e', 'q', 'c'])
('c', 'e', 'q')
>>> next(g)
('c', 'q', 'e')

1 Ответ

0 голосов
/ 20 апреля 2019

Вы можете получить значение, которое было отправлено по присваиванию в отчете о доходах. как:

received = yield something

Для вашего использования вам нужны дополнительные знания, которые вы можете получить от другого генератора с помощью оператора yield from. в вашем случае вам нужно что-то вроде этого:

def permute(items):
    permu_list = [perm for perm in pr(items)]
    permu_list.sort()
    for x in permu_list:
        l = yield x
        if l:
            yield from permute(l)
            break

В строке с l = yield x я получу все, что было отправлено этому генератору, если вы просто позвоните следующему на генератор, который вы получите None здесь, поэтому я написал оператор if, чтобы проверить, является ли это значением None или это то, что происходит из метода отправки генератора.

После этого я создаю и использую другой генератор из той же функции генератора, которую мы получили. С помощью permute(l) я создаю новый генератор, а с помощью yield from я отправляю выходные данные этого генератора как выходные данные, и после этого я не хочу продолжать генерировать перестановку из первого списка, поэтому я разрываю цикл.

Для получения дополнительной информации вы можете проверить эту статью, разделенную на две части .

...