首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

在生成器函数内调用函数,但"Generator已在运行“

在生成器函数内调用函数,但"Generator已在运行"是指在生成器函数内部调用另一个函数时,该函数是一个生成器函数,并且该生成器函数已经处于运行状态。

生成器函数是一种特殊的函数,它使用yield语句来定义生成器的迭代行为。当调用生成器函数时,它会返回一个生成器对象,该对象可以用于迭代生成器函数中的值。

当在生成器函数内部调用另一个生成器函数时,如果被调用的生成器函数已经处于运行状态,就会抛出"Generator已在运行"的异常。这是因为生成器函数是一种协程,只能在一个生成器函数执行完毕后才能调用另一个生成器函数。

为了避免"Generator已在运行"的异常,可以使用yield from语句来委托生成器函数的执行。yield from语句可以将生成器函数的执行委托给另一个生成器函数,并在被委托的生成器函数执行完毕后继续执行当前生成器函数。

以下是一个示例代码:

代码语言:txt
复制
def generator1():
    yield 1
    yield 2

def generator2():
    yield from generator1()
    yield 3
    yield 4

for value in generator2():
    print(value)

输出结果为:

代码语言:txt
复制
1
2
3
4

在上面的示例中,generator2函数内部调用了generator1函数,并使用yield from语句委托了generator1函数的执行。这样就可以在generator2函数中正确地调用另一个生成器函数而不会抛出"Generator已在运行"的异常。

推荐的腾讯云相关产品和产品介绍链接地址:

  • 云函数(Serverless):https://cloud.tencent.com/product/scf
  • 云原生应用引擎(TKE):https://cloud.tencent.com/product/tke
  • 云数据库 MySQL 版(TencentDB for MySQL):https://cloud.tencent.com/product/cdb_mysql
  • 云服务器(CVM):https://cloud.tencent.com/product/cvm
  • 云安全中心(SSP):https://cloud.tencent.com/product/ssp
  • 腾讯云音视频处理(MPS):https://cloud.tencent.com/product/mps
  • 人工智能(AI):https://cloud.tencent.com/product/ai
  • 物联网(IoT):https://cloud.tencent.com/product/iotexplorer
  • 移动开发(移动推送、移动分析、移动测试等):https://cloud.tencent.com/product/mobile
  • 云存储(COS):https://cloud.tencent.com/product/cos
  • 腾讯云区块链服务(BCS):https://cloud.tencent.com/product/bcs
  • 腾讯云元宇宙(Tencent Cloud Metaverse):https://cloud.tencent.com/solution/metaverse
页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

Node.js 中的异步生成器和异步迭代

在使用异步生成器之前,你需要对生成器和 for ... of 循环有扎实的了解。 假设我们要在生成器函数中使用 await,只要需要用 async 关键字声明函数,Node.js 就支持这个功能。...如果你不熟悉异步函数,那么请看 《在现代 JavaScript 中编写异步任务》一文。 下面修改程序并在生成器中使用 await。...也就是说,你的代码将会以和编写的代码不同的顺序运行。 当你的程序第一次遇到 for await 循环时,它将在你的对象上调用 next。...当循环结束并进行下一个行程时,Node.js 将在对象上调用 next。该调用会产生另一个 promise,代码执行将会再次离开你的函数。...作为练习,你需要自己运行程序然后查看执行结果是怎样的。 如果你不知道它的工作方式,就会使程序的执行产生混乱,异步迭代的确是一项强大的技术。 ---- ?、 精彩文章回顾,点击直达

1.7K30

ES2015新语法详解——生成器Generator

yield语句的作用与return语句有些相似,并非退出函数体,而是切出当前函数运行时(此处为一个类协程,Semi-coroutine),与此同时可以将一个值(可以是任何类型)带到主线程中。...2 启动生成器成器函数不能直接作为普通的函数来使用,因为在调用时无法直接执行其中的逻辑代码。执行生成器函数会返回一个生成器对象,用于运行成器内容和接受其中的值。...但是在实际开发中,我们同样会遇到一个生成器嵌套在另一个生成器的情况,就比如数学中的分段函数或嵌套的数组公式等。 假设有如下所示的一个分段函数,我们需要对其进行积分计算。 ?...为了实现以生成器作为逻辑执行主体,把异步方法带到主线程去,就要先将异步函数做一层包装,使得其可以在带出生成器执行对象之后再执行。这样我们就可以在生成器使用这个异步方法了。...上面我们通过封装所得到的异步方法在生成器内部执行后,可以通过yield语句将内层的函数带到主线程中。这样我们就可以在主线程中执行这个函数并得到返回值,然后将其返回到生成器执行对象中。

