迭代器和生成器

本人明说,迭代器和生成器看了至少有好几个版本的书了,但是感觉都挺那啥的(晦涩难懂)。然后为了加深我自己对迭代器和生成器的了解和认知,决定写这么一篇博客,望各位砥砺前行。
迭代器和生成器

生成器

生成器,我的理解就是一个带有的函数,比如**function generator() {},或者function *generator() {},还有这样function * generator() {}**,这样都能叫生成器函数,那么它有什么用呢?
首先,它可以完成其他函数不可能完成的事情,就是暂停,我走到走到就不走了休息一下,哎,就是玩。那么它是靠什么暂停的呢?靠yield关键字.当生成器函数内部执行到yield的时候,就会暂停然后返回yield后面的数据,例子:

  function *myGenerator() {
    yield 'hello world!'
    yield 20
    return 30
  }

迭代器和生成器
result变成了一个这个玩意,是不是看不懂,看不懂就对了,因为这是一个迭代器对象,也就是说,我们调用了生成器函数后,返回了一个迭代器对象。那么我们接下来进入第二个阶段。

什么是迭代器(iterator)

我个人理解的迭代器是一个对象,它拥有一个特殊的函数next,调用next后会返回一个{value, done}类型的对象,然后迭代器先后移位。value表示迭代器返回的值,done表示迭代器是否已经将生成器运行完毕。那么了解完了迭代器,我们进入最后一个阶段。

迭代器控制生成器

如你所见,调用生成器后,就会创建一个迭代器。迭代器对象的next方法可以控制生成器的执行,这个方法用来向生成器请求一个值,从而控制生成器。

  let result = myGenerator()
  let result1 = result.next()
  let result2 = result.next()
  let result3 = result.next()
  console.log(result1); 
  console.log(result2);
  console.log(result3);

迭代器和生成器
好了我们懂了简单的生成器创建迭代器然后迭代器控制生成器了。接着来点我之后看到的东西。

迭代器把执行权交给下一个生成器

正如在标准函数中调用另一个标准函数,我们需要把生成器的执行委托给另一个生成器。

  function * myGenerator1() {
    yield "1"
    yield * myGenerator2()
    yield '4'
  }

  function * myGenerator2() {
    yield '2'
    yield '3'
  }

  for(let item of myGenerator1()) {
    console.log(item)
  }

迭代器和生成器
上面代码中,首先是正常的迭代,然后迭代了一个生成器函数,最后输出大概就是这样(语言措辞我有点不好组织,看懂了前面应该就懂了)
最后一种类型,通过迭代器给生成器里面赋值

迭代器给生成器赋值

  function * myGenerator1(val) {
    let num = yield val * 2
    yield num
  }

  let result = myGenerator1(2)
  let result1 = result.next(3)
  let result2 = result.next(5)
  console.log(result1, result2);

迭代器和生成器
在next里面的值,会在下一次next的时候传入生成器函数的yield后面,但是注意,因为第一次result = myGenerator1(2)是生成了迭代器,也就是说这时候val值已经被设为了2,在result.next(3)的时候,在前面并没有yield表达式,所有传入的3就会被忽略,而是用之前传入的val,也就是2。之后result.next(5)传入了5,替换之前的yield val * 2,所以num最后为5

冰狗,写完收工,终于把这些搞懂了。好图走起。
好兄弟有人认识这是谁吗??
迭代器和生成器

上一篇:Python并发编程之深入理解yield from语法(八)


下一篇:七天学会Python基础-第六天1/1