yield 相关问题

yield是(1)有助于创建生成器函数的关键字,(2)用于将控制从一个协程转移到另一个协同程序的Ruby语句



如果存在yield,Python 会跳过递归

我有以下 XML 文件: 我有以下 XML 文件: <?xml version="1.0" encoding="UTF-8"?> <xliff version="1.2" xmlns="urn:oasis:names:tc:xliff:document:1.2" xmlns:okp="okapi-framework:xliff-extensions" xmlns:its="http://www.w3.org/2005/11/its" xmlns:itsxlf="http://www.w3.org/ns/its-xliff/" its:version="2.0"> <file original="temp/file_conversion/tmp4a9kn6bn/69502fea-751c-4c3c-a38a-4fce9e13ebde.txt" source-language="en" target-language="ar" datatype="x-text/plain" okp:inputEncoding="UTF-8"> <body> <trans-unit id="1idhasofh" xml:space="preserve"> <source xml:lang="en">foo<bpt id="0">&lt;bar&gt;</bpt>&lt;Instruction><ept id="0">&lt;crow&gt;</ept>&lt;grande&gt;</source> <target xml:lang="ar">foo<bpt id="0">&lt;bar&gt;</bpt>&lt;Instruction><ept id="0">&lt;crow&gt;</ept>&lt;grande&gt;</target> </trans-unit> </body> </file> </xliff> 我正在尝试创建一个函数来解析我已读入 ElementTree.Element 的 XML 文件: from xml.etree import ElementTree as ET def parse_xml(ele: ET.Element): tag = ele.tag if not isinstance(tag, str) and tag is not None: return t = ele.text if t: yield t for e in ele: parse_xml(e) t = e.tail if t: yield t def main(): fp = "path/to/xml" tree = ET.parse(fp) root = tree.getroot() t_units = root.findall(".//{*}trans-unit") for source, target in t_units: for ele in parse_xml(source): print(ele) 我得到: foo <Instruction> <grande> 在我的调试器中,我看到 parse_xml(e) 被跳过。当我用打印语句替换产量时: def parse_xml(ele: ET.Element): tag = ele.tag if not isinstance(tag, str) and tag is not None: return t = ele.text if t: print(t) for e in ele: parse_xml(e) t = e.tail if t: print(t) 我得到了预期的结果(到达所有标记的文本): foo <bar> <Instruction> <crow> <grande> 为什么yield会出现这种情况? parse_xml 是一个生成器函数 - 当它被调用时,它不会运行:相反,它将返回一个必须迭代的生成器,就像对 parse_xml 的根调用在 for ele in parse_xml(source): 行中迭代一样在你的主要方法中。 此外, parse_xml 调用会立即返回生成器,而不在函数内运行任何代码 - 它是 for 语句,它实际上运行函数内的代码并将其前进到 yield 语句。 因此,您可以在每个递归 parse_xml 调用中循环返回值,如下所示: def parse_xml(ele: ET.Element): ... for e in ele: for inner_e in parse_xml(e): yield inner_e t = e.tail if t: yield t 或者,您可以使用 Python 的语法结构 yield from 来进行深层嵌套(或递归)生成器调用 - 这会更高效(并且对于使用其他功能的生成器还有其他优点,例如接受来自运行生成器的调用者函数)。这是推荐的方法: def parse_xml(ele: ET.Element): tag = ele.tag if not isinstance(tag, str) and tag is not None: return t = ele.text if t: yield t for e in ele: yield from parse_xml(e) t = e.tail if t: yield t yield from用于对parse_xml的内部调用的返回值,如此处将做“正确的事情”:推迟外部(当前)parse_xml调用的执行,并隧道内部调用产生的每个值到它的调用者 - 当内部调用结束时(它产生一个 StopIteration:与创建 for 循环相同的机制stop),外部调用的执行将恢复。

回答 1 投票 0

是否可以在带有“yield”的方法内对同一个 Ienumerable 使用“foreach”两次或更多次?

