python——基于返回值将生成器函数链接在一起
发布时间:2022-03-18 20:53:30 494
相关标签: # node.js
假设我有一个多维数组,它的坐标是typePoint
还有一些函数(尤其是生成器函数)
g1, g2, g3, ... of type Genf
Genf = Point -> Iterator[Point]
我有一系列指令告诉我如何遍历数组,以
instructions: List[Tuple[Genf, StoppingCondition]]
StoppingCondition = Callable[[Point], bool]
这些模型类似于;当你看到X时,停下来,进入下一个遍历模式;(例如“左转”)。这些说明解释如下:给定instructions
还有starting_point
允许g, stop_when = instructions[0]
从g(starting_point)
要么直到g
是筋疲力尽,还是到了紧要关头g
就要屈服了stop_when
,在这种情况下,不要放弃这个点,而是用它来初始化下一个点Genf
.那么什么时候stop_when(p) == True
我说g, stop_when = instructions[1]
然后从g(p)
直到stop_when
等等,还有进一步的指示。如果任何一台发电机在运行过程中耗尽,请将其余指令短路。可能有无限多的指令;e、 g.说明可能是itertools.cycle
一些说明的清单。
我在考虑如何以一种比较通俗的方式写这篇文章。我想到的第一件事就是Genf
转换为文字生成器函数,并将其return
最后一个值,他们几乎产生了,但没有,然后使用return_value = yield from g
.但是这问题指出,一些人认为应该避免使用发电机的返回值。
我的问题是:请建议使用python的方法。我在下面有一个工作实现;请随意评论,并提出更好的方法。
如果我真的走了这条路,并按照上面链接的帖子中的建议建立了一个小班,我可能会这么做
from collections.abc import (Iterator, Iterable)
from typing import (Any)
Point = Any
class MyIterable:
def __init__(self, gen: Iterable):
self.gen = gen
def __iter__(self):
self.return_val = yield from self.gen
return self.return_val
Point = Any
Genf = Callable[[Point], MyIterable]
def my_takewhile(pred, gen: Genf) -> Genf:
def inner(p):
for x in gen(p):
if not pred(x):
return x
else:
yield x
return lambda p: MyIterable(inner(p))
# instructions = ...
def my_gen(p) -> MyIterable:
"""
my_gen is itself a Genf, built from the instructions
"""
def inner(p) -> Iterator:
init_val = p
for g, stop_when in instructions:
it = MyIterable(g(init_val))
yield from it
if it.return_val is None:
break
init_val = it.return_val
return MyIterable(inner(p))
特别声明:以上内容(图片及文字)均为互联网收集或者用户上传发布,本站仅提供信息存储服务!如有侵权或有涉及法律问题请联系我们。
举报