迭代器

title: 描述.
title: 内部迭代器.
content: 内部的迭代器是高阶函数(通常接受匿名函数),比如codice_1、 codice_2等,它实现跨经一个容器的遍历,依次将给定函数应用到每个元素。
title: 外部迭代器和迭代器模式.
content: 外部的迭代器可以被认为是某种类型的指针,它有两个主要操作:引用在一个对象(collection)中的一个特定元素(称为元素访问),和修改自身使其指向下一个元素(称为元素遍历)。还必须有一种方式建立迭代器并指向容器的第一个元素,还要有某种方式确定何时迭代器已经穷尽了容器中所有的元素。依据语言和意向用途,迭代器还可以提供额外的操作或展示不同的行为。  迭代器的主要用途是允许用户处理一个容器的所有元素,而将用户隔离于容器的内部结构。这允许容器以任何它希望的方式存储元素,而允许用户把它们看作就是简单的序列或列表。迭代器类通常设计为紧密协作于对应的容器类。容器类通常提供建立迭代器的方法。  循环计数器有时也被称为循环迭代器。但是循环计数器只提供遍历功能而不提供访问功能。
title: 生成器.
content: 实现迭代器的一种方式是使用受限形式的协程,也叫做生成器。不同于子例程,生成器协程可以向它的调用者多次产生返回值,而非只是返回一次。多数迭代器可自然的表达为生成器,但是因为生成器在被多次启用之间保存了自己的局部状态,它们特别适合于复杂的、有状态的迭代器,比如树遍历器。在不同的作者和语言之间,术语“生成器”和“迭代器”的用法上有微妙的差异和区别。有些语言将二者视为同一接口,有些语言如JavaScript则将之独立化。在Python中,生成器是一个迭代器构造器,即返回一个迭代器的函数。下面的Python生成器返回一个斐波那契数列的迭代器,使用到了Python的codice_3语句:  def fibonacci(limit):  for number in fibonacci(100): # The generator constructs an iterator
title: 隐式迭代器.
content: 一些面向对象语言比如C#、C++(后期版本)、 Delphi(后期版本)、Go、Java(后期版本)、Lua、Perl、Python、Ruby,提供了迭代一个容器对象的元素的方式,而不用介入一个显式的迭代器对象。实际的迭代器对象可以在现实中存在,即便如此,它也不被暴露在这个语言的源代码中。  隐式迭代器经常表现为codice_4语句(或等价者),比如下面的Python例子: for value in iterable:  在Python中,可迭代者(iterable)是可以被转换成迭代器的一个对象,接着在这个codice_5循环期间从头至尾迭代它,这是隐含完成的。  有的时候,它们可以被聚集(collection)对象自身建立,比如下面Ruby例子: iterable.each do |value| end 这种迭代风格有时叫做“内部迭代”,因为它的代码完全执行在可迭代对象的上下文(context)之内(它控制迭代的所有方面),而编程者只提供在每个步骤要执行的运算操作(使用匿名函数)。  支持列表推导或类似构造的语言,还可以在结果列表的构造期间使用隐式迭代器,比如在Python中: names = [person.name for person in roster if person.male] 有时隐式迭代只能做到部分的隐藏实质。C++语言有一些用于隐式迭代的函数模板,比如codice_6。这些函数仍要求显式的迭代器对象作为它们的初始输入,但是后续的迭代不将迭代器对象暴露给用户。
title: 串流.
content: 迭代器是对输入串流的一种有用的抽象,串流提供了潜在的无限可迭代的(但不必然可索引)的对象。一些语言,比如Perl和Python,将串流实现为迭代器。串流的可替代的实现包括数据驱动语言,比如AWK和sed。
title: 迭代器分类.
title: 迭代器范畴.
content: 迭代器可以依据功能而归类,下面是迭代器范畴的一个(不完全)列表:
title: 迭代器类型.
content: 不同的语言或它们所具有的函数库定义了自己的迭代器的类型,下面是一个(不完全)列表:
title: 语言范例.
title: C♯.
content: 在C♯中,一种新形式的迭代器提供了函数语言程序设计中的生成器,使用codice_7  类似于Python中使用的codice_3  // Method that takes an iterable input (possibly an array) // and returns all even numbers. public static IEnumerable<int> GetEven(IEnumerable<int> numbers)
title: C++.
content: C++的STL可支持迭代器。
title: Java.
content: Java JDK 1.2 版开始支持迭代器。每一个迭代器提供codice_9以及codice_10方法,同时也支持remove()。 Iterator iter = list.iterator(); //Iterator<MyType> iter = list.iterator(); in J2SE 5.0 while (iter.hasNext())
title: Python.
content: 在Python中,迭代器是语言的基础部分,而在很多情况下是不可见的,因为它们隐含的用在了codice_5(foreach)语句、列表推导、和之中。Python标准内建的所有类型都支持迭代,还有很多支持它的类也是标准库的一部分。下面的例子展示典型的在序列(如list、tuple、dictionary、set等)上的隐式迭代: for value in sequence: Python字典(某种形式的关联数组),在字典返回了键(key)的时候,可以直接在其上进行迭代: for key in dictionary: 或者在字典codice_12方法产生元组形式的对应键-值对的时候,在其上进行迭代:  for key, value in dictionary.items(): 但是迭代器也可以被显式的使用和定义。对于一个可迭代的序列类型或类,内建的函数codice_13可用来建立一个迭代对象。接着可以通过codice_9函数对这个迭代对象进行迭代;这个函数在内部使用codice_15方法,它返回这个容器中的下一个元素。(前面的叙述适用于Python 3.x,在Python 2.x中要使用等价的codice_9方法。)当没有元素剩余的时候,引发codice_17异常。下面的例子展示与前例等价的使用显式迭代器的在序列上的迭代:  it = iter(sequence) while True: 任何用户定义的类都可以通过定义返回迭代器对象的codice_18方法,支持标准迭代(无论隐式还是显式)。接着迭代器对象需要定义返回下一个元素的codice_15方法。  Python生成器实现了这个迭代。
title: Ruby.
content: Ruby程序员可以用yield关键字定义迭代器,又将迭代器和生成器分开。  0..42.each do |n| end ...以及...  for n in 0..42 end
title: 参见.
content: C♯

Summary: 迭代器(英语:iterator),是确使用户可在容器物件(英语:container,例如链表或阵列)上遍访的对象,设计人员使用此接口无需关心容器物件的内存分配的实现细节。其行为很像数据库技术中的光标(英语:cursor),迭代器最早出现在1974年设计的CLU编程语言中。

Iterator: Der Begriff Iterator stammt aus dem Bereich der Softwareentwicklung und bezeichnet einen Zeiger, mit dem die Elemente einer Menge durchlaufen werden können (z. B. eine Liste). Der Begriff leitet sich aus der mathematischen Methode der Iteration ab. Der Iterator wird insbesondere im Bereich der Datenbanken meist Cursor genannt.