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 osdef 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