python - 生成器、yield、发送 python

标签 python generator yield

我收到了这个作业问题,在学习了 udemy 类(class)后,我仍然不知道如何解决它。 它与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')

最佳答案

您可以在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 值还是来自生成器的 send 方法的值。

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

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

关于python - 生成器、yield、发送 python,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55771571/

相关文章:

python - append Python的内存效率.txt

python - Mac OSX 的 PyAudiere 替代品?

java - Android:随机数决定玩家的回合

Python 产量与 Ruby 产量

c# 组合多个函数的 yield return

python - 我怎样才能调用神奇的 `__contains__` 方法?

python - 有没有一种方法可以从一个文件中查找另一个文件中的单词,并将在另一个文件中找不到的单词输出到一个新文件中?

ruby-on-rails - rails : Hooking into ORM generator

JavaScript,从多个数组中获取所有唯一的组合

PHP - json_encode 生成器对象(使用 yield)