【发布时间】:2016-11-05 13:26:39
【问题描述】:
我正在尝试学习在递归函数中使用 yield 和 return。我有一个嵌套字典,我在其中搜索特定值。
当使用“yield”时,以下函数运行良好,并成功返回找到的值:
def findvalue (value, document):
if isinstance (document, list):
for d in document:
for result in findvalue(value, d):
yield result
if isinstance (document, dict):
for k,v in document.items():
if v == value:
yield v
elif isinstance (v, dict):
for result in findvalue(value, v):
yield result
elif isinstance (v, list):
for d in v:
for result in findvalue(value, d):
yield result
我了解生成器的工作原理以及为什么 yield 会在上面的代码中完成它的工作。现在,如果我使用相同的代码,但使用 return 并在那里检查是否有空返回,我仍然会遇到“NoneType”迭代问题,因为在此代码中某个地方返回了一个空结果:
def valuefind (value, document):
if isinstance (document, list):
for d in document:
for result in valuefind(value, d):
if result is not None:
return result
if isinstance (document, dict):
for k, v in document.items():
if v == value:
return v
elif isinstance (v, dict):
for result in valuefind(value, v):
if result is not None:
return result
elif isinstance (v, list):
for d in value:
for result in valuefind(value, d):
if result is not None:
return result
我在这里错过了什么?
【问题讨论】:
-
什么是“NoneType 迭代问题”?我不明白你的问题。请告诉我们预期结果是什么以及给定输入实际发生了什么。这两个代码之间的区别之一是,如果 Python 没有到达任何
return语句(由于没有满足任何条件),那么它将到达函数的末尾并返回None。 -
当一个值和嵌套字典被传递给函数时,预期的结果是它应该迭代,如果它找到该值的实例然后将它返回给调用者,以便我们可以确认一个实例是在特定的嵌套字典中找到。 “NoneType”问题是当使用“return”而不是“yield”时,函数无法迭代并停止并出现错误“NoneType”对象不可迭代。我正在尝试找出如何使用 return 语句而不是 yield 来实现相同的结果。
标签: python python-3.x dictionary recursion