迭代器:修订间差异
Tang891228(留言 | 贡献) 小 調整格式 |
|||
第45行: | 第45行: | ||
System.out.println(iter.next()); |
System.out.println(iter.next()); |
||
</source> |
</source> |
||
=== |
===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++
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
參見
外部連結
- Article "Understanding and Using Iterators" by Joshua Gatcomb
- Article "A Technique for Generic Iteration and Its Optimization" (217 KB) by Stephen M. Watt
- Overview of the Standard Template Library
- STL Iterators
- What are iterators? - Reference description
- Java interface
- Template reference
- Boost C++ Iterator Library
- PHP: Object Iteration
- ^ Iterators and generators. MDN Web Docs. [2018-10-16] (美国英语).