跳转到内容

迭代器:修订间差异

维基百科,自由的百科全书
删除的内容 添加的内容
Tang891228留言 | 贡献
調整格式
第45行: 第45行:
System.out.println(iter.next());
System.out.println(iter.next());
</source>
</source>
=== [[Python]]===
===Python===
在Python中,迭代器是遵循''迭代協議''的对象。使用<code>iter()</code>從任何序列对象中得到迭代器(如list, tuple, dictionary, set等)。另一種形式的输入迭代器是generator。
[[Python]]中,迭代器是遵循''迭代協議''的对象。使用<code>iter()</code>從任何序列对象中得到迭代器(如list, tuple, dictionary, set等)。另一種形式的输入迭代器是generator。


要使得迭代器指向下一個元素,則使用成員函数next()(Python 2)或函數next()(Python 3)。當沒有元素時,則引發<code>StopIteration</code>异常。若要實现迭代器,則需要在类中定义<code>next()</code>(Python 2)或<code>__next__()</code>(Python 3)。
要使得迭代器指向下一個元素,則使用成員函数next()(Python 2)或函數next()(Python 3)。當沒有元素時,則引發<code>StopIteration</code>异常。若要實现迭代器,則需要在类中定义<code>next()</code>(Python 2)或<code>__next__()</code>(Python 3)。

2020年1月17日 (五) 02:52的版本

迭代器iterator)有時又稱游標cursor)是程式設計的软件设计模式,可在容器物件(container,例如鏈表陣列)上遍訪的介面,設計人員無需關心容器物件的内存分配的实现细节。

各種語言實作迭代器的方式皆不盡同,有些物件導向語言像Java, C#, Ruby, Python, Delphi都已將迭代器的特性內建語言當中,完美的跟語言整合,我們稱之隱式迭代器(implicit iterator),但像是C++語言本身就沒有迭代器的特色,但STL仍利用模板實作了功能強大的迭代器。STL容器的數據的內存地址可能會重新分配(reallocate),與容器綁定的迭代器仍然可以定位到重新分配後的正確的內存地址。

迭代器另一方面還可以整合生成器(generator)。有些語言將二者視為同一介面,有些語言如JavaScript[1]則將之獨立化。

範例

C♯

一種新形式的迭代器它提供了函數語言程式設計中的generator,使用yield return

類似於Python中使用的yield

// Method that takes an iterable input (possibly an array)
// and returns all even numbers.
public static IEnumerable<int> GetEven(IEnumerable<int> numbers)
{
    foreach(int i in numbers)
    {
        if (i % 2 == 0) yield return i;
    }
}

C++

C++STL可支持迭代器。

template<typename InputIterator>
void printall(InputIterator first, InputIterator last)
{
    for(; first != last; ++first)
    {
        std::cout << *first << std::endl;
    }
}

Java

Java JDK 1.2 版開始支持迭代器。每一個迭代器提供next()以及hasNext()方法,同時也支持remove()。

Iterator iter = list.iterator();
//Iterator<MyType> iter = list.iterator();    in J2SE 5.0
while (iter.hasNext())
    System.out.println(iter.next());

Python

Python中,迭代器是遵循迭代協議的对象。使用iter()從任何序列对象中得到迭代器(如list, tuple, dictionary, set等)。另一種形式的输入迭代器是generator。

要使得迭代器指向下一個元素,則使用成員函数next()(Python 2)或函數next()(Python 3)。當沒有元素時,則引發StopIteration异常。若要實现迭代器,則需要在类中定义next()(Python 2)或__next__()(Python 3)。

以下為兩個例子:

# 從序列得到
x = [42, "test", -12.34]
it = iter(x)
try:
  while True:
    x = next (it) # 在Python 2中,要改成it.next()
    print(x)
except StopIteration:
  pass

# generator
def foo(n):
  for i in range(n):
    yield i

it = foo(5)
try:
  while True:
    x = next(it) # 在Python 2中,要改成it.next()
    print(x)
except StopIteration:
  pass

Ruby

Ruby程序員可以用yield關鍵字定義迭代器,又將迭代器和生成器分开。

0..42.each do |n|
 puts n
end

...以及...

for n in 0..42
 puts n
end

參見

C♯

外部連結

  1. ^ Iterators and generators. MDN Web Docs. [2018-10-16] (美国英语).