generator生成器函数

Generator生成器详解
本文深入解析Generator生成器函数,探讨其定义、表现形式及与普通函数的区别。介绍如何使用yield关键字实现函数的暂停与返回,展示生成器在解决异步问题上的应用,并解释yield*关键字的作用。

generator生成器函数

定义:

  • function后面加了*
  • 函数体里有 yield关键字
    function* Hello(name) {
        yield `hello${name}`;
        yield `how are you`;
        yield `bye`;
    }

表现形式
  • 调用这个函数,不会立即执行函数体里的内容,返回一个对象
  • 通过这个对象的next方法,可以驱动函数的执行,但是并不会执行完,执行到下一个yield关键字的时候,停住
  • 调用next()方法返回的结果
    • value: yield关键字后面的表达式的结果。
    • done:函数是否执行完。 (当函数return的时候执行完,返回true)
    • 函数return的时候,value是return的内容,done是true
    let ite = Hello('前端君');
    console.log(ite)//[object  Hello]

    console.log(ite.next());//{value: "hello前端军",done: false}

    console.log(ite.next());//{value: "how are you",done: false}

    console.log(ite.next());
    console.log(ite.next());//{value: undefined,done: true}

  • next()方法可以加参数
    • next(参数)
    • 这个参数会作为上一个yield关键字的返回值
作用
  • 函数可以返回多个值
  • 在调用函数之后,可以给函数体里传递数据了
  • 调用函数的时候,可以控制函数内部的执行了
  • 可以解决异步问题
生成器函数的执行器
// 写一个generator函数的执行器
        function run(gen) {
            // 编写一段递归调用来执行我们的代码
            let lt = gen;//这里调用,上面let就不要调用
            
            // debugger
            return new Promise((reslove, reject) => {
                // {value,done}
                function step(data) {
                    if (data.done) {
                        console.log("递归调用结束了");
                        reslove(data.value)
                    } else {
                        data.value.then(res => {
                            console.log(res);
                            step(lt.next(res))
                        })
                    }
                }

                step(lt.next())
            })
        }
        run(gen);

关键字‘yield*’;

作用:一个Generator函数里面调用另一个Generator函数使用yield*

    function* gen2(){
        yield "gen2 start";
        yield "gen2 end";

    }
    
    function* start(){
        yield "start";
        yield* gen2();
        yield "end";
    }

    var ite1 = start();
    console.log(ite1.next());//start
    console.log(ite1.next());//gen2 start

    console.log(ite1.next());//gen2 end//执行函数时依次执行完
    console.log(ite1.next());//end
    console.log(ite1.next());//undefined

与普通函数的区别:

  1. 普通函数用function来声明,Generator函数用function*声明。

  2.Generator函数函数内部有新的关键字:yield( 产出),普通函数没有.

return与yield的区别:

    yield在这里起到了十分重要的作用,就相当于暂停执行并且返回信息。
    return代表的是终止执行,yield代表的是暂停执行
### Python 生成器函数的使用方法 生成器函数是一种特殊类型的函数,在函数体内部含有 `yield` 关键字。当调用该函数时并不会立即执行其内的代码,而是返回一个生成器对象[^1]。 ```python def simple_generator(): yield "First" yield "Second" yield "Third" gen = simple_generator() print(next(gen)) # 输出 First print(next(gen)) # 输出 Second print(next(gen)) # 输出 Third ``` 上述例子展示了最简单的生成器函数形式及其基本操作方式。每次调用 `next()` 函数都会继续执行到下一个 `yield` 表达式并暂停,直到遇到新的 `yield` 或者抛出异常为止。 对于更复杂的场景,比如计算斐波那契序列: ```python def fibonacci(max_count): count, num_1, num_2 = 0, 0, 1 while count < max_count: yield num_1 num_1, num_2 = num_2, num_1 + num_2 count += 1 for number in fibonacci(7): print(number) ``` 这段代码实现了动态生成指定数量项的斐波那契数列,并逐个输出这些数值[^2]。 ### Python 生成器函数的实现原理 在底层上,每当程序运行至带有 `yield` 的语句处便会保存当前状态(局部变量、指令指针等),并将控制权交还给调用方;而下一次被请求获取新值的时候,则恢复之前的状态继续往下走直至再次遇见另一个 `yield` 或结束整个过程[^3]。 具体来说,Python 解释器会为每个活动中的生成器维护独立的数据结构——栈帧(Stack Frame),其中包含了所有必要的上下文信息以便于后续重新激活它来进行下一步处理工作[^4]。 这种机制使得我们可以轻松构建高效的内存友好型数据流管道,同时也让编写异步编程模式下的任务变得更加直观简单[^5]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值