python-yield from用法详解

本文介绍了Python 3.3新出现的句法yield from。它可替代内层for循环,示例中能将结果扁平化输出;其本质作用是打开双通道,把最外层调用方与最内层子生成器连接起来,避免在中间协程添加大量处理异常的样板代码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

yield from
  • yield from是python3.3新出现的句法
1、替代内层for循环
def chain(*param):
	for it in param:
		yield from it


s = 'ABC'
t = tuple(range(3))
print(list(s, t))

最终的输出为[‘A’, ‘B’, ‘C’, 0, 1, 2]

  • yield from完全替代了内层的for循环
  • 示例中首先调用iter(it),从中获取迭代器。因此,it是任何可以迭代的对象。
1.1、利用Node类来表示树结构
class Node:
    def __init__(self, value):
        self._value = value
        self._children = []

    def __repr__(self):
        return 'Node({!r})'.format(self._value)

    def add_child(self, node):
        self._children.append(node)

    def __iter__(self):
        return iter(self._children)

    def depth_first(self):
        yield self
        for c in self:
            yield from c.depth_first()


if __name__ == '__main__':
    root = Node(0)
    child1 = Node(1)
    child2 = Node(2)
    root.add_child(child1)
    root.add_child(child2)
    child1.add_child(Node(3))
    child1.add_child(Node(4))
    child2.add_child(Node(5))
    for ch in root.depth_first():
        print(ch)
  • __iter__代表一个python的迭代协议,返回一个迭代器对象,就能迭代。
  • __repr__保证打印时的输出格式。
  • depth_first返回一个生成器。将参数扁平化处理为一列单独的值。
2、打开双通道
  • yield from结构的本质作用是打开双通道,把最外层的调用方与最内层的子生成器连接起来,这样二者就能直接发送和产出值。不用再位于中间的协程中添加大量处理异常的样板代码。
Python 中,`yield` 关键字是生成器函数的核心特性之一。它用于定义一个生成器(generator),与普通函数不同的是,生成器可以在执行过程中暂停并保存当前状态,随后可以从上次暂停的位置继续执行。 ### `yield` 的基本使用 当在一个函数中使用 `yield` 表达式时,该函数就变成了一个生成器函数。调用生成器函数并不会立即执行其内部代码,而是返回一个生成器对象。这个生成器可以通过 `next()` 函数或迭代方式逐步执行[^2]。 例如: ```python def simple_generator(): yield 1 yield 2 yield 3 gen = simple_generator() print(next(gen)) # 输出: 1 print(next(gen)) # 输出: 2 print(next(gen)) # 输出: 3 ``` 每次调用 `next()` 时,生成器会从上一次暂停的地方继续执行,直到遇到下一个 `yield` 语句为止。如果再次调用 `next()` 而没有更多的 `yield` 语句,则会抛出 `StopIteration` 异常,表示生成器已经完成。 ### 使用 `yield` 处理大量数据 `yield` 的一个重要应用场景是在处理大数据集时节省内存。由于生成器不会一次性将所有数据加载到内存中,而是按需逐个生成值,因此非常适合处理大规模数据流或无限序列。 例如,下面是一个模拟读取大文件的生成器: ```python def read_large_file(file_path): with open(file_path, 'r') as file: for line in file: yield line.strip() # 假设有一个名为 "big_data.txt" 的大文本文件 for line in read_large_file("big_data.txt"): print(line) ``` 此例中,每行内容都是按需读取并处理的,从而避免了将整个文件加载到内存中。 ### `yield from` 的使用 除了直接使用 `yield`,Python 还提供了 `yield from` 语法来简化嵌套生成器的定义。通过 `yield from`,可以直接将另一个生成器、可迭代对象中的元素逐个传递给外部生成器,而无需手动遍历每个元素。 示例代码如下: ```python def my_generator(): yield from [1, 2, 3] yield from (4, 5, 6) yield from my_other_generator() def my_other_generator(): yield "a" yield "b" yield "c" for value in my_generator(): print(value) ``` 上述代码输出的结果依次为:1, 2, 3, 4, 5, 6, a, b, c。这表明 `yield from` 可以有效地将多个生成器或可迭代对象组合成一个更复杂的生成器流程[^1]。 ### 总结 - `yield` 是构建生成器的关键字,使得函数可以分段执行并保持状态。 - 使用 `yield` 可以高效地处理大型数据集,减少内存占用。 - `yield from` 提供了一种简洁的方式来链接多个生成器或可迭代对象,提高代码复用性和可读性。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值