【问题标题】:Yield with recursion in python [duplicate]在python中递归产生[重复]
【发布时间】:2021-09-26 06:36:57
【问题描述】:

我正在尝试使用生成器方法生成两个字符串的集合乘积,而不是将其存储在列表中,如下所示:

def recursive_generator(l_set, index = 0, value = ""):
    if index == len(l_set):
        yield(value)
    else:
        for i in l_set[index]:
            recursive_generator(l_set, index + 1, value + i)

def main():
    _input = ["ab","de"]
    for i in recursive_generator(_input):
        print(i)

main()

预期的结果是ad ae bd be 换行,但在执行时,没有结果。 在检查 pdb 以查看行为:

$ python3 -m pdb recurse.py 
> /home/ec2-user/recurse.py(1)<module>()
-> def recursive_generator(l_set, index = 0, value = ""):
(Pdb) n
> /home/ec2-user/recurse.py(8)<module>()
-> def main():
(Pdb) n
> /home/ec2-user/recurse.py(13)<module>()
-> main()
(Pdb) step
--Call--
> /home/ec2-user/recurse.py(8)main()
-> def main():
(Pdb) n
> /home/ec2-user/recurse.py(9)main()
-> _input = ["ab","de"]
(Pdb) n
> /home/ec2-user/recurse.py(10)main()
-> for i in recursive_generator(_input):
(Pdb) step
--Call--
> /home/ec2-user/recurse.py(1)recursive_generator()
-> def recursive_generator(l_set, index = 0, value = ""):
(Pdb) locals()
{'l_set': ['ab', 'de'], 'index': 0, 'value': ''}
(Pdb) n
> /home/ec2-user/recurse.py(2)recursive_generator()
-> if index == len(l_set):
(Pdb) len(l_set)
2
(Pdb) n
> /home/ec2-user/recurse.py(5)recursive_generator()
-> for i in l_set[index]:
(Pdb) n
> /home/ec2-user/recurse.py(6)recursive_generator()
-> recursive_generator(l_set, index + 1, value + i)
(Pdb) step
--Call--
> /home/ec2-user/recurse.py(1)recursive_generator()
-> def recursive_generator(l_set, index = 0, value = ""):
(Pdb) locals()
{'l_set': ['ab', 'de'], 'index': 1, 'value': 'a'}
(Pdb) n
GeneratorExit   <<<<< It did not proceed for the next loop, did not even check the if condition


> /home/ec2-user/recurse.py(1)recursive_generator()
-> def recursive_generator(l_set, index = 0, value = ""):
(Pdb) w
  /usr/lib64/python3.7/bdb.py(578)run()
-> exec(cmd, globals, locals)
  <string>(1)<module>()
  /home/ec2-user/recurse.py(13)<module>()
-> main()
  /home/ec2-user/recurse.py(10)main()
-> for i in recursive_generator(_input):
  /home/ec2-user/recurse.py(6)recursive_generator()
-> recursive_generator(l_set, index + 1, value + i)
> /home/ec2-user/recurse.py(1)recursive_generator()
-> def recursive_generator(l_set, index = 0, value = ""):
(Pdb) n
Internal StopIteration
> /home/ec2-user/recurse.py(10)main()
-> for i in recursive_generator(_input):
(Pdb) n
--Return--
> /home/ec2-user/recurse.py(10)main()->None
-> for i in recursive_generator(_input):
(Pdb) w
  /usr/lib64/python3.7/bdb.py(578)run()
-> exec(cmd, globals, locals)
  <string>(1)<module>()
  /home/ec2-user/recurse.py(13)<module>()
-> main()
> /home/ec2-user/recurse.py(10)main()->None
-> for i in recursive_generator(_input):
(Pdb) n
--Return--
> /home/ec2-user/recurse.py(13)<module>()->None
-> main()
(Pdb) w
  /usr/lib64/python3.7/bdb.py(578)run()
-> exec(cmd, globals, locals)
  <string>(1)<module>()->None
> /home/ec2-user/recurse.py(13)<module>()->None
-> main()

我无法理解这里的流程中断,为什么它会执行生成器退出并停止迭代。是否支持这种方法?当谈到 python 并且正在学习生成器和迭代器时,我是一个菜鸟。任何指导表示赞赏。

【问题讨论】:

  • 我觉得你的递归生成器函数不太对,可以看Can generators be recursive?,递归行为需要使用yield from &lt;gen func name&gt;

标签: python generator


【解决方案1】:

您所做的只是在循环中调用 recursive_generator 而不是 yielding 任何值(类似于在非生成器递归函数中返回一个值,您只需返回递归函数调用)。您需要在循环内使用yield from 来获取生成器函数的递归行为。

def recursive_generator(l_set, index = 0, value = ""):
    if index == len(l_set):
        yield(value)
    else:
        for i in l_set[index]:
            yield from recursive_generator(l_set, index + 1, value + i)         

输出:

ad
ae
bd
be

【讨论】:

    猜你喜欢
    • 2017-05-19
    • 1970-01-01
    • 2017-09-11
    • 1970-01-01
    • 1970-01-01
    • 2013-02-19
    • 1970-01-01
    • 1970-01-01
    • 2018-07-06
    相关资源
    最近更新 更多