问答1 问答5 问答50 问答500 问答1000
网友互助专业问答平台

iterator和generator之间的区别是什么

提问网友 发布时间:2022-04-21 20:27
声明:本网页内容为用户发布,旨在传播知识,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。
E-MAIL:1656858193@qq.com
2个回答
热心网友 回答时间:2022-04-18 16:57

这个问题分类有误,应该标记为计算机、程序。

引用一段大神的介绍:

迭代器EDIT

迭代器是一个对象,知道如何存取物品从一个集合一次取出一项, 而跟踪它的当前序列所在的位置。在  JavaScript 中 迭代器是一个对象,它提供了一个 next() 方法返回序列中的下一个项目。当这个序列消亡时这个方法可以随时抛出一个StopIteration exception(异常)。

一旦创建,迭代器对象可以显式地通过不断调用 next(),或隐式地使用 JavaScript 的 for...in  和 for each 构造。

简单的迭代器对象和数组可以使用 Iterator() 函数创建(下面是一个简单的对像):

var lang = { name: 'JavaScript', birthYear: 1995 };
var it = Iterator(lang);

一旦初始化,next()方法可以用来依次访问对象中的键-值:

var pair = it.next(); // Pair is ["name", "JavaScript"]
pair = it.next(); // Pair is ["birthYear", 1995]
pair = it.next(); // A StopIteration exception is thrown

一个 for...in 循环结构可以直接取代next()方法的调用。 当StopIteration exception异常抛出时这个循环会自动终止。

var it = Iterator(lang);
for (var pair in it)
 print(pair); // prints each [key, value] pair in turn

假如我们只想遍历一个对象的 keys 时,我们可以通过把第二个参数设置为 true 来实现:

var it = Iterator(lang, true);
for (var key in it)
 print(key); // prints each key in turn

使用 Iterator() 来访问对象内容的优点是对于那些已经加入对象的自定义属性(不用管属性名,一股脑的访问,或者只访问属性,上面就是这样)。它的原型不会包含在序列中。

Iterator() 也可以用于数组:

var langs = ['JavaScript', 'Python', 'C++'];
var it = Iterator(langs);
for (var pair in it)
 print(pair); // prints each [index, language] pair in turn

基于对象,通过传递true作为第二个参数,将会导致迭代结果发生数组索引上益(会吗?我也没搞明白,你知道的话请告诉我):

var langs = ['JavaScript', 'Python', 'C++'];
var it = Iterator(langs, true);
for (var i in it)
 print(i); // prints 0, then 1, then 2

也可以指定块作用域变量(let是个javascript1.7的关键字,可以使用 let 建立只存在于 for 循环上下文中的变量)包括索引和值(index and value)在for…in循环中使用let关键字和非结构化赋值:

var langs = ['JavaScript', 'Python', 'C++'];
var it = Iterator(langs);
for (let [i, lang] in it)
print(i + ': ' + lang); // prints "0: JavaScript" etc.

定义自定义迭代器EDIT

某些对象遍历集合的项目时应该使用特定的方式遍历。

遍历一个序列对象时应该是一个接着一个。

遍历一棵树时应该使用深度优先或者广度优先方式。

遍历一个数据库查询结果对象时应该是一条一条地遍历,即使整个结果并没有被加载到一个数组中。

一个迭代器在一个无限的数学序列(如斐波那契序列)应该能够一个一个地返回结果而不创建一个无限长度的数据结构。

JavaScript可以让你编写代码来表示自定义迭代逻辑并链接到一个对象。

我们来创建一个简单的序列对象用来存放low和high。

function Range(low, high){
 this.low = low;
 this.high = high;
}

现在我们要创建一个遍历器,可以返回这个序列中的一序列包容性的整数,这个遍历器接口要求我们我们实现一个next()方法,这个next()方法返回这个序列或者抛出一个StopIteration exception异常。

function RangeIterator(range){
 this.range = range;
 this.current = this.range.low;
}
RangeIterator.prototype.next = function(){
 if (this.current > this.range.high)
   throw StopIteration;
 else
   return this.current++;
};

我们的RangeIterator被一个序列实例所序列化,并且维持它自己当前的属性属性所在位置。

最后,为了RangeIterator与Range序列对象,我们需要给Range写一个特殊的__iterator__方法,当我们试着遍历这个Range序列时会调用这个方法,并且应该返回一个RangeIterator遍历器实例。

Range.prototype.__iterator__ = function(){
 return new RangeIterator(this);
};

下面就写段代码来实验下我们自定义的遍历器吧:

var range = new Range(3, 5);
for (var i in range)
 print(i); // prints 3, then 4, then 5 in sequence

生成器(Generators): 一个更好的方法来构建遍历器EDIT

虽然迭代器是一个有用的工具,但是由于需要显示地维持他们的内部状态,所以他们的构造需要仔细的规划(看得我眼花呀)。生成器给你提供了一个强大的选择:它允许你通过写一个可以保存自己状态的的简单函数来定义一个迭代算法。

一个生成器其实是一种特殊类型的函数(这个函数作为一个为迭代器工作的工厂),一个函数如果它里面包含了一个或一个以上的yield表达式,那么这个函数就成为一个生成器了。


