【发布时间】:2020-10-10 02:25:00
【问题描述】:
我正在尝试编写一个返回Generator 的方法。这两种方法的最终结果是得到两个列表的组合,形式为:'A #1', 'B #1', ..., 'F #9'
FLATS = ['A', 'B', 'C', 'D', 'E', 'F']
def generate_nums() -> Generator[str, None, None]:
prefix = '#'
for num in range(10):
code = ''.join([prefix, str(num)])
yield code
def generate_room_numbers() -> Generator[str, None, None]:
room_nums = generate_nums()
yield (' '.join([flat_name, room_num]) for room_num in room_nums for flat_name in FLATS)
if __name__ == "__main__":
result = generate_room_numbers()
result = next(result) # I hate this. How do I get rid of this?
for room in result:
print(room)
这给了我正确的结果。虽然,我的烦恼是result = next(result)。有一个更好的方法吗?我查看了this 答案以及yield from 语法,但我几乎无法理解生成器。
【问题讨论】:
-
code = ''.join([prefix, str(num)])是一种非常冗长的写作方式prefix + str(num),老实说,f"{prefix}{num}可能更具可读性 -
我认为它比使用
+和f'{x}'更有效,不是吗? -
为什么在
generate_room_numbers中使用yield?只需使用return,您不需要使用next -
不,不是,不是两个字符串。
''.join可以有效地使用分隔符将多个字符串连接到容器中 -
@juanpa.arrivillaga 如果我错了,OP 可以纠正我,但我假设
generate_nums是为了代表某种东西,无论出于何种原因,它确实需要成为一个生成器,并且问题基本上是关于如何将生成器包装在另一个生成器内的循环中,而不是使用return是否可以更有效地实现此应用程序中的特定generate_nums。