首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Python协同结构

Python协同结构
EN

Code Review用户
提问于 2017-12-27 11:04:00
回答 1查看 69关注 0票数 2

我已经完成了“守则”的出现的S 第9天 in Python3,试着用它来教自己协作。我非常熟悉发电机,但我以前几乎从未使用过协同器。

最后,我得到了一些有用的东西(我在挑战的两个部分都得到了正确的答案),但在某种定义不明确的意义上,我对协同机制的使用感到非常脆弱,我特别失望的是,我无法制作一个我使用yield from的程序;我认为这是yield from构建的那种东西。

总体策略:输入包含要解析的表达式的可迭代字符串。根据所需内容,依次将其迭代到各种生成器;这些生成器消耗所需的字符,然后在销毁之前给出它们的答案。

组是问题中定义的:输入中包含在{}中的任何内容。score是输入的“分数”(即树中或任何子树中的组数)。garbage_len是树或任何子树中垃圾对象的总长度。我并不真正关心如何改进这两种方法;我想对生成器/协同器的习惯用法进行反馈。

代码语言:javascript
复制
class color:
    RED = '\033[91m'
    END = '\033[0m'

class Garbage:
    def __init__(self):
        self.characters = []

    def __str__(self):
        return '{}{}{}'.format(color.RED, ''.join(str(s) for s in self.characters), color.END)

    def add(self, ch):
        self.characters.append(ch)

    def __len__(self):
        return len(self.characters)

    def __bool__(self):
        return True

class States(enum.Enum):
    Group = 0
    Garbage = 1
    Escaped = 2

class Group:
    def __init__(self):
        self.contents = []

    def __str__(self):
        # A group contains a list of {Garbage or Group}.
        return '{' + ','.join(str(s) for s in self.contents) + '}'

    def score(self, depth=0):
        ans = depth + 1
        for g in self.contents:
            if isinstance(g, Group):
                ans += g.score(depth + 1)
        return ans

    def garbage_len(self):
        ans = 0
        for gr in self.contents:
            if isinstance(gr, Group):
                ans += gr.garbage_len()
            else:
                assert isinstance(gr, Garbage)
                ans += len(gr)
        return ans

def curr_garbage(gen):
    # Coroutine which consumes garbage characters and yields characters.
    # Stops when the current garbage is finished.
    state = States.Garbage
    for ch in gen:
        if state == States.Escaped:
            state = States.Garbage
        elif state == States.Garbage:
            if ch == '!':
                state = States.Escaped
            elif ch == '>':
                return
            else:
                yield ch

def curr_group(gen):
    # Coroutine which consumes characters and yields Groups and Garbages.
    for ch in gen:
        if ch == '{':
            # New group.
            subgroup = Group()
            subgroup_gen = curr_group(gen)
            subgroup.contents = list(sub)
            yield subgroup
        elif ch == ',':
            pass
        elif ch == '}':
            # End of current group
            raise StopIteration
        elif ch == '<':
            # New garbage
            garbage = Garbage()
            garbage_gen = curr_garbage(gen)
            for garbage_char in garbage_gen:
                garbage.add(garbage_char)
            yield garbage
        else:
            raise ValueError("Malformed string, received character {}".format(ch))

if __name__ == '__main__':
    gen = curr_group(iter(line))
    tree = next(gen)
    print(tree.score())
    print(tree.garbage_len())
EN

回答 1

Code Review用户

发布于 2018-04-02 00:02:26

表达式''.join(str(s) for s in self.characters只是返回self.characters的一个副本。考虑一下措辞

代码语言:javascript
复制
    return color.RED + self.characters + color.END

类似地,','.join(str(s) for s in self.contents似乎比必要的长。

这似乎不适用于:

代码语言:javascript
复制
    def __bool__(self):
        return True

恐怕你把我弄丢了

代码语言:javascript
复制
    gen = curr_group(iter(line))

我没有看到任何定义line的地方。

为共同例行公事创造价值似乎很好,正如你所希望的那样。

票数 1
EN
页面原文内容由Code Review提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://codereview.stackexchange.com/questions/183692

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档