Questions tagged «iterator»

4
为什么Python中的迭代器会引发异常?
这是Java中迭代器的语法(C#中的语法有点相似): Iterator it = sequence.iterator(); while (it.hasNext()) { System.out.println(it.next()); } 有道理。这是Python中的等效语法: it = iter(sequence) while True: try: value = it.next() except StopIteration: break print(value) 我认为例外应该只在特殊情况下使用。 为什么Python使用异常来停止迭代?

6
为什么Python在迭代列表时仅复制单个元素?
我只是意识到在Python中,如果有人写 for i in a: i += 1 a实际上,原始列表的元素根本不会受到影响,因为该变量i原来只是中原始元素的一个副本a。 为了修改原始元素, for index, i in enumerate(a): a[index] += 1 将需要。 我真的为这种行为感到惊讶。这似乎很违反直觉,似乎与其他语言不同,并且导致了我的代码错误,而今天我不得不调试了很长时间。 我之前阅读过Python教程。可以肯定的是,我刚才再次检查了这本书,它甚至根本没有提到这种行为。 这种设计背后的原因是什么?难道它会成为许多语言的标准做法,以便本教程相信读者应该自然地获得它吗?以后我应该注意哪些其他语言的迭代行为?
31 python  list  iterator 

6
迭代器模式-为什么不公开内部表示很重要?
我正在阅读C#设计模式要点。我目前正在阅读有关迭代器模式的信息。 我完全了解如何实现,但不了解重要性或看不到用例。书中给出了一个示例,其中有人需要获取对象列表。他们可以通过公开公共财产(例如IList<T>或)来做到这一点Array。 这本书写道 问题是这两个类的内部表示都暴露给外部项目。 内部代表什么?事实是array或IList<T>?我真的不明白为什么这对消费者(程序员称呼这)是一件坏事…… 然后,这本书说这种模式通过公开其GetEnumerator功能而起作用,因此我们可以GetEnumerator()以此方式调用和公开“列表”。 我认为这种模式在某些情况下(与所有模式一样)都有位置,但是我看不到何时何地。

1
单元测试:Linq的延迟断言
可以添加这样的延迟断言吗 var actualKittens = actualKittens.Select(kitten => { Assert.IsСute(kitten); return kitten }); 为什么?因此,即使使用期望实现实例化的语句,我也可以仅迭代一次: CollectionAssert.AreEquivalent(expectedKittens, actualKittens.ToList()); 而且它可能不仅是Select,而且是定义了迭代器且具有大量检查和逻辑(例如,一些计数和过滤)的方法。 令人怀疑的种子是在测试失败的情况下读取和调试此类代码的复杂性。

1
发生器功能在功能编程中有效吗?
问题是: 生成器是否破坏了功能编程范式?为什么或者为什么不? 如果可以,可以在函数式编程中使用生成器吗?如何使用? 考虑以下: function * downCounter(maxValue) { yield maxValue; yield * downCounter(maxValue > 0 ? maxValue - 1 : 0); } let counter = downCounter(26); counter.next().value; // 26 counter.next().value; // 25 // ...etc 该downCounter方法显示为无状态。同样,downCounter使用相同的输入进行调用将始终导致相同的输出。但是,同时,调用next()不会产生一致的结果。 我不确定生成器是否会破坏函数式编程范式,因为在此示例中counter是生成器对象,因此调用next()将产生与使用完全相同的另一个生成器对象产生的结果相同的结果maxValue。 同样,调用someCollection[3]数组将始终返回第四个元素。同样,next()在生成器对象上调用四次也会始终返回第四个元素。 为了获得更多的上下文,在编写kata编程时提出了这些问题。回答问题的人提出了一个问题,即生成器是否可以在函数式编程中使用以及它们是否保持状态。

4
迭代器是否具有非破坏性的隐含合同?
假设我正在设计一个自定义数据结构,如堆栈或队列(例如-可能是其他任意有序集合,其逻辑等效于pushand pop方法-即破坏性访问器方法)。 如果您要IEnumerable<T>在每次迭代中弹出的这个集合上实现一个迭代器(特别是在.NET中),那会打破IEnumerable<T>Breaking的隐含契约吗? 是否IEnumerable<T>有此隐含合同? 例如: public IEnumerator<T> GetEnumerator() { if (this.list.Count > 0) yield return this.Pop(); else yield break; }

4
C ++迭代器,为什么没有迭代器继承的所有迭代器基类
我正在为考试而学习,但是我有一个问题很难解决。 为什么没有迭代器基类存在所有其他迭代器继承的东西? 我猜我的老师是从cpp参考“ http://prntscr.com/mgj542 ”中引用层次结构的,我们必须提供其他原因,而不是为什么? 我知道什么是迭代器(某种),并且它们用于在容器上工作。据我了解,由于底层数据结构可能不同,因此不同的容器具有不同的迭代器,例如,您可以随机访问数组,但不能访问链表,并且不同的容器需要不同的遍历它们的方式。 根据容器的不同,它们可能是专门的模板,对吗?
11 c++  iterator 

2
是什么使迭代器成为设计模式?
我一直在想,与其他类似构造相比,使Iterator变得特别的原因是什么,并且使“ 四人帮”将其列为设计模式。 迭代器基于多态性(具有公共接口的集合的层次结构)和关注点分离(对集合的迭代应独立于数据的结构方式)。 但是,如果我们将集合的层次结构替换为例如数学对象的层次结构(整数,浮点数,复数,矩阵等),而迭代器由代表这些对象的某些相关操作(例如幂函数)的类替换,该怎么办?类图将是相同的。 我们可能会发现更多类似的示例,例如Writer,Painter,Encoder和更好的示例,它们的工作方式相同。但是,我从未听说过其中任何一种称为设计模式。 那么,什么使Iterator特别呢? 是否因为需要可变状态来将当前位置存储在集合中而变得更加复杂,这是事实吗?但是,通常不认为可变状态是理想的。 为了阐明我的观点,让我举一个更详细的例子。 这是我们的设计问题: 假设我们有一个类的层次结构,并且在这些类的对象上定义了一个操作。每个类的操作接口相同,但实现方式可以完全不同。还假定对同一对象(例如具有不同的参数)多次应用该操作是有意义的。 这是解决我们设计问题的明智解决方案(实际上是迭代器模式的概括): 为了分离关注点,不应将操作的实现作为功能添加到原始类层次结构(操作数对象)中。由于我们想在同一个操作数上多次应用该操作,因此它应该由一个持有对该操作数的引用的对象来表示,而不仅仅是由函数表示。因此,操作数对象应提供一个函数,该函数返回表示操作的对象。该对象提供执行实际操作的功能。 一个例子: 有一个基类或接口MathObject(愚蠢的名字,我知道,也许有人有更好的主意。)与派生类MyInteger和MyMatrix。对于每个MathObject操作,Power都应定义一个允许计算平方,立方等的运算。所以我们可以写(用Java): MathObject i = new MyInteger(5); Power powerOfFive = i.getPower(); MyInteger square = powerOfFive.calculate(2); // should return 25 MyInteger cube = powerOfFive.calculate(3); // should return 125

1
为什么Java的Iterator和ListIterator指向元素之间?
ListIterator的Javadoc说: A ListIterator没有当前元素;它的光标位置始终位于调用返回previous()的元素和调用返回的元素之间next()。 为什么Java的ListIterator实现指向元素之间而不是当前元素?看来,这使得客户端代码的可读性,当它必须反复调用getNext(),getPrevious(),所以我认为必须有一个很好的理由选择。 作为一个方面说明,我只是写了一个小图书馆称为peekable-ArrayList的扩展ArrayList,Iterator以及ListIterator提供一个peekAtNext()和peekAtPrevious()类似的方法来实现: @Override public synchronized T peekAtNext() { T t = next(); previous(); return t; }
9 java  iterator 
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.