Note: 这个yield关键字只能被包含在下面的代码快中才有用 <script type="application/javascript;version=1.7">  (或者更高版本).XUL脚本标记访问这些功能不需要这个特殊的块。


当一个生成器函数被一个函数体调用时并不会马上执行;相反,它会返回一个generator-iterator对象。每次调用generator-iterator的next()方法将会执行这个函数体至下一个yield表达式并且返回一个结果。当函数执行完或者执行到一个return时抛出一个StopIteration exception异常。

用一个案例来阐述:

function simpleGenerator(){
 yield "first";
 yield "second";
 yield "third";
 for (var i = 0; i < 3; i++)
   yield i;
}

var g = simpleGenerator();
print(g.next()); // prints "first"
print(g.next()); // prints "second"
print(g.next()); // prints "third"
print(g.next()); // prints 0
print(g.next()); // prints 1
print(g.next()); // prints 2
print(g.next()); // StopIteration is thrown

一个生成器函数可以直接用作为一个类的__iterator__方法,大大的减少了创建一个自定义迭代器的代码量,下面是Range重写成一个生成器:

function Range(low, high){
 this.low = low;
 this.high = high;
}
Range.prototype.__iterator__ = function(){
 for (var i = this.low; i <= this.high; i++)
   yield i;
};
var range = new Range(3, 5);
for (var i in range)
 print(i); // prints 3, then 4, then 5 in sequence

并不是所有的生成器都会终止;它也可以创建一个无穷序列的生成器。下面实现了斐波纳契数列的生成器:

function fibonacci(){
 var fn1 = 1;
 var fn2 = 1;
 while (1){
   var current = fn2;
   fn2 = fn1;
   fn1 = fn1 + current;
   yield current;
 }
}

var sequence = fibonacci();
print(sequence.next()); // 1
print(sequence.next()); // 1
print(sequence.next()); // 2
print(sequence.next()); // 3
print(sequence.next()); // 5
print(sequence.next()); // 8
print(sequence.next()); // 13

生成器可以有参数,但被*在函数第一次调用时。生成器可以通过一个return语句来终止(因为他们将抛出一个topIteration exception)。下面是一个变异的fibonacci()函数有一个limit参数,一旦满足条件将终止。

function fibonacci(limit){
 var fn1 = 1;
 var fn2 = 1;
 while (1){
   var current = fn2;
   fn2 = fn1;
   fn1 = fn1 + current;
   if (limit && current > limit)
     return;
   yield current;
 }
}

热心网友 回答时间:2022-04-18 18:15
generator是生成器,当然是用来生成某些东西。「generator」生成「Iterator对象」

本文如未解决您的问题请添加抖音号:51dongshi(抖音搜索懂视),直接咨询即可。

相关推荐
  • JavaScript中的Generator函数的用法介绍(附代码)

    JavaScript中的Generator函数的用法介绍(附代码)

    JavaScript中的Generator函数的用法介绍(附代码):本篇文章给大家带来的内容是关于JavaScript中的Generator函数的用法介绍(附代码),有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。语法上首先可以把它理解成,Generator 函数是一个状态机,封装了多个内部状态。执行 Generator
    查看详情
  • JavaScript中Generator函数的详理解

    JavaScript中Generator函数的详理解

    JavaScript中Generator函数的详理解:本篇文章给大家带来的内容是关于JavaScript中Generator函数的详理解,有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。这一篇是关于ES6中生成器函数相关总结和理解...Generator函数的定义在阮一峰老师的书中的说法是: Generator
    查看详情
干海底椰片怎么泡发 python3 有多少内置函数 干椰子片煲汤的做法大全 python 迭代器和生成器的区别 椰子片怎么做出来的 python中的迭代器有什么用 python异常值处理 python 生成器和迭代器的区别 python stopiteration怎么处理 中国有哪些著名的小吃? 日本有哪些风味食品是有历史故事的 各地的美食有哪些 怎么看自己的是什么时间注册的 吃粽子寓意着什么 微信怎样查看注册时间 吃粽子的寓意 怎么看自己的什么时候注册的 微信朋友圈的照片尺寸设置成多大才不会被压缩? 微信朋友圈长图规格多少!做放朋友圈不清楚! 微信朋友圈图片大小是多大最合适?1.像素2.kb 如果要关闭python解释器要用哪一个函数呢 软件开发专业难不难啊? 白色干海底椰片煲汤怎么是硬的?不知道的人不要乱... python 怎么把list转换成迭代器 标致4008怎么样?值得买吗? python中denominator是什么方法 标致4008优缺点有哪些?评价如何? python中的迭代器的理解? 试驾标致4008插混版,8AT+四驱,质感很高级 请教Python 这个类for循环怎么理解? 东风标志4008,是一辆不错的法系车吗? python 迭代器生成序列问题 4008的车主,这车怎么样 程序开发中生成器与迭代器的方法与使用? 椰子片和烤椰子片的口感有区别吗? 标致4008黑曜提车及使用报告,谈谈自己的用车感受! 我如何才能找到两个大文件有效地使用python交集 标致4008质量怎么样?标致4008这车质量怎么样,小... 求教深度学习python代码报错问题from numpy import... 看上了东风标致4008,这车的安全系数怎么样
Top