【问题标题】:Is there any way to create python-like generators in javascript?有没有办法在 javascript 中创建类似 python 的生成器?
【发布时间】:2018-11-21 01:20:27
【问题描述】:

在python中,如果你循环(或消耗)一个

  1. 迭代器
  2. 函数返回值

你甚至不知道你有哪一个。因此,如果您已从被调用者返回或产生值以在调用者中使用,那么调用者方面并不重要。

然而,据我所知,如果你想在 javascript 中使用 yield,你必须用星号显式标记函数 *,并且不能将计算值视为与“常规函数的返回值”相同的方式调用方。

在 javascript 中是否有一个抽象来隐藏这些差异以获得与 python 相同的漂亮抽象?

【问题讨论】:

  • @Jony-Y:你的链接坏了;解析器不考虑链接的* 部分。 This one should go where you wanted it to.
  • 不知道为什么 JS 生成器语法会困扰你...你有如何做到这一点的解决方案。你只是不想使用生成器语法吗?
  • @user2357112 谢谢。在阅读了这个问题后,我看到他知道 JS 中的生成器是什么。我试图了解他们的问题是什么,或者只是困扰他的糖衣
  • 对于第二个问题(“不能以同样的方式处理计算值”):有几个结构在数组上和在迭代器上一样有效,因为数组的迭代器用于那个案子。例如:for (let x of f())f 可以是生成器,也可以是返回数组等可迭代对象的普通函数。
  • 在 JS 中是 Array.from(f())[...f()]。阅读有关可迭代对象和迭代器的信息(注意区别)on MDN。它有示例、语法等。

标签: javascript python iterator generator


【解决方案1】:

在 JavaScript 中有几种结构,调用者不需要知道被调用的函数是生成器,还是返回数组、字符串、映射等的普通函数。这些返回值的共同点是它们都是可迭代的。

这里有两个例子说明如何处理此类函数的返回值:

  1. 遍历值:

    for (let x of f()) {
        // ...
    }
    

    根据f() 返回的内容,x 将如下:

    • 迭代一个字符串:获取每个字符
    • 迭代一个数组:获取它的每个元素
    • 迭代一个 Map:获取它的每个键/值对
    • 迭代一个迭代器(可能由生成器返回):从中获取每个产生的值
    • ...
  2. 从值创建一个数组:

    const copy = Array.from(f());
    

    也可以:

    const copy = [...f()];
    

    注意:Array.from 的好处是它接受一个回调函数作为第二个参数:为每个值调用一个映射器。

  3. 将值作为参数传播给另一个函数

    如果值是数字:

    Math.min(...f());
    

    由于Math.min 可以接受多个参数(不仅仅是两个),这给出了整个系列的最小值(就像min 在Python 中所做的那样)。

阅读更多关于迭代器和可迭代对象on MDN

【讨论】:

    【解决方案2】:

    自 ES6 以来

    a new "generator" function,它几乎完全像 Python 中的生成器一样工作。来自 MDN:

    function* generator(i) {
      yield i;
      yield i + 10;
    }
    
    const gen = generator(10);
    
    console.log(gen.next().value);
    // expected output: 10
    
    console.log(gen.next().value);
    // expected output: 20
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-11
      • 2014-07-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多