我已经完成了“守则”的出现的S 第9天 in Python3,试着用它来教自己协作。我非常熟悉发电机,但我以前几乎从未使用过协同器。
最后,我得到了一些有用的东西(我在挑战的两个部分都得到了正确的答案),但在某种定义不明确的意义上,我对协同机制的使用感到非常脆弱,我特别失望的是,我无法制作一个我使用yield from的程序;我认为这是yield from构建的那种东西。
总体策略:输入包含要解析的表达式的可迭代字符串。根据所需内容,依次将其迭代到各种生成器;这些生成器消耗所需的字符,然后在销毁之前给出它们的答案。
组是问题中定义的:输入中包含在{}中的任何内容。score是输入的“分数”(即树中或任何子树中的组数)。garbage_len是树或任何子树中垃圾对象的总长度。我并不真正关心如何改进这两种方法;我想对生成器/协同器的习惯用法进行反馈。
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())发布于 2018-04-02 00:02:26
表达式''.join(str(s) for s in self.characters只是返回self.characters的一个副本。考虑一下措辞
return color.RED + self.characters + color.END类似地,','.join(str(s) for s in self.contents似乎比必要的长。
这似乎不适用于:
def __bool__(self):
return True恐怕你把我弄丢了
gen = curr_group(iter(line))我没有看到任何定义line的地方。
为共同例行公事创造价值似乎很好,正如你所希望的那样。
https://codereview.stackexchange.com/questions/183692
复制相似问题