【问题标题】:Generators, yield, send python生成器,产量,发送 python
【发布时间】:2019-04-20 08:10:22
【问题描述】:

我收到了这个作业问题,在参加了 udemy 课程后,我仍然不知道如何解决它。 是关于yield、next和send的。

这是我需要做的: 指导:

  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')

【问题讨论】:

  • Ty 寻求帮助。怎么做?我有点难以理解整个发电机的事情。

标签: python generator yield


【解决方案1】:

您可以在 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 的行中,如果您只需在您收到None 的生成器上调用next,我就会收到发送到此生成器的任何内容,因此我编写了一个if 语句来检查它是否是None 值或这是来自生成器的发送方法的东西。

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

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

【讨论】:

  • Tyvm!您能否再解释一下它是如何工作的以及您为什么要这样做?我很难理解它,似乎比我们学到的更先进,哈哈
猜你喜欢
  • 2014-03-28
  • 2014-05-30
  • 2020-01-18
  • 1970-01-01
  • 2011-01-01
  • 2019-04-10
  • 1970-01-01
  • 2020-06-10
  • 2012-09-20
相关资源
最近更新 更多