返回

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))
特别声明:以上内容(图片及文字)均为互联网收集或者用户上传发布,本站仅提供信息存储服务!如有侵权或有涉及法律问题请联系我们。
举报
评论区(0)
按点赞数排序
用户头像