python - 生成器表达式使二进制字符串生成器永远卡住

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

我编写了一个函数来从给定列表 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 上使用列表方法,我只是遍历它,为什么第二个版本不能工作?

最佳答案

我找到了答案,yield from s 行耗尽了生成器,因此 yield from s 行从一个空生成器中生成(之前的理解生成为空 s 是空的)因此永远卡住。

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

这个问题只有在迭代之后才会出现,因为开始时 s 是一个列表,然后变成了一个生成器。

关于python - 生成器表达式使二进制字符串生成器永远卡住,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39134067/

相关文章:

python - 如何将两个整数与 Twisted 相加?

python - Numpy:检查数组中所有元素是否具有相同符号的最快方法?

python - 从列中删除重复的单词

python - 无法在 M1 Mac 上使用 pip3 安装 psycopg2

python - 在 Python 中将元组转换为字典

Javascript 生成器 throw() 方法推进迭代器?

python - 如何将 seaborn 库与 pydatatable 一起使用?

python - 使用 python 抓取隐藏的 jquery 值

python - python中if语句中的生成器

python - 如何在 Python 中显式检测生成器端?