79250
  • generator成器

    generator(生成器)是ES6标准引入的新的数据类型。一个generator看上去像一个函数,但可以返回多次。...value属性是对yield表达式求值的结果,而done是false,表示生成器函数尚未完全完成。 一旦遇到 yield 表达式,生成器的代码将被暂停运行,直到生成器的 next() 方法被调用。...在生成器的代码路径中的yield运算符,以及通过将其传递给Generator.prototype.next()指定新的起始值的能力之间,生成器提供了强大的控制力。...在使用yield阻断程序运行时需要注意一点yield 使用的地方必须是能够返回函数调用的位置,比如说 function* foo(x) { setTimeout(()=>{ yield...x; },1000) } 如此写必然会产生报错,因为在异步函数返回是无法返回到函数调用者身上。

    81330

    【ES6基础】生成器Generator

    在ES6定义的生成器函数有别于普通的函数,生成器可以在执行当中暂停自身,可以立即恢复执行也可以过一段时间之后恢复执行。最大的区别就是它并不像普通函数那样保证运行到完毕。...; 运行上述代码将会输出: 12 6 13 81 true 从上述代码我们可以看出: 第一次调用generator.next(),调用yield 12,并返回值12,相当启动生成器。...第四次调用next,函数运行到最后一行,C变量在上一行暂停点被赋值成78,最后一行为加法运算,因此value属性返回81。 再次运行next()方法,done属性返回true,生成器数值消费完毕。...data two 结果按照我们的预期进行输出,而且main()函数的代码更加友好,和同步代码的感觉是一致的,程序运行的步骤是这样的: 首先实例化生成器对象 接下来我们调用next()方法,启动生成器,...getDateTwo()函数在1秒钟后,触发调用generator.next(‘response data two’),向生成器main内部变量dataTwo传值,然后运行下面console.log的内容

    73130

    【ES6基础】生成器Generator

    在ES6定义的生成器函数有别于普通的函数,生成器可以在执行当中暂停自身,可以立即恢复执行也可以过一段时间之后恢复执行。最大的区别就是它并不像普通函数那样保证运行到完毕。...调用成器也十分简单,就和调用普通函数一样,比如: it(); 同时也可以向生成器函数传递参数: function *it(x,y){ } it(5,10); yield关键字 生成器函数中,有一个特殊的新关键字...; 运行上述代码将会输出: 12 6 13 81 true 从上述代码我们可以看出: 第一次调用generator.next(),调用yield 12,并返回值12,相当启动生成器。...getDateTwo()函数在1秒钟后,触发调用generator.next('response data two'),向生成器main内部变量dataTwo传值,然后运行下面console.log的内容...你是不是发现一个异步调用就和同步调用一样,但它是以异步的方式运行的。

    1.4K50

    【ECMAScript6】es6 要点(二)Promise | 自个写一个Promise | Generator | AsyncAwait

    /调用 Generator函数,生成一个迭代器,从而能够控制生成器的执行 console.log(genObj);//返回一个Generator原始类型的实例 genObj.next(); // 调用实例的...第一次调用Generator实例时,yield将函数置于暂停模式并返回值。当下一次调用Generator实例时,Generator函数将从它中断的地方恢复执行。...完成:在生成器执行期间,如果代码执行到return语句,或者全部代码执行完,生成器就会进入完成状态。...Generator和Promise结合 将生成器和Promise结合,能实现更加优雅的代码。例如:我们可以把异步任务放在生成器中,然后执行生成器函数。...:帮助处理异步代码 回调函数:在Promise对象上注册成功和失败的回调函数 箭头函数:适合用在回调函数上 闭包:迭代器在async函数被创建,在promise的回调函数通过闭包获取该迭代器 generator

    25020

    【翻译】ES6生成器简介

    运行-暂停-运行 ES6生成器为我们带来了一种新型解决方案:生成器是一种与常规function完全不同的function,它的运行可以被多次暂停和恢复,并且JavaScript可以在生成器暂停期间可以运行其他代码...ES6生成器的目的便是与并行代码协作运行在生成器function内部,可以通过yield关键字自内部暂停运行。...在生成器函数中,我们可以通过yield输出结果信息,在被恢复的时候接受信息作为参数。 使用语法 废话不多说,开始使用吧!...*foo()的数值,我们需要构建一个迭代器: var it = foo(); 注意:用上述常规函数运行语句foo()来运行成器函数,实际上并没有执行它。...ES6会告知生成器函数抛弃这种情况下的传参。(注意:原作者在写这篇文章的时候,Chrome和FF的运行结果如上所述,其他浏览器会抛错。)

    77970

    成器进化到协程 Part 1

    成器 101 yield 用于定义生成器函数 只要 yield 存在该函数必定是一个生成器 调用函数返回一个生成器 让一个生成器前进 使用 next 使一个生成器前进到下一个 yield 语句处,..., '运行错误')) apple 捕捉到: 运行错误 banana 生成器返回值 如果在生成器函数中加上 return 那在运行到 return 时将会把返回值作为 StopIteration 的值传递出去...as e: print(e) apple 生成器委托 使用 yield from 可以帮你对一个生成器不断调用 next 函数,并返回生成器的返回值。...言下之意是你可以在生成器调用成器。...generator() print(result) 调用 func 结果是返回一个生成器 # func() <generator object func at 0x0000021F5EB0F990

    35820

    PHP-5.5新特性之yield

    当生成器函数调用的时候,它会返回一个可迭代的对象,当对该对象进行迭代的时候,PHP将会在需要的时候调用成器函数,并且在生成器使用新增的关键字yield产生一个新的值的时候,保存迭代器内部的状态。...迭代器没有新的值需要产生的时候,生成器函数就可以直接退出,外部函数继续执行。 注意,在生成器函数中,不能使用return语句返回值,使用return返回值的话会产生编译器错误。...生成器函数与普通函数一样的,唯一的区别函数使用了yield关键字。...办法总是有的,因为调用成器函数后返回的是一个Generator对象,因此我们可以通过调用该对象的send方法从外部给生成器函数传递一个值,在调用send方法之后,yield会收到send函数发送的值。...接下来我们调用了$gen->send('ret')方法,这时,生成器第一个yield语句返回该方法传递的值ret1,因此输出了$ret的值为ret1。

    93720

    PHP 生成器入门

    成器是 PHP 中的一个很特别的函数。当一个函数包含 yield,那么这个函数即不再是一个普通函数,它永远返回一个「Generator(生成器)」实例。...PHP_EOL; $generator->next(); } 我们可以清楚的看到生成器是更高级的技术,现在让我们编写一个新的生成器示例来更好的理解到底在生成器内部是如何进行处理的吧。...我们看到生成器一直运行到了第一个 yield 时,将控制流程交还给调用者 $generator->valid()。...$generator->next() 调用时则恢复生成器执行,到下一个 yield 再次停止运行,如此反复直到没有更多的 yield 为止。...在讲解协程和状态流解析器之前,我们快速浏览一下如何在生成器中返回数据,我们还没有将接触这方面的知识。从 PHP 5.5 开始我们可以在生成器内部使用 return; 语句,但是不能返回任何值。

    2K10

    只要3分钟,Python生成器原理详解

    这是一个生成器函数generator function): >>> def gen_fn(): ... result = yield 1 ... print('result of yield: {}'...__code__.co_flags & generator_bit) True 当你调用一个生成器函数时,Python 会看到生成器标志,实际上并不运行函数,而是创建一个生成器generator):...>>> gen = gen_fn() >>> type(gen) Python 生成器封装了一个堆栈帧和一个对生成器函数代码的引用,在这里就是对 gen_fn...send 的返回值是 1,这是因为 gen 把 1 传给了 yield 表达式: >>> gen.send(None) 1 现在生成器的指令指针(instruction pointer)向前移动了 3...生成器调用调用层次结构中的位置不是固定的,它不需要遵循常规函数执行时遵循的先进后出顺序。生成器被是被解放了的,它像云一样浮动。

    1.6K60

    Python中的 yield 和 return 混用引发的思考

    调用函数将返回一个生成器对象,而不是普通函数直接执行函数中的代码。...一旦函数执行到 return 语句,函数会立即结束,并且只能返回一次值。 在生成器函数中使用 return 语句可以用来提供生成器的终止原因,这不会返回值给调用者。...一旦执行到 return 语句,即使是在生成器函数中,函数也会立即结束。后续的 yield 语句将不会执行。...,但它更为强大,可以将另一个可迭代对象(例如生成器、列表、集合等)的值传递给当前的生成器函数调用者。...总的来说,yield 用于生成单个值,而 yield from 用于在生成器函数中委托生成器或可迭代对象的值。

    21810

    Python生成器实现及yield关键字

    为了达到记录当前状态,并配合next()函数进行迭代使用,我们可以采用更简便的语法,即生成器(generator)。 生成器是一种特殊的迭代器,它比迭代器更优雅,本文就详细介绍生成器的实现及使用。...二、通过yield关键字实现生成器 可以通过函数的形式来实现生成器函数使用yield关键字。...: 0 1 1 2 3 5 8 13 21 34 在生成器实现的过程中,我们将原本在迭代器__next...简单来说:只要在函数中有yield关键字的就称为生成器。 此时调用函数返回的是一个生成器对象,可以通过next()或for循环来使用生成器。 ?...yield关键字有两点作用: 1.保存当前运行状态(断点),然后暂停执行,即将生成器函数)“挂起”。

    34630

    从yield 到yield from再到python协程

    ,包含yield语句的函数称为生成器函数调用成器函数时,并不会执行函数体中的代码,而是返回一个生成器对象 每次调用成器对象的next()方法时,才会执行生成器函数中的代码,直到遇到yield 或者...如果调用close()方法导致异常抛出,那么异常会向上冒泡,传给委派生成器,否则委派生成器抛出GeneratorExit异常 python协程 Python的生成器函数和python的协程非常接近 ,并不完全...为generator-iterators 添加了一个新的方法throw(), 它在生成器暂停时引发异常,并返回生成器产生的下一个值,如果生成器退出而不产生另一个值,则引发StopIteration(如果生成器没有捕获传入的异常...,或者引发另外的一个异常,那么该异常会传播给调用者) 为generator-iterators 添加了一个新的方法close(), 在生成器暂停的位置引发一个GeneratorExit 异常,如果一个生成器引发了...并不会运行成器函数中的代码,而是返回一个生成器对象,所以我们需要通过调用next(...)来激活协程,这个时候开始运行成器函数, 当运行到x = yield的时候,yield的右边如果有表达式,则会先进行右边表达式的计算

    96040

    【深扒】深入理解 JavaScript 中的生成器

    关于生成器有这样的描述 红宝书:生成器是 ES6 新增的一个极为灵活的结构,拥有在一个函数暂停和恢复代码执行的能力 阮一峰老师:Generator 函数是 ES6 提供的一种异步编程解决方案 从上面的两段话中...但是yield的工作方式却不同,我们再来看看 yield 是如何工作的 注意:yield 关键字只能在生成器函数内部使用,其他地方使用会抛出错误 首先生成器函数会返回一个遍历器对象,只有通过调用 next...其实在生成器函数中也可以没有yield表达式,但是生成器的特性还在,那么它就变成了一个单纯的暂缓执行函数,只有在调用函数的遍历器对象的 next 方法才会执行 function* hello() {...我的理解是:当调用 Generator 函数获取一个迭代器时,状态机处于初态。迭代器调用 next 方法后,向下一个状态跳转,然后执行该状态的代码。...foo 函数返回一个遍历器对象 it ,并将 6 作为参数传递给 x ,调用遍历器对象的 next 方法,启动遍历器对象,并且运行到第一个 yield 位置停止, 再次调用 next 方法传入参数 7

    29030

    【深扒】深入理解 JavaScript 中的生成器

    关于生成器有这样的描述 红宝书:生成器是 ES6 新增的一个极为灵活的结构,拥有在一个函数暂停和恢复代码执行的能力 阮一峰老师:Generator 函数是 ES6 提供的一种异步编程解决方案 从上面的两段话中...但是yield的工作方式却不同,我们再来看看 yield 是如何工作的 注意:yield 关键字只能在生成器函数内部使用,其他地方使用会抛出错误 首先生成器函数会返回一个遍历器对象,只有通过调用 next...其实在生成器函数中也可以没有yield表达式,但是生成器的特性还在,那么它就变成了一个单纯的暂缓执行函数,只有在调用函数的遍历器对象的 next 方法才会执行 function* hello() {...我的理解是:当调用 Generator 函数获取一个迭代器时,状态机处于初态。迭代器调用 next 方法后,向下一个状态跳转,然后执行该状态的代码。...foo 函数返回一个遍历器对象 it ,并将 6 作为参数传递给 x ,调用遍历器对象的 next 方法,启动遍历器对象,并且运行到第一个 yield 位置停止, 再次调用 next 方法传入参数 7

    30720

    Python生成器、推导式之前襟后裾

    成器 函数体内有yield选项的就是生成器,生成器的本质是迭代器,由于函数结构和生成器结构类似,可以通过调用来判断是函数还是生成器,如下: def fun(): yield "我是生成器"...Python获取生成器的二种方式: 通过函数获取生成器 通过生成器推导式创建生成器 通过函数获取生成器 def fun(): print("fun") yield "生成器" g...= fun() print(g) # 打印函数名查看是否是生成器 # 打印内容如下: 从打印内容可以看出是生成器...我们将send(None)作为第一次调用即可,然后在第二次调用时可以传适当的参数。...如下:过滤1-20的所有偶数。 g_1 = (num for num in range(20) if num % 2 == 0) 升级:与上面列表推导式升级练法类似。

    34020

    Python3中的生成器进阶(sendclosethrow)

    当我们开始启动程序,函数A运行函数B的时候,会去调用函数B; 而函数B运行函数C的时候,会去调用函数C;而函数C运行函数3的时候继续往后走,当函数3执行完就会回到函数B的2位置,继续往后执行函数B...因此可以发现,生成器函数是可以暂停的函数,它在调用方的驱使下(调用方使用next()函数),每次执行到yield处,将yield的值产出给调用方后就暂停自己的执行,直到调用方下一次驱动它执行。...这里总结一下:当生成器调用close方法后,若其中包含未执行的含yield代码,则程序会在gen.close()处报RuntimeError: generator ignored GeneratorExit...现在生成器调用close方法且其中包含未执行的含yield代码,我们又不想让它报错,那该怎么办呢?...那么到现在生成器通过send、close、throw方法已经初步达到我们对协程的要求,可以产值、传值、扔异常、关闭等操作,但是这还不够,还需要另一个方法yield from。

    1.1K20

    ES6:【深扒】 深入理解 JavaScript 中的生成器

    关于生成器有这样的描述 红宝书:生成器是 ES6 新增的一个极为灵活的结构,拥有在一个函数暂停和恢复代码执行的能力 阮一峰老师:Generator 函数是 ES6 提供的一种异步编程解决方案 从上面的两段话中...但是yield的工作方式却不同,我们再来看看yield是如何工作的 image.png 注意:yield关键字只能在生成器函数内部使用,其他地方使用会抛出错误 首先生成器函数会返回一个遍历器对象,只有通过调用...其实在生成器函数中也可以没有yield表达式,但是生成器的特性还在,那么它就变成了一个单纯的暂缓执行函数,只有在调用函数的遍历器对象的next方法才会执行 function* hello() {...在阮一峰老师的ES6书籍上有着对生成器函数这样的理解 Generator函数有多种理解角度。语法上,首先可以把它理解成,Generator 函数是一个状态机,封装了多个内部状态。...foo函数返回一个遍历器对象it,并将 6 作为参数传递给 x ,调用遍历器对象的next方法,启动遍历器对象,并且运行到第一个yield位置停止, 再次调用next方法传入参数 7 ,作为上一个yield

    29340
    领券