生成器,yield,发送python

问题描述 投票:0回答:1

我得到了这个家庭作业的问题,在学习了udemy课程后,我仍然无法弄清楚如何解决它。这是关于收益率,接下来和发送。

这就是我需要做的事情:指导:

  1. 使用itertools.permutations生成列表的所有排列,并将它们存储在排列列表中
  2. 使用list.sort()对排列列表进行排序
  3. 迭代排列列表时使用yield关键字
  4. 检查yield语句是否获得输入列表,如果是,则清空排列列表并重复步骤2

下面是我试过的代码,它不支持发送功能,并继续使用旧的LIST。

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')
python generator yield
1个回答
0
投票

您可以在yield语句中获取已通过赋值发送的值。喜欢:

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的行中我收到了发送到这个生成器的任何内容如果你只是在生成器上调用next接收None,那么我写了一个if语句来检查它是否是None值或者它是来自发送器的发送方法的东西。

之后我创建并使用我们得到的相同生成器函数的另一个生成器。通过permute(l)我创建一个新的生成器,并通过yield from我发送此生成器的输出作为输出,然后我不想继续从第一个列表生成排列,所以我打破循环。

有关更多信息,您可以查看this two parted article

© www.soinside.com 2019 - 2024. All rights reserved.