非常简单的情况:我有一个项目列表(1,2,3,4,5,6,7,8,9,10)。我需要过滤它并删除一些第一个元素和一些最后一个元素,并从中间获取一些项目(例如我需要......

回答 1 投票 0

如何将嵌套的 for of 循环转换为自定义迭代器?

我有以下代码: 函数* getPossibleCollidersWith(形状) { for(取检索(形状)的平方){ for(让正方形的邻居){ 屈服邻居; } } } 这可行,但是...

回答 1 投票 0

如何创建计数生成器/迭代器级联?

较新版本的JavaScript允许将生成器/迭代器与yield关键字结合使用。 我的问题的背景 考虑以下生成器,它“生成”数字 (

回答 3 投票 0

如何在 JavaScript 中创建计数生成器/迭代器级联?

较新版本的JavaScript允许将生成器/迭代器与yield关键字结合使用。 我的问题的背景 考虑以下生成器,它“生成”数字 (

回答 2 投票 0

如何在 for wait...of 之后访问异步生成器中的最后一个值?

当使用 for wait...of 迭代异步生成器时,最终值(返回值)似乎被消耗并且之后无法访问。这是一个最小的例子: 异步函数* exampleGenera...

回答 1 投票 0

yield 命令在 Ruby 中无法正常工作

《The Well-Grounded Rubyist》一书第 3 版第 185 页是代码。而my_each的代码在第183页。它还涉及到第184页的代码: 类数组 # 把 m 的定义...

回答 1 投票 0

python-yield(yield)有什么作用?

从 python 2.5 开始,可以将 send()、throw()、close() 发送到生成器中。在定义的生成器内部,可以通过执行以下操作来“捕获”发送的数据: def gen(): 而真实: ...

回答 3 投票 0

如何才能看到编译/优化后的C#代码?

当我读到《深入 C# 》中的示例章节时,我正在阅读有关 Yield 关键字的内容:http://csharpindepth.com/Articles/Chapter6/IteratorBlockImplementation.aspx。 第一个代码块 uti...

回答 6 投票 0

Python - 生成器无法使用下一个方法

我创建了一个生成器来对 api 执行分页: def page_helper(req, timeout=5, page=1, **kwargs): print(f"第{页}", end=" ”) 尝试: 响应 = 请求(参数...

回答 1 投票 0

在“产生流”监听器中设置状态时如何强制有状态小部件重绘?

我想要实现的目标并不是什么疯狂的事情,但我连续几天都在扯头发。 我基本上想实现以下目标:一个长时间运行的进程可以进行互联网访问和数据处理

回答 1 投票 0

如何在协程中捕获 throw 和其他异常并获得 1 的产量?

我有 var DICTIONARY,它是一个字典,其中键是英文字母,值是以相应字母开头的单词。 DICTIONARY 的初始填充如下所示:

回答 1 投票 0

函数中的提前返回和yield

我不确定使用yield关键字时在函数中提前返回的正确方法是什么。 是“return void”返回;正确的返回值?因为返回类型指定为ite...

回答 1 投票 0

如何仅生成新生成的文本

我有一个在后台使用 RAG 管道的 Flask 应用程序,并且我从 vLLM 流式传输响应。我目前正在使用一个函数来解析并生成流式 JSON 响应。然而,我...

回答 1 投票 0

确保生成器函数内的连接被调用者关闭[关闭]

今天,在编程时,我发现自己在生成器函数内管理资源(ssh 连接),类似于以下内容: #我决定使用生成器来避免循环...

回答 1 投票 0

在生成器函数内处理上下文管理器[关闭]

今天,在编程时,我发现自己在生成器函数内管理资源(ssh 连接),类似于以下内容: #我决定使用生成器来避免循环...

回答 1 投票 0

在 Python 生成器中使用“with”语句管理资源

今天,在编程时,我发现自己在生成器函数内管理资源(ssh 连接),类似于以下内容: def _yield_fname(主机地址,usr,密码,数据路径): ...

回答 1 投票 0

使用 Python 生成器内的语句管理资源

今天,在编程时,我发现自己在生成器函数内管理资源(ssh 连接),类似于以下内容: def _yield_fname(主机地址,usr,密码,数据路径): ...

回答 1 投票 0

最新问题
© www.soinside.com 2019 - 2025. All rights reserved.