Python生成器中使用递归不能按预想进行

Python生成器中使用递归不能按预想进行

python">def getMDFile(folder):

for i in os.listdir(folder):

i = os.path.join(folder,i)

if os.path.isdir(i):

getMDFlie(i)

elif os.path.splitext(i)[-1] == ".md":

yield i

# print(i)

使用print(), 正常打印所有子孙目录下的md文件,
而换作yield则仅返回了根目录下的md文件.

为什么呢?是我使用错了,还是python就不允许这样使用?求解


回答:

应枚举递归调用的返回值。

举例

def eachDecimal(n):

q, r = divmod(n, 10)

if q != 0:

for i in eachDecimal(q):

yield i

yield r

print(list(eachDecimal(1234)))

顺便说一下,你这里的 os.listdir,若换成 os.walk 则不需要递归。


回答:

大哥,递归不是你这样递归的。递归的基本特征就是每次递归调用的函数,都会把这个它的返回值转发给调用他的函数。
你可以把yield当成一个不退出的return,如果i是文件夹,递归一个getMDfile没毛病,但是这个函数的yield是返回给参数的,而你并没有call函数并赋值

import os

def getMDFile(folder):

for i in os.listdir(folder):

i = os.path.join(folder,i)

if os.path.isdir(i):

yield list(getMDFile(i))

else:

yield i

print(list(getMDFile('some directory')))

这样才是对的


回答:

yield from getMDFile(i)

以上是 Python生成器中使用递归不能按预想进行 的全部内容, 来源链接: utcz.com/a/160092.html

回到顶部