生成器(yield [from]) --使用的两个例子

本文探讨了Python中生成器的高效数据处理方法,包括如何使用yield和yieldfrom实现数据管道及嵌套序列扁平化,同时展示了yieldfrom在递归生成器中的应用。

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

使用示例1:创建处理数据的管道

具体描述:我们想以流水线式的形式对数据进行迭代处理(类似Unix下的管道)。比方说我们有海量的数据需要处理,但是没法完全的将数据加载到内存中去。

解决方案:生成器函数是一种实现管道机制的好方法(具体代码不做描述了,这里简单介绍下原理)

原理剖析:
1、yield语句表现为数据的生产者,for循环表现为数据的消费者;
2、由于处理过程的迭代特性,这里只会用到非常少的内存。

使用示例2:我们有一个嵌套序列,想将它扁平化处理为一列单独的值

解决方案:通过写一个带有yield from语句的递归生成器函数来解决
import collections
def flatten(items, ingore_types=(str, bytes)):
    for x in items:
        # isinstance(x, collections.Iterable) 检查是否有某个元素是可迭代的;
        # 如果有,那么就用yield from将这个可迭代对象作为一种子例程进行递归,它将所有的值都产生出来
        if isinstance(x, collections.Iterable) and not isinstance(x, ingore_types):
            # not isinstance(x, ingore_types)是为了避免将字符串和字节串解释为可迭代对象,进而将他们展开为单独的一个个字符
            yield from flatten(x)
        else:
            yield x

items = [1, 2, [3, 4, [5, 6], 7], 8]
for x in flatten(items):
    print(x)
    
1
2
3
4
5
6
7
8

关于为何过滤not isinstance(x, ingore_types), 实例如下:

items = ['Dave', 'Paula', ['Thomas', 'Lewis']]
for x in flatten(items):  # 输出了整个字符串(并没有迭代字符串)
    print(x)
    
Dave
Paula
Thomas
Lewis
总结:

如果想编写生成器用来把其他的生成器当做子例程来调用,yield from是个不错的快捷方式。

在 PHP 中,`yield` 是一个非常强大的关键字,可以用于创建生成器函数。生成器函数的特点是可以在执行过程中暂停,然后在需要时继续执行。这种机制可以大大节省内存,特别是在处理大量数据时。 `yield from` 是 PHP 5.5 引入的新特性,可以将一个生成器中的值传递给另一个生成器,并且将其作为子生成器。这种机制可以让我们将生成器的代码分解成更小的部分,使得代码更加清晰和易于维护。 下面我们来看一个例子: ```php function generator1() { yield 'a'; yield 'b'; yield 'c'; } function generator2() { yield from generator1(); yield 'd'; yield 'e'; } foreach(generator2() as $value) { echo $value . "\n"; } ``` 在上面的例子中,我们定义了两个生成器函数 `generator1` 和 `generator2`,其中 `generator2` 中使用了 `yield from` 将 `generator1` 作为子生成器使用,并在后面添加了一些额外的值。 最后我们使用 `foreach` 循环遍历 `generator2` 生成的值,并输出每个值。运行上面的代码,输出结果如下: ``` a b c d e ``` 从输出结果可以看出,`yield from` 机制使得我们可以将生成器的代码拆分成更小的部分,使得代码更加清晰和易于维护。 除了将一个生成器作为子生成器之外,`yield from` 还可以用于数组和可迭代对象。例如: ```php function generator3() { yield from [1, 2, 3]; yield from new ArrayIterator([4, 5, 6]); } foreach(generator3() as $value) { echo $value . "\n"; } ``` 在上面的例子中,我们使用了 `yield from` 将数组和可迭代对象转化成了生成器,并将它们的值依次生成出来。 总结一下,`yield from` 是 PHP 中非常有用的一个特性,可以将多个生成器、数组、可迭代对象等合并成一个生成器,使得代码更加简洁和易于维护。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值