【问题标题】:Generator expression makes binary string generator freeze forever生成器表达式使二进制字符串生成器永远冻结
【发布时间】:2017-01-01 05:22:30
【问题描述】:

我编写了一个函数来生成从给定列表s 开始的二进制字符串(所有二进制字符串以s 项目之一结尾):

def binary_strings(s):
    yield from s
    while True:
        s = [b + x for x in s for b in "01"]
        yield from s

你可以从输出中看到它的工作原理:

>>> for i in binary_strings(["10", "01"]): print(i)

10
01
010
110
001
101
0010
1010
0110
1110
0001
1001
0101
1101
00010
10010
01010
11010
00110
10110
01110
11110
00001
10001
01001
11001
00101
10101
01101
11101
000010
100010
... # Output is infinite so I must truncate it.

现在我修改 s 并为其使用生成器表达式而不是列表:

def binary_strings(s):
    yield from s
    while True:
        s = (b + x for x in s for b in "01")
        yield from s

现在执行在用尽 3 长度的可能性后突然停止:

>>> for i in binary_strings(["10","01"]): print(i)

10
01
010
110
001
101
# Output is not truncated, the function freezes at this points 
# and yield no more output

我希望第二个版本和第一个版本一样好用,因为我从不在 s 上使用列表方法,我只是遍历它,为什么第二个版本不起作用?

【问题讨论】:

    标签: python python-3.x generator generator-expression


    【解决方案1】:

    我找到了答案,yield from s 行正在耗尽生成器,所以yield from s 行从一个空的生成器产生(在产生空之前的理解因为s 是空的)因此永远冻结。

    一个列表可以任意迭代多次,所以不会出现这个问题。

    问题仅在迭代后出现,因为一开始s 是一个列表,之后成为一个生成器。

    【讨论】:

    • 是的,但是你弄错了顺序,生成器在yield from s第一次进入while循环的时候就耗尽了
    • @Copperfield 实际上循环中的yield from 只执行一次,感谢澄清
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-22
    • 1970-01-01
    相关资源
    最近更新 更多