生成器,产量,发送 python
Generators, yield, send python
我遇到了这个作业题,在上了udemy的课程后我仍然不知道如何解决它。
这是关于 yield、next 和 send。
这是我需要做的:
指导:
- 使用
itertools.permutations
生成列表的所有排列,并将它们存储在
排列列表
- 使用
list.sort()
对排列列表进行排序
- 在遍历排列列表时使用
yield
关键字
- 检查
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
值或者它来自生成器的发送方法。
之后,我从我们得到的同一个生成器函数中创建并使用了另一个生成器。通过 permute(l)
我创建了一个新的生成器,通过 yield from
我将这个生成器的输出作为输出发送,之后我不想继续从第一个列表生成排列,所以我打破了循环。
更多信息您可以查看this two parted article。
我遇到了这个作业题,在上了udemy的课程后我仍然不知道如何解决它。 这是关于 yield、next 和 send。
这是我需要做的: 指导:
- 使用
itertools.permutations
生成列表的所有排列,并将它们存储在 排列列表 - 使用
list.sort()
对排列列表进行排序
- 在遍历排列列表时使用
yield
关键字 - 检查
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
值或者它来自生成器的发送方法。
之后,我从我们得到的同一个生成器函数中创建并使用了另一个生成器。通过 permute(l)
我创建了一个新的生成器,通过 yield from
我将这个生成器的输出作为输出发送,之后我不想继续从第一个列表生成排列,所以我打破了循环。
更多信息您可以查看this two parted article。