什么是发电机';python中的yield-return,这与return有何不同
我真的很困惑,在生成器中关键字“yield”返回什么?这个的实际用例是什么,我应该在什么时候使用它 它与“return”关键字有何不同 我学到的是发电机在性能方面更好,但如果在采访中被问到,我想不出任何真正的用例什么是发电机';python中的yield-return,这与return有何不同,python,python-3.x,Python,Python 3.x,我真的很困惑,在生成器中关键字“yield”返回什么?这个的实际用例是什么,我应该在什么时候使用它 它与“return”关键字有何不同 我学到的是发电机在性能方面更好,但如果在采访中被问到,我想不出任何真正的用例 提前谢谢 Return将指定的值发送回调用方,而Yield可以生成一系列值。当我们想要迭代一个序列,但不想将整个序列存储在内存中时,应该使用yield 您可以阅读有关差异的更多信息生成单个值和返回单个值之间的区别在于,生成将值包装在一个中,在其他语言中,该值也称为流或枚举数。列表是枚举
提前谢谢 Return将指定的值发送回调用方,而Yield可以生成一系列值。当我们想要迭代一个序列,但不想将整个序列存储在内存中时,应该使用yield
您可以阅读有关差异的更多信息生成单个值和返回单个值之间的区别在于,生成将值包装在一个中,在其他语言中,该值也称为流或枚举数。列表是枚举数的一个例子,为了简化这个答案,可以假设所有迭代器都只是列表
生成多个值(例如,在
for
循环中)和返回迭代器(或列表)之间的区别在于计算值的时间。使用yield,计算一个值并返回给调用方。如果调用方不需要整个值列表,则列表的其余部分甚至不计算
但是,在返回列表时,必须事先计算整个列表。假设您具有以下功能:
def findIndex(enumerator, item):
idx = 0
for value in enumerator:
if (value == item):
return idx
idx = idx + 1
它使用迭代器搜索项
,返回该项的索引
现在,这里是迭代器发挥作用的地方。假设您要像这样调用findIndex
:
findIndex(gimme_the_values(), 3);
假设gimme\u\u value
是一个计算整数列表的函数;但是,也可以说,出于某种原因,计算这些整数的过程需要很长时间。也许,您正在扫描一个1500页的文档,查找其中出现的每一个数字,这就是返回的值列表我很生气
现在,假设本文档中出现的前几个数字是数字7、1998、3和18;假设这三个数字出现在第40页。如果您定义
gimme\u值来使用yield,您可以停止生成该“列表”在第40页-你甚至不会扫描并返回18。但是,如果给我这些值返回一个列表而不是屈服,你必须扫描每一页,并生成整个列表,即使在这种情况下你真的只需要前3页。这可能对文本处理有用。如果你有大量语料库,你想规范化文本中的字符,例如,为每个文本应用规范化函数
你想要一个函数,在你要使用它的时候加载一个文本,而不是完整的语料库,因为它对你的计算机来说可能太大了
例如:
from lxml import etree
def get_data(data_directory, parser):
for filename in os.listdir(data_directory):
if filename.endswith("xml"):
tree = etree.parse(os.path.join(data_directory, filename), parser=parser)
yield tree.getroot()
else:
print("None")
return None
您有一个存放所有文件的目录。您只想解析XML文件
您可以使用yield语句进行此类处理,就像加载了所有数据一样:
for root in get_data(DATA_DIRECTORY, parser):
result = process(root)
save_result(result)
Return用于只返回一个值
在技术上不准确。是的,我已经纠正了它。同样不准确的是“我们应该使用yield来迭代一个序列,但不想将整个序列存储在内存中。”.Yield用于创建生成器。生成器可用于创建迭代器。Yield会记住状态,因此可用于在iterable对象/序列上创建迭代器;但是,当用于在序列上迭代时,它不会节省内存。