账号密码登录
微信安全登录
微信扫描二维码登录

登录后绑定QQ、微信即可实现信息互通

手机验证码登录
找回密码返回
邮箱找回 手机找回
注册账号返回
其他登录方式
分享
  • 收藏
    X
    Javascript的生成器函数要多加一个星号,Python却不需要额外标识,为什么这样设计?
    61
    0

    一个Javascript的生成器函数是这样的:

    function *gen(n) {
      for (let i = 0; i < n; i++) {
        yield i;
      }
    }
    [...gen(10)]
    // <- (10) [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

    Javascript在声明的时候要多加一个星号。如果不加星号,会报SyntaxError

    一个python的生成器函数是这样的:

    def gen(n):
      for i in range(n):
        yield i
    
    >>> list(gen(10))
    [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

    python在声明的时候不需要额外标识。直接用yield就行了。

    两个语言都用了yield关键词,工作原理也几乎相同,甚至可以说Javascript就是抄的python。那为什么Javascript反而要多加一个星号呢?这个星号有什么意义?为什么要这样设计?是Javascipt太特殊,还是python太特殊?

    我相信这应该是有原因的,毕竟ES2015的制定过程相当和谐(字面意义上的)

    0
    打赏
    收藏
    点击回答
        全部回答
    • 0
    • 烟敛寒林 普通会员 1楼

      在JavaScript中,生成器函数使用function *() {...}来定义,其中*()表示生成器函数,可以理解为一个无限递归调用,直到最后返回一个值。在JavaScript中,生成器函数的创建方式是通过使用new关键字,语法如下:

      javascript var gen = new GeneratorFunction();

      在Python中,生成器函数的创建方式也使用new关键字,语法如下:

      python def GeneratorFunction(): # 在这里定义函数的代码 pass

      生成器函数在Python中的使用方式和JavaScript类似,但还有一些不同之处:

      1. 定义和创建方式
      2. 在Python中,使用Generator关键字定义一个生成器函数。Generator关键字的含义是“生成器”,后面跟一个星号*,表示函数是一个生成器函数。
      3. 在JavaScript中,直接使用function *() {...}定义生成器函数,不需要使用new关键字。*()是一个普通函数,直接返回一个值。

      4. 定义生成器函数的特征

      5. 在Python中,生成器函数有一个特殊特性,即可以使用yield关键字声明生成器函数的状态,这样在函数内部可以创建一个列表、迭代器或其他数据结构,并返回一个迭代器对象,表示当前生成器函数的状态。
      6. 在JavaScript中,生成器函数内部可以使用yield关键字声明生成器函数的状态,但没有Python中那么直观和直观,生成器函数需要额外的注释和关键字yield来实现这一点。

      7. 性能

      8. 在Python中,由于生成器函数是在生成器表达式中声明的,而不是在控制台中调用的,所以它的性能通常优于传统的循环语句,因为生成器函数不会在执行过程中阻塞,可以频繁地在内存中创建和销毁值,提高了并发处理性能。
      9. 在JavaScript中,由于需要使用new关键字创建生成器函数,生成器函数的创建和使用都需要额外的时间和空间,因此在处理大量数据或高并发环境下,JavaScript的生成器函数可能会比Python的生成器函数慢。

      10. 函数返回值

      11. 在Python中,生成器函数通常只有一个固定返回值,通常是None。这是因为Python的内建函数没有返回值(包括yield语句返回的值),而生成器函数在执行过程中可以返回一个值。
      12. 在JavaScript中,生成器函数通常返回一个迭代器对象,可以是null或一个Promise对象,取决于生成器函数的类型和返回值的实现。

      总的来说,虽然在Python和JavaScript中都可以使用Generator关键字定义生成器函数,但Python的生成器函数具有更清晰的定义方式、更好的性能、固定的返回值类型和可迭代的返回值对象,这些使得Python的生成器函数在一些场景下具有更好的使用体验和性能。在实际开发中,应根据具体需求和环境选择使用哪种语言和方式定义和使用生成器函数。

    更多回答
    网站公告
    扫一扫访问手机版
    • 回到顶部
    • 回到